<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title> – Plotting</title>
    <link>/docs/motorcortex-io-tools/motorcortex-desk/plotting/</link>
    <description>Recent content in Plotting on </description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="/docs/motorcortex-io-tools/motorcortex-desk/plotting/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Adding traces</title>
      <link>/docs/motorcortex-io-tools/motorcortex-desk/plotting/add/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/motorcortex-io-tools/motorcortex-desk/plotting/add/</guid>
      <description>
        
        
        &lt;p&gt;From the &lt;strong&gt;Parameters&lt;/strong&gt; tree:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Double-click&lt;/strong&gt; a numeric leaf&lt;/td&gt;
&lt;td&gt;Add it as a trace (double-click again to remove)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Double-click&lt;/strong&gt; an array parameter&lt;/td&gt;
&lt;td&gt;Add &lt;em&gt;all&lt;/em&gt; its channels at once (again removes them all)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expand an array, then double-click a channel&lt;/td&gt;
&lt;td&gt;Add a single channel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Right-click → &lt;strong&gt;Add to plot&lt;/strong&gt; / &lt;strong&gt;Delete from plot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same as double-click&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;New traces land on axis &lt;strong&gt;y1&lt;/strong&gt; and take the next colour from the palette.&lt;/p&gt;
&lt;p&gt;Non-numeric parameters (strings, enums, byte arrays) can be read in the tree but not plotted.&lt;/p&gt;
&lt;h4 id=&#34;when-the-controller-does-not-publish-what-you-want&#34;&gt;When the controller does not publish what you want&lt;/h4&gt;
&lt;p&gt;A tracking error, a magnitude, a unit conversion: write it as an expression instead, with &lt;strong&gt;+ Custom signal&lt;/strong&gt; above
the Active tree. See
&lt;a href=&#34;/docs/motorcortex-io-tools/motorcortex-desk/custom-signals/&#34;&gt;Custom signals&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: The Active panel</title>
      <link>/docs/motorcortex-io-tools/motorcortex-desk/plotting/active/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/motorcortex-io-tools/motorcortex-desk/plotting/active/</guid>
      <description>
        
        
        &lt;figure&gt;&lt;img src=&#34;/docs/motorcortex-io-tools/motorcortex-desk/plotting/_media/active-panel.png&#34;
         alt=&#34;Active panel with the signal tree and the details pane&#34; width=&#34;800&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;Active lists everything currently plotted as a tree that mirrors the parameter paths, so twelve channels of two
parameters read as two groups rather than twelve long paths. Every row shows the trace colour, its axis badge
(&lt;code&gt;y1&lt;/code&gt;…&lt;code&gt;y4&lt;/code&gt; or &lt;code&gt;x&lt;/code&gt;) and the live value. A row whose signal is a writable controller parameter also carries its own
input, so its value can be changed without selecting it first.&lt;/p&gt;
&lt;p&gt;Hidden traces are greyed out; the x-source row is marked separately.&lt;/p&gt;
&lt;h4 id=&#34;selecting-signals&#34;&gt;Selecting signals&lt;/h4&gt;
&lt;p&gt;Selecting traces emphasises them three ways at once: they are drawn thicker on the plot, their names are bolded in
the legend, and their lines are lifted in front of the others. That is what makes one signal findable in a crowded
plot.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gesture&lt;/th&gt;
&lt;th&gt;Selection&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Click&lt;/td&gt;
&lt;td&gt;Select this signal. Clicking the only selected signal again clears the selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Click a folder row&lt;/td&gt;
&lt;td&gt;Select every signal under it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ctrl / Cmd + click&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add or remove one signal (or a whole folder)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shift + click&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Select the range between the last click and this one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Click empty space&lt;/td&gt;
&lt;td&gt;Clear the selection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The selection also drives the arrow, &lt;strong&gt;H&lt;/strong&gt; and &lt;strong&gt;Del&lt;/strong&gt; keys, and it is what the
&lt;a href=&#34;/docs/motorcortex-io-tools/motorcortex-desk/analysing/&#34;&gt;Statistics&lt;/a&gt; panel reports on. See
&lt;a href=&#34;/docs/motorcortex-io-tools/motorcortex-desk/keybindings/&#34;&gt;Keybindings&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;picking-a-trace-off-the-plot&#34;&gt;Picking a trace off the plot&lt;/h4&gt;
&lt;p&gt;The plot answers the other way round too. Hover a trace and the pointer becomes a hand, and a small card names the
parameter as &lt;code&gt;path[channel]&lt;/code&gt;, outlined in that trace&amp;rsquo;s own colour. It is the quickest way to identify a line without
reading down the list.&lt;/p&gt;
&lt;p&gt;Click it and the matching row is selected in &lt;strong&gt;Active&lt;/strong&gt;, bringing the panel forward if it sits behind another tab. A
trace counts as hovered when its nearest sample is within fifteen pixels of the pointer; a click that lands on
nothing leaves the selection as it was.&lt;/p&gt;
&lt;p&gt;Hover and picking stand down while you are capturing a
&lt;a href=&#34;/docs/motorcortex-io-tools/motorcortex-desk/measuring/&#34;&gt;measurement&lt;/a&gt;, so measuring still gets its
clicks.&lt;/p&gt;
&lt;h4 id=&#34;panel-header-buttons&#34;&gt;Panel header buttons&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Button&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Eye&lt;/td&gt;
&lt;td&gt;Hide all traces / show all traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;Remove all traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Save&lt;/td&gt;
&lt;td&gt;Save the trace list to a &lt;code&gt;traces.json&lt;/code&gt; file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load&lt;/td&gt;
&lt;td&gt;Add the traces from a &lt;code&gt;traces.json&lt;/code&gt; file to the ones already plotted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;context-menu&#34;&gt;Context menu&lt;/h4&gt;
&lt;figure&gt;&lt;img src=&#34;/docs/motorcortex-io-tools/motorcortex-desk/plotting/_media/active-context-menu.png&#34;
         alt=&#34;Active panel context menu&#34; width=&#34;800&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;Right-click a row for:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hide from plot&lt;/strong&gt; / &lt;strong&gt;Show on plot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stop or resume drawing it, leaving it subscribed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Only show&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hide every other trace, so this one stands alone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Remove from plot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Drop it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lock&lt;/strong&gt; / &lt;strong&gt;Unlock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Force the parameter at its current value, or release it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copy full path&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Copy the &lt;code&gt;root/…&lt;/code&gt; path to the clipboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copy value&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Copy the current value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On a folder row the action applies to every signal underneath it, and the labels say so: &lt;strong&gt;Hide all from plot&lt;/strong&gt;,
&lt;strong&gt;Only show these&lt;/strong&gt;, &lt;strong&gt;Remove all from plot&lt;/strong&gt;. &lt;strong&gt;Lock&lt;/strong&gt; appears only for a single writable controller parameter, so
not on folders, custom signals, or a path the tree does not know. &lt;strong&gt;Copy value&lt;/strong&gt; is a leaf action only.&lt;/p&gt;
&lt;p&gt;The same menu is available on the rows of the plot
&lt;a href=&#34;/docs/motorcortex-io-tools/motorcortex-desk/navigating-the-plot/&#34;&gt;legend&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: The details pane</title>
      <link>/docs/motorcortex-io-tools/motorcortex-desk/plotting/details/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/motorcortex-io-tools/motorcortex-desk/plotting/details/</guid>
      <description>
        
        
        &lt;p&gt;The pane at the bottom of Active acts on whatever is selected.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/docs/motorcortex-io-tools/motorcortex-desk/plotting/_media/active-details.png&#34;
         alt=&#34;Details pane of a single trace&#34; width=&#34;800&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Colour swatch&lt;/td&gt;
&lt;td&gt;Pick the trace colour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Path&lt;/td&gt;
&lt;td&gt;Full path with channel index; the copy button copies it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value input&lt;/td&gt;
&lt;td&gt;Write a value to this parameter (math expressions allowed, &lt;strong&gt;Enter&lt;/strong&gt; to apply)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Axis dropdown&lt;/td&gt;
&lt;td&gt;Move the trace to &lt;code&gt;y1&lt;/code&gt;–&lt;code&gt;y4&lt;/code&gt;, or make it the &lt;code&gt;x&lt;/code&gt; source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eye&lt;/td&gt;
&lt;td&gt;Hide or show the trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lock&lt;/td&gt;
&lt;td&gt;Force the parameter at a value, or release it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;Remove the trace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A writable signal also carries a write input on its own row in the list, so a quick change does not need the row
selected first. Both write the same way.&lt;/p&gt;
&lt;h4 id=&#34;acting-on-several-traces-at-once&#34;&gt;Acting on several traces at once&lt;/h4&gt;
&lt;p&gt;With more than one signal selected the pane shows &lt;code&gt;N traces selected&lt;/code&gt; and applies the axis, hide, lock and remove
actions to all of them together, which is how you move a whole parameter&amp;rsquo;s channels to another axis in one go.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/docs/motorcortex-io-tools/motorcortex-desk/plotting/_media/active-multiselect.png&#34;
         alt=&#34;Several signals selected at once&#34; width=&#34;800&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;what-hiding-actually-does&#34;&gt;What hiding actually does&lt;/h4&gt;
&lt;p&gt;A hidden trace stays subscribed. It keeps receiving data and can be revealed later without a gap in its history, but
it is not drawn, and it is left out of
&lt;a href=&#34;/docs/motorcortex-io-tools/motorcortex-desk/exporting/&#34;&gt;CSV export&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use it to park a signal you want to keep recording but not look at.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Y axes and XY mode</title>
      <link>/docs/motorcortex-io-tools/motorcortex-desk/plotting/axes/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/motorcortex-io-tools/motorcortex-desk/plotting/axes/</guid>
      <description>
        
        
        &lt;h4 id=&#34;four-y-axes&#34;&gt;Four Y axes&lt;/h4&gt;
&lt;p&gt;Each trace sits on one of four independent Y axes, &lt;code&gt;y1&lt;/code&gt;–&lt;code&gt;y4&lt;/code&gt;. An axis appears as soon as a trace is assigned to it
and disappears when its last trace is removed, and each one auto-scales to the traces on it.&lt;/p&gt;
&lt;p&gt;Group traces by &lt;strong&gt;physical unit&lt;/strong&gt;: signals sharing a unit belong on the same axis, and a different unit or a very
different magnitude belongs on another. Otherwise the larger signal squashes the smaller one flat.&lt;/p&gt;
&lt;p&gt;Keep an actual and its target on the &lt;em&gt;same&lt;/em&gt; axis, though: they share a unit, and overlaying them is the whole point
of plotting them together.&lt;/p&gt;



 
 






&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Tip&lt;/h4&gt;
 &lt;p&gt;A six-element pose is two units in one parameter: elements 0-2 are metres and 3-5 are radians. Add those channel by channel onto two axes rather than adding the whole array at once.&lt;/p&gt;
&lt;/div&gt;


&lt;h4 id=&#34;xy-mode&#34;&gt;XY mode&lt;/h4&gt;
&lt;p&gt;Set a trace&amp;rsquo;s axis to &lt;strong&gt;x&lt;/strong&gt; and the plot switches from time to XY: that signal becomes the horizontal axis and every
other trace is drawn against it: actual versus commanded position, or a tool path in a plane.&lt;/p&gt;
&lt;p&gt;The x-source trace itself is not drawn, so it has no colour and no eye button. Only one signal can be the x source,
and it has to be a single channel rather than a whole array.&lt;/p&gt;
&lt;p&gt;Set its axis back to &lt;code&gt;y1&lt;/code&gt;–&lt;code&gt;y4&lt;/code&gt; to return to time mode.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Saving a trace set</title>
      <link>/docs/motorcortex-io-tools/motorcortex-desk/plotting/saving/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/motorcortex-io-tools/motorcortex-desk/plotting/saving/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Save&lt;/strong&gt; in the Active panel header writes the current signals to a &lt;code&gt;traces.json&lt;/code&gt; file: path, channel, colour, axis
and hidden flag for each, plus any
&lt;a href=&#34;/docs/motorcortex-io-tools/motorcortex-desk/custom-signals/&#34;&gt;custom signals&lt;/a&gt; and the inputs
they pulled in.&lt;/p&gt;
&lt;p&gt;The browser&amp;rsquo;s own Save dialog opens so the file lands next to the run it describes rather than under one fixed name
in the download folder. The set is copied to the clipboard as well, ready to paste into an issue or a message.&lt;/p&gt;
&lt;h4 id=&#34;loading-adds-it-does-not-replace&#34;&gt;Loading adds, it does not replace&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Load&lt;/strong&gt; adds the file&amp;rsquo;s traces to whatever is already plotted and resubscribes them. Signals already on screen are
left alone: they keep their colour and axis, and the file does not restyle them.&lt;/p&gt;
&lt;p&gt;That makes a saved set a building block: two of them together, or one on top of what you are watching now. To
start from nothing instead, click &lt;strong&gt;✕&lt;/strong&gt; (remove all) first.&lt;/p&gt;
&lt;h4 id=&#34;paths-that-are-not-on-this-controller&#34;&gt;Paths that are not on this controller&lt;/h4&gt;
&lt;p&gt;What happens depends on whether there is a controller to ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connected&lt;/strong&gt;: paths that do not exist here are dropped as the file loads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disconnected&lt;/strong&gt;: everything is kept, and pruned at the next connect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So a trace set built against one machine can be loaded offline and will sort itself out when you reach a controller
that has those signals.&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
