{"id":17720310,"url":"https://github.com/dkogan/feedgnuplot","last_synced_at":"2025-05-16T14:07:24.415Z","repository":{"id":765778,"uuid":"443380","full_name":"dkogan/feedgnuplot","owner":"dkogan","description":"Tool to plot realtime and stored data from the commandline, using gnuplot.","archived":false,"fork":false,"pushed_at":"2024-02-20T05:38:59.000Z","size":1452,"stargazers_count":707,"open_issues_count":4,"forks_count":37,"subscribers_count":24,"default_branch":"master","last_synced_at":"2024-10-22T22:11:05.301Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dkogan.png","metadata":{"files":{"readme":"README.pod","changelog":"Changes","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2009-12-20T03:19:08.000Z","updated_at":"2024-10-01T10:40:06.000Z","dependencies_parsed_at":"2024-02-20T05:46:36.770Z","dependency_job_id":null,"html_url":"https://github.com/dkogan/feedgnuplot","commit_stats":{"total_commits":533,"total_committers":6,"mean_commits":88.83333333333333,"dds":"0.39212007504690427","last_synced_commit":"db4fdcb9331e0b4783fd8b2842dc77913db35b73"},"previous_names":[],"tags_count":79,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkogan%2Ffeedgnuplot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkogan%2Ffeedgnuplot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkogan%2Ffeedgnuplot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dkogan%2Ffeedgnuplot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dkogan","download_url":"https://codeload.github.com/dkogan/feedgnuplot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254544146,"owners_count":22088807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-25T15:26:40.437Z","updated_at":"2025-05-16T14:07:24.391Z","avatar_url":"https://github.com/dkogan.png","language":"Perl","funding_links":[],"categories":["Perl"],"sub_categories":[],"readme":"=head1 TALK\n\nI just gave a talk about this at L\u003cSCaLE\n17x|https://www.socallinuxexpo.org/scale/17x\u003e. Here are the L\u003cvideo of the\ntalk|https://www.youtube.com/watch?v=Qvb_uNkFGNQ\u0026t=12830s\u003e and the\nL\u003c\"slides\"|https://github.com/dkogan/talk-feedgnuplot-vnlog/blob/master/feedgnuplot-vnlog.org\u003e.\n\n=head1 NAME\n\nfeedgnuplot - General purpose pipe-oriented plotting tool\n\n=head1 SYNOPSIS\n\nSimple plotting of piped data:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}'\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' |\n   feedgnuplot               \\\n     --lines                 \\\n     --points                \\\n     --title \"Test plot\"     \\\n     --y2 1                  \\\n     --unset key             \\\n     --unset grid\n\n=for html \u003cp\u003e\u003cimg src=\"documentation-header-plot.svg\"\u003e\n\nSimple real-time plotting example: plot how much data is received on the wlan0\nnetwork interface in bytes/second. This plot updates at 1Hz, and shows the last\n10sec of history. The plot shown here is the final state of a sample run\n\n $ while true; do\n     sleep 1;\n     cat /proc/net/dev;\n   done \\\n   | gawk '/wlan0/ {if(b) {print $2-b; N++; fflush()} b=$2} N==15 {exit}' \\\n   | feedgnuplot            \\\n       --lines              \\\n       --title \"wlan0 throughput\" \\\n       --stream             \\\n       --xlen 10            \\\n       --ylabel 'Bytes/sec' \\\n       --xlabel seconds     \\\n       --unset key          \\\n       --unset grid\n\n=for html \u003cp\u003e\u003cimg src=\"documentation-header-network-throughput-plot.svg\"\u003e\n\n=head1 DESCRIPTION\n\nThis is a flexible, command-line-oriented frontend to Gnuplot. It creates plots\nfrom data coming in on STDIN or given in a filename passed on the commandline.\nVarious data representations are supported, as is hardcopy output and streaming\ndisplay of live data. For a tutorial and a gallery please see the guide at\nL\u003chttps://github.com/dkogan/feedgnuplot/blob/master/guide/guide.org\u003e\n\nA simple example:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' | feedgnuplot\n\nYou should see a plot with two curves. The C\u003cawk\u003e command generates some data to\nplot and the C\u003cfeedgnuplot\u003e reads it in from STDIN and generates the plot. The\nC\u003cawk\u003e invocation is just an example; more interesting things would be plotted\nin normal usage. No commandline-options are required for the most basic\nplotting. Input parsing is flexible; every line need not have the same number of\npoints. New curves will be created as needed.\n\nThe most commonly used functionality of gnuplot is supported directly by the\nscript. Anything not directly supported can still be done with options such as\nC\u003c--set\u003e, C\u003c--cmds\u003e C\u003c--style\u003e, etc. Arbitrary gnuplot commands can be passed in\nwith C\u003c--cmds\u003e. For example, to turn off the grid, you can pass in C\u003c--cmds\n'unset grid'\u003e. Commands C\u003c--set\u003e and C\u003c--unset\u003e exists to provide nicer syntax,\nso this is equivalent to passing C\u003c--unset grid\u003e. As many of these options as\nneeded can be passed in. To add arbitrary curve styles, use C\u003c--style curveID\nextrastyle\u003e. Pass these more than once to affect more than one curve.\n\nTo apply an extra style to I\u003call\u003e the curves that lack an explicit C\u003c--style\u003e,\npass in C\u003c--styleall extrastyle\u003e. In the most common case, the extra style is\nC\u003cwith something\u003e. To support this more simply, you can pass in C\u003c--with\nsomething\u003e instead of C\u003c--styleall 'with something'\u003e. C\u003c--styleall\u003e and\nC\u003c--with\u003e are mutually exclusive. Furthermore any curve-specific C\u003c--style\u003e\noverrides the global C\u003c--styleall\u003e or C\u003c--with\u003e setting.\n\n=head2 Data formats\n\nBy default, each value present in the incoming data represents a distinct data\npoint, as demonstrated in the original example above (we had 10 numbers in the\ninput and 10 points in the plot). If requested, the script supports more\nsophisticated interpretation of input data\n\n=head3 Domain selection\n\nIf C\u003c--domain\u003e is passed in, the first value on each line of input is\ninterpreted as the I\u003cX\u003e-value for the rest of the data on that line. Without\nC\u003c--domain\u003e the I\u003cX\u003e-value is the line number, and the first value on a line is\na plain data point like the others. Default is C\u003c--nodomain\u003e. Thus the original\nexample above produces 2 curves, with B\u003c1,2,3,4,5\u003e as the I\u003cX\u003e-values. If we run\nthe same command with C\u003c--domain\u003e:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' | feedgnuplot --domain\n\nwe get only 1 curve, with B\u003c2,4,6,8,10\u003e as the I\u003cX\u003e-values. As many points as\ndesired can appear on a single line, but all points on a line are associated\nwith the I\u003cX\u003e-value at the start of that line.\n\n=head3 Curve indexing\n\nWe index the curves in one of 3 ways: sequentially, explicitly with a\nC\u003c--dataid\u003e or by C\u003c--vnlog\u003e headers.\n\nBy default, each column represents a separate curve. The first column (after any\ndomain) is curve C\u003c0\u003e. The next one is curve C\u003c1\u003e and so on. This is fine unless\nsparse data is to be plotted. With the C\u003c--dataid\u003e option, each point is\nrepresented by 2 values: a string identifying the curve, and the value itself.\nIf we add C\u003c--dataid\u003e to the original example:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' | feedgnuplot --dataid --autolegend\n\nwe get 5 different curves with one point in each. The first column, as produced\nby C\u003cawk\u003e, is B\u003c2,4,6,8,10\u003e. These are interpreted as the IDs of the curves to\nbe plotted.\n\nIf we're plotting C\u003cvnlog\u003e data (L\u003chttps://www.github.com/dkogan/vnlog\u003e) then we\ncan get the curve IDs from the vnlog header. Vnlog is a trivial data format\nwhere lines starting with C\u003c#\u003e are comments and the first comment contains\ncolumn labels. If we have such data, C\u003cfeedgnuplot --vnlog\u003e can interpret these\ncolumn labels if the C\u003cvnlog\u003e perl modules are available.\n\nThe C\u003c--autolegend\u003e option adds a legend using the given IDs to\nlabel the curves. The IDs need not be numbers; generic strings are accepted. As\nmany points as desired can appear on a single line. C\u003c--domain\u003e can be used in\nconjunction with C\u003c--dataid\u003e or C\u003c--vnlog\u003e.\n\n=head3 Multi-value style support\n\nDepending on how gnuplot is plotting the data, more than one value may be needed\nto represent the range of a single point. Basic 2D plots have 2 numbers\nrepresenting each point: 1 domain and 1 range. But if plotting with\nC\u003c--circles\u003e, for instance, then there's an extra range value: the radius. Many\nother gnuplot styles require more data: errorbars, variable colors (C\u003cwith\npoints palette\u003e), variable sizes (C\u003cwith points ps variable\u003e), labels and so on.\nThe feedgnuplot tool itself does not know about all these intricacies, but they\ncan still be used, by specifying the specific style with C\u003c--style\u003e, and\nspecifying how many values are needed for each point with any of\nC\u003c--rangesizeall\u003e, C\u003c--tuplesizeall\u003e, C\u003c--rangesize\u003e, C\u003c--tuplesize\u003e. These\noptions are required I\u003conly\u003e for styles not explicitly supported by feedgnuplot;\nsupported styles do the right thing automatically.\n\nSpecific example: if making a 2d plot of y error bars, the exact format can be\nqueried by running C\u003cgnuplot\u003e and invoking C\u003chelp yerrorbars\u003e. This tells us\nthat there's a 3-column form: C\u003cx y ydelta\u003e and a 4-column form: C\u003cx y ylow\nyhigh\u003e. With 2d plots feedgnuplot will always output the 1-value domain C\u003cx\u003e, so\nthe rangesize is 2 and 3 respectively. Thus the following are equivalent:\n\n $ echo '1 2 0.3\n         2 3 0.4\n         3 4 0.5' | feedgnuplot --domain --rangesizeall 2 --with 'yerrorbars'\n\n $ echo '1 2 0.3\n         2 3 0.4\n         3 4 0.5' | feedgnuplot --domain --tuplesizeall 3 --with 'yerrorbars'\n\n $ echo '1 2 1.7 2.3\n         2 3 2.6 3.4\n         3 4 3.5 4.5' | feedgnuplot --domain --rangesizeall 3 --with 'yerrorbars'\n\n=head3 3D data\n\nTo plot 3D data, pass in C\u003c--3d\u003e. C\u003c--domain\u003e MUST be given when plotting 3D\ndata to avoid domain ambiguity. If 3D data is being plotted, there are by\ndefinition 2 domain values instead of one (I\u003cZ\u003e as a function of I\u003cX\u003e and I\u003cY\u003e\ninstead of I\u003cY\u003e as a function of I\u003cX\u003e). Thus the first 2 values on each line are\ninterpreted as the domain instead of just 1. The rest of the processing happens\nthe same way as before.\n\n=head3 Time/date data\n\nIf the input data domain is a time/date, this can be interpreted with\nC\u003c--timefmt\u003e. This option takes a single argument: the format to use to parse\nthe data. The format is documented in 'set timefmt' in gnuplot, although the\ncommon flags that C\u003cstrftime\u003e understands are generally supported. The backslash\nsequences in the format are I\u003cnot\u003e supported, so if you want a tab, put in a tab\ninstead of \\t. Whitespace in the format I\u003cis\u003e supported. When this flag is\ngiven, some other options act a little bit differently:\n\n=over\n\n=item\n\nC\u003c--xlen\u003e and C\u003c--binwidth\u003e are I\u003cintegers\u003e in seconds\n\n=item\n\nC\u003c--xmin\u003e and C\u003c--xmax\u003e I\u003cmust\u003e use the format passed in to C\u003c--timefmt\u003e\n\n=back\n\nUsing this option changes both the way the input is parsed I\u003cand\u003e the way the\nx-axis tics are labelled. Gnuplot tries to be intelligent in this labelling, but\nit doesn't always do what the user wants. The labelling can be controlled with\nthe gnuplot C\u003cset format\u003e command, which takes the same type of format string as\nC\u003c--timefmt\u003e. Example:\n\n $ sar 1 -1 |\n   awk '$1 ~ /..:..:../ \u0026\u0026 $8 ~/^[0-9\\.]*$/ {print $1,$8; fflush()}' |\n   feedgnuplot --stream --domain\n                --lines --timefmt '%H:%M:%S'\n                --set 'format x \"%H:%M:%S\"'\n\nThis plots the 'idle' CPU consumption against time.\n\nNote that while gnuplot supports the time/date on any axis, I\u003cfeedgnuplot\u003e\ncurrently supports it I\u003conly\u003e as the x-axis domain. This may change in the\nfuture.\n\n=head3 'using' expressions\n\nWe just described how feedgnuplot parses its input data. When passing this data\nto gnuplot, each curve is sent independently. The domain appears in the leading\ncolumns followed by C\u003c--rangesize\u003e columns to complete each row. Without\nC\u003c--domain\u003e, feedgnuplot explicitly writes out sequential integers. gnuplot then\nknows how many values it has for each point, and it knows which style we're\nusing, so it's able to interpret the data appropriately, and to make the correct\nplot.\n\nAs an example, if gnuplot is passed 2 columns of data, and it is plotting C\u003cwith\npoints\u003e, it will use column 1 for the x coordinate and column 2 for the y\ncoordinate. This is the default behavior, but the meaning of each column can be\ncontrolled via a C\u003cusing\u003e expression in gnuplot (not feedgnuplot; keep reading).\nThe default is sequential integers, so this example uses C\u003cusing 1:2\u003e by\ndefault. We can flip the meaning of the columns by passing C\u003cusing 2:1\u003e.\nArbitrary expressions may be specified by enclosing each field in C\u003c()\u003e, and\nusing C\u003c$\u003e to denote each data column. So to use the 2nd column as the x\ncoordinate and the sum of the two columns as the y coordinate, C\u003cusing\n2:($1+$2)\u003e is passed. Furthermore, the number of columns can vary. For instance\ngnuplot can read the same two columns of data, but produce a plot with the extra\ncolumn encoding the sum as the color: C\u003cusing 1:2:($1+$2) with points palette\u003e.\nPlease see the gnuplot documentation for lots of detail.\n\nThat's how I\u003cgnuplot\u003e works. Most of the time, I\u003cfeedgnuplot\u003e doesn't pass any\nC\u003cusing\u003e expressions at all, and gnuplot does the default thing. But if we want\nto do something fancy, feedgnuplot supports C\u003c--using curveID expression\u003e and\nC\u003c--usingall expression\u003e. So we can plot a parabola:\n\n  seq 100 | feedgnuplot --lines --usingall '1:($2*$2)'\n\nThis is powerful, but there are some things to keep in mind:\n\n=over\n\n=item\n\nC\u003c--using\u003e overrides whatever C\u003cusing\u003e expression feedgnuplot was going to pass.\nfeedgnuplot passes a C\u003cusing\u003e expression only if C\u003c--histogram\u003e or C\u003c--timefmt\u003e\nor C\u003c--xticlabels\u003e are given. So if C\u003c--using\u003e is given together with any of\nthese, the user must take care to do the right thing (whatever that means at\nthat time).\n\n=item\n\nThe C\u003c--tuplesize\u003e controls the data passed to feedgnuplot and the data then\npassed to gnuplot. It does I\u003cnot\u003e directly control how gnuplot eventually\ninterprets the data: C\u003c--using\u003e does that. So for instance we can plot\ncolor-coded points:\n\n  seq 10 | feedgnuplot --with 'points pt 7 palette' --usingall '1:2:2'\n\nHere feedgnuplot read 1 column of data. It defauled to C\u003c--tuplesize 2\u003e, so it\npassed 2 columns of data to gnuplot. gnuplot then produced 3 values for each\npoint, and plotted them as indicated with the C\u003cpoints palette\u003e style.\n\n=item\n\nYou I\u003calways\u003e need a column of data to generate a curve. You might want to use a\nC\u003cusing\u003e expression to plot a time series I\u003cand\u003e its cumulative integral. The\nC\u003cusing\u003e expression can compute the integral, but you I\u003cmust\u003e pass in the data\ntwice; once for each curve to plot:\n\n  seq 100 |                           \\\n    awk '{print $1,$1}' |             \\\n    feedgnuplot                       \\\n      --cmds 'sum=0'                  \\\n      --cmds 'accum(x) = (sum=sum+x)' \\\n      --using 1 '1:(accum($2))'       \\\n      --lines --y2 1\n\n=back\n\n=head2 Real-time streaming data\n\nTo plot real-time data, pass in the C\u003c--stream [refreshperiod]\u003e option. Data\nwill then be plotted as it is received. The plot will be updated every\nC\u003crefreshperiod\u003e seconds. If the period isn't specified, a 1Hz refresh rate is\nused. To refresh at specific intervals indicated by the data, set the\nrefreshperiod to 0 or to 'trigger'. The plot will then I\u003conly\u003e be refreshed when\na data line 'replot' is received. This 'replot' command works in both triggered\nand timed modes, but in triggered mode, it's the only way to replot. Look in\nL\u003c/\"Special data commands\"\u003e for more information.\n\nTo plot only the most recent data (instead of I\u003call\u003e the data), C\u003c--xlen\nwindowsize\u003e can be given. This will create an constantly-updating, scrolling\nview of the recent past. C\u003cwindowsize\u003e should be replaced by the desired length\nof the domain window to plot, in domain units (passed-in values if C\u003c--domain\u003e\nor line numbers otherwise). If the domain is a time/date via C\u003c--timefmt\u003e, then\nC\u003cwindowsize\u003e is and I\u003cinteger\u003e in seconds. If we're plotting a histogram, then\nC\u003c--xlen\u003e causes a histogram over a moving window to be computed. The subtlely\nhere is that with a histogram you don't actually I\u003csee\u003e the domain since only\nthe range is analyzed. But the domain is still there, and can be utilized with\nC\u003c--xlen\u003e. With C\u003c--xlen\u003e we can plot I\u003conly\u003e histograms or I\u003conly\u003e\nI\u003cnon\u003e-histograms.\n\n=head3 Special data commands\n\nIf we are reading streaming data, the input stream can contain special commands\nin addition to the raw data. Feedgnuplot looks for these at the start of every\ninput line. If a command is detected, the rest of the line is discarded. These\ncommands are\n\n=over\n\n=item C\u003creplot\u003e\n\nThis command refreshes the plot right now, instead of waiting for the next\nrefresh time indicated by the timer. This command works in addition to the timed\nrefresh, as indicated by C\u003c--stream [refreshperiod]\u003e.\n\n=item C\u003cclear\u003e\n\nThis command clears out the current data in the plot. The plotting process\ncontinues, however, to any data following the C\u003cclear\u003e.\n\n=item C\u003cexit\u003e\n\nThis command causes feedgnuplot to exit.\n\n=back\n\n=head2 Hardcopy output\n\nThe script is able to produce hardcopy output with C\u003c--hardcopy outputfile\u003e. The\noutput type can be inferred from the filename, if B\u003c.ps\u003e, B\u003c.eps\u003e, B\u003c.pdf\u003e,\nB\u003c.svg\u003e, B\u003c.png\u003e or B\u003c.gp\u003e is requested. If any other file type is requested,\nC\u003c--terminal\u003e I\u003cmust\u003e be passed in to tell gnuplot how to make the plot. If\nC\u003c--terminal\u003e is passed in, then the C\u003c--hardcopy\u003e argument only provides the\noutput filename.\n\nThe B\u003c.gp\u003e output is special. Instead of asking gnuplot to plot to a particular\nterminal, writing to a B\u003c.gp\u003e simply dumps a self-executable gnuplot script into\nthe given file. This is similar to what C\u003c--dump\u003e does, but writes to a file,\nand makes sure that the file can be self-executing.\n\n=head2 Self-plotting data files\n\nThis script can be used to enable self-plotting data files. There are several\nways of doing this: with a shebang (#!) or with inline perl data.\n\n=head3 Self-plotting data with a #!\n\nA self-plotting, executable data file C\u003cdata\u003e is formatted as\n\n $ cat data\n #!/usr/bin/feedgnuplot --lines --points\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n 12 36\n 14 49\n 16 64\n 18 81\n 20 100\n 22 121\n 24 144\n 26 169\n 28 196\n 30 225\n\nThis is the shebang (#!) line followed by the data, formatted as before. The\ndata file can be plotted simply with\n\n $ ./data\n\nThe caveats here are that on Linux the whole #! line is limited to 127\ncharacters and that the full path to feedgnuplot must be given. The 127\ncharacter limit is a serious limitation, but this can likely be resolved with a\nkernel patch. I have only tried on Linux 2.6.\n\n=head3 Self-plotting data with gnuplot\n\nRunning C\u003cfeedgnuplot --hardcopy plotdata.gp ....\u003e will create a self-executable\ngnuplot script in C\u003cplotdata.gp\u003e\n\n=head3 Self-plotting data with perl inline data\n\nPerl supports storing data and code in the same file. This can also be used to\ncreate self-plotting files:\n\n $ cat plotdata.pl\n #!/usr/bin/perl\n use strict;\n use warnings;\n\n open PLOT, \"| feedgnuplot --lines --points\" or die \"Couldn't open plotting pipe\";\n while( \u003cDATA\u003e )\n {\n   my @xy = split;\n   print PLOT \"@xy\\n\";\n }\n __DATA__\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n 12 36\n 14 49\n 16 64\n 18 81\n 20 100\n 22 121\n 24 144\n 26 169\n 28 196\n 30 225\n\nThis is especially useful if the logged data is not in a format directly\nsupported by feedgnuplot. Raw data can be stored after the __DATA__ directive,\nwith a small perl script to manipulate the data into a useable format and send\nit to the plotter.\n\n=head1 ARGUMENTS\n\n=over\n\n=item\n\n--C\u003c[no]domain\u003e\n\nIf enabled, the first element of each line is the domain variable. If not, the\npoint index is used\n\n=item\n\n--C\u003c[no]dataid\u003e\n\nIf enabled, each data point is preceded by the ID of the data set that point\ncorresponds to. This ID is interpreted as a string, NOT as just a number. If not\nenabled, the order of the point is used.\n\nAs an example, if line 3 of the input is \"0 9 1 20\" then\n\n=over\n\n=item\n\nC\u003c--nodomain --nodataid\u003e would parse the 4 numbers as points in 4 different\ncurves at x=3\n\n=item\n\nC\u003c--domain --nodataid\u003e would parse the 4 numbers as points in 3 different\ncurves at x=0. Here, 0 is the x-variable and 9,1,20 are the data values\n\n=item\n\nC\u003c--nodomain --dataid\u003e would parse the 4 numbers as points in 2 different\ncurves at x=3. Here 0 and 1 are the data IDs and 9 and 20 are the\ndata values\n\n=item\n\nC\u003c--domain --dataid\u003e would parse the 4 numbers as a single point at\nx=0. Here 9 is the data ID and 1 is the data value. 20 is an extra\nvalue, so it is ignored. If another value followed 20, we'd get another\npoint in curve ID 20\n\n=back\n\n=item\n\nC\u003c--vnlog\u003e\n\nVnlog is a trivial data format where lines starting with C\u003c#\u003e are comments and\nthe first comment contains column labels. Some tools for working with such data\nare available from the C\u003cvnlog\u003e project: L\u003chttps://www.github.com/dkogan/vnlog\u003e.\nWith the C\u003cvnlog\u003e perl modules installed, we can read the vnlog column headers\nwith C\u003cfeedgnuplot --vnlog\u003e. This replaces C\u003c--dataid\u003e, and we can do all the\nnormal things with these headers. For instance C\u003cfeedgnuplot --vnlog\n--autolegend\u003e will generate plot legends for each column in the vnlog, using the\nvnlog column label in the legend.\n\n=item\n\nC\u003c--[no]3d\u003e\n\nDo [not] plot in 3D. This only makes sense with C\u003c--domain\u003e. Each domain here is\nan (x,y) tuple\n\n=item\n\n--C\u003ctimefmt [format]\u003e\n\nInterpret the X data as a time/date, parsed with the given format\n\n=item\n\nC\u003c--colormap\u003e\n\nThis is a legacy option used to who a colormapped xy plot. It does:\n\n- Adds C\u003cpalette\u003e to C\u003c--curvestyleall\u003e\n\n- Adds 1 to the default C\u003c--tuplesize\u003e (if C\u003c--tuplesizeall\u003e is not given\n\n- Uses C\u003c--zmin\u003e, C\u003c--zmax\u003e to set the colorbar range\n\nIt's clearer to set the relevant options explicitly, but C\u003c--colormap\u003e still\nexists for compatibility\n\n=item\n\nC\u003c--stream [period]\u003e\n\nPlot the data as it comes in, in realtime. If period is given, replot every\nperiod seconds. If no period is given, replot at 1Hz. If the period is given as\n0 or 'trigger', replot I\u003conly\u003e when the incoming data dictates this. See the\nL\u003c/\"Real-time streaming data\"\u003e section of the man page.\n\n=item\n\nC\u003c--[no]lines\u003e\n\nDo [not] draw lines to connect consecutive points\n\n=item\n\nC\u003c--[no]points\u003e\n\nDo [not] draw points\n\n=item\n\nC\u003c--circles\u003e\n\nPlot with circles. This requires a radius be specified for each point.\nAutomatically sets the C\u003c--rangesize\u003e/C\u003c--tuplesize\u003e. C\u003cNot\u003e supported for 3d\nplots.\n\n=item\n\nC\u003c--title xxx\u003e\n\nSet the title of the plot\n\n=item\n\nC\u003c--legend curveID legend\u003e\n\nSet the label for a curve plot. Use this option multiple times for multiple\ncurves. With C\u003c--dataid\u003e, curveID is the ID. Otherwise, it's the index of the\ncurve, starting at 0\n\n=item\n\nC\u003c--autolegend\u003e\n\nUse the curve IDs for the legend. Titles given with C\u003c--legend\u003e override these\n\n=item\n\nC\u003c--xlen xxx\u003e\n\nWhen using C\u003c--stream\u003e, sets the size of the x-window to plot. Omit this or set\nit to 0 to plot ALL the data. Does not make sense with 3d plots. Implies\nC\u003c--monotonic\u003e. If we're plotting a histogram, then C\u003c--xlen\u003e causes a histogram\nover a moving window to be computed. The subtlely here is that with a histogram\nyou don't actually I\u003csee\u003e the domain since only the range is analyzed. But the\ndomain is still there, and can be utilized with C\u003c--xlen\u003e. With C\u003c--xlen\u003e we can\nplot I\u003conly\u003e histograms or I\u003conly\u003e I\u003cnon\u003e-histograms.\n\n\n=item\n\nC\u003c--xmin/xmax/x2min/x2max/ymin/ymax/y2min/y2max/zmin/zmax xxx\u003e\n\nSet the range for the given axis. These x-axis bounds are ignored in a streaming\nplot. The x2/y2-axis bounds do not apply in 3d plots. The z-axis bounds apply\nI\u003conly\u003e to 3d plots or colormaps. Note that there is no C\u003c--xrange\u003e to set both\nsides at once or C\u003c--xinv\u003e to flip the axis around: anything more than the\nbasics supported in this option is clearly obtainable by talking to gnuplot, for\ninstance C\u003c--set 'xrange [20:10]'\u003e to set the given inverted bounds.\n\n=item\n\nC\u003c--xlabel/x2label/ylabel/y2label/zlabel/cblabel xxx\u003e\n\nLabel the given axis. The x2/y2-axis labels do not apply to 3d plots while the\nz-axis label applies I\u003conly\u003e to 3d plots. The \"cblabel\" applies to the colorbar,\nif there is one.\n\n=item\n\nC\u003c--x2/--y2/--x1y2/--x2y1/--x2y2 xxx\u003e\n\nBy default data is plotted against the x1 and y1 axes (the left and bottom one\nrespectively). If we want a particular curve plotted against a different axis,\nwe can specify that with these options. You pass C\u003c--AXIS ID\u003e where C\u003cAXIS\u003e\ndefines the axis (C\u003cx2\u003e or C\u003cy2\u003e or C\u003cx1y2\u003e or C\u003cx2y1\u003e or C\u003cx2y2\u003e) and the C\u003cID\u003e\nis the curve ID. C\u003c--x2\u003e is a synonym for C\u003c--x2y1\u003e and C\u003c--y2\u003e is a synonym for\nC\u003c--x1y2\u003e. The curve ID is an ordered 0-based index or a specific ID if\nC\u003c--dataid\u003e or C\u003c--vnlog\u003e. None of these apply to 3d plots. Can be passed\nmultiple times for different curve IDs, multiple IDs can be passed in as a\ncomma-separated list. By default the curves plotted against the various axes\naren not drawn in any differentiated way: the viewer of the resulting plot has\nto be told which is which via an axes label, legend, colors, etc. Prior to\nversion 1.25 of C\u003cfeedgnuplot\u003e the curves plotted on the y2 axis were drawn with\na thicker line. This is no longer the case, but that behavior can be brought\nback by passing something like\n\n --y2 curveid --style curveid 'linewidth 3'\n\n=item\n\nC\u003c--histogram curveID\u003e\n\nSet up a this specific curve to plot a histogram. The bin width is given with\nthe C\u003c--binwidth\u003e option (assumed 1.0 if omitted). If a drawing style is not\nspecified for this curve (C\u003c--curvestyle\u003e) or all curves (C\u003c--with\u003e,\nC\u003c--curvestyleall\u003e) then the default histogram style is set: filled boxes with\nborders. This is what the user generally wants. This works with C\u003c--domain\u003e\nand/or C\u003c--stream\u003e, but in those cases the x-value is used I\u003conly\u003e to cull old\ndata because of C\u003c--xlen\u003e or C\u003c--monotonic\u003e. I.e. the domain values are I\u003cnot\u003e\ndrawn in any way. Can be passed multiple times, or passed a comma- separated\nlist\n\n=item\n\nC\u003c--xticlabels\u003e\n\nIf given, the x-axis tic labels are not numerical, but are read from the data.\nThis changes the interpretation of the input data: with C\u003c--domain\u003e, each line\nbegins with C\u003cx label ....\u003e. Without C\u003c--domain\u003e, each line begins with C\u003clabel\n...\u003e. Clearly, the labels may not contain whitespace. This does I\u003cnot\u003e affect\nthe tuple size. This makes sense only without C\u003c--3d\u003e. Please see the guide\n(L\u003chttps://github.com/dkogan/feedgnuplot/blob/master/guide/guide.org\u003e) for usage\nexamples.\n\n=item\n\nC\u003c--binwidth width\u003e\n\nThe width of bins when making histograms. This setting applies to ALL histograms\nin the plot. Defaults to 1.0 if not given.\n\n=item\n\nC\u003c--histstyle style\u003e\n\nNormally, histograms are generated with the 'smooth frequency' gnuplot style.\nC\u003c--histstyle\u003e can be used to select different C\u003csmooth\u003e settings (see the\ngnuplot C\u003chelp smooth\u003e page for more info). Allowed values are 'frequency' (the\ndefault), 'fnormal' (available in very recent gnuplots), 'unique', 'cumulative'\nand 'cnormal'. 'fnormal' is a normalized histogram. 'unique' indicates whether a\nbin has at least one item in it: instead of counting the items, it'll always\nreport 0 or 1. 'cumulative' is the integral of the 'frequency' histogram.\n'cnormal' is like 'cumulative', but rescaled to end up at 1.0.\n\n=item\n\nC\u003c--style curveID style\u003e\n\nAdditional styles per curve. With C\u003c--dataid\u003e, curveID is the ID. Otherwise,\nit's the index of the curve, starting at 0. curveID can be a comma-separated\nlist of IDs to which the given style should apply. Use this option multiple\ntimes for multiple curves. C\u003c--styleall\u003e does I\u003cnot\u003e apply to curves that have a\nC\u003c--style\u003e.\n\n=item\n\nC\u003c--curvestyle curveID\u003e\n\nSynonym for C\u003c--style\u003e\n\n=item\n\nC\u003c--styleall xxx\u003e\n\nAdditional styles for all curves that have no C\u003c--style\u003e. This is overridden by\nany applicable C\u003c--style\u003e. Exclusive with C\u003c--with\u003e.\n\n=item\n\nC\u003c--curvestyleall xxx\u003e\n\nSynonym for C\u003c--styleall\u003e\n\n=item\n\nC\u003c--with xxx\u003e\n\nSame as C\u003c--styleall\u003e, but prefixed with \"with\". Thus\n\n --with boxes\n\nis equivalent to\n\n --styleall 'with boxes'\n\nExclusive with C\u003c--styleall\u003e.\n\n=item\n\nC\u003c--every curveID factor\u003e\n\nDecimates the input. Instead of plotting every point in the given curve, plot\none point per factor. This is useful to quickly process huge datasets. For\ninstance, to plot 1% of the data, pass a factor of 100.\n\n=item\n\nC\u003c--everyall factor\u003e\n\nDecimates the input. This works exactly like C\u003c--every\u003e, except it applies to\nI\u003call\u003e the curves.\n\n=item\n\nC\u003c--using curveID expression\u003e\n\nSpecifies a C\u003cusing\u003e expression to micromanage the plot. This is a powerful\noption that allows gnuplot to interpret the input data in arbitrary ways. A\nC\u003cusing\u003e expression tells gnuplot how to map the input columns of data to tuples\nexpected by the plotting style. Please see the L\u003c/\"'using' expressions\"\u003e section above for more detail.\n\n=item\n\nC\u003c--usingall expression\u003e\n\nGlobal \"using\" expressions. This works exactly like C\u003c--using\u003e, except it\napplies to I\u003call\u003e the curves.\n\n=item\n\nC\u003c--cmds xxx\u003e\n\nAdditional commands to pass on to gnuplot verbatim. These could contain extra\nglobal styles for instance. Can be passed multiple times.\n\n=item\n\nC\u003c--extracmds xxx\u003e\n\nSynonym for C\u003c--cmds xxx\u003e\n\n=item\n\nC\u003c--set xxx\u003e\n\nAdditional 'set' commands to pass on to gnuplot verbatim. C\u003c--set 'a b c'\u003e will\nresult in gnuplot seeing a C\u003cset a b c\u003e command. Can be passed multiple times.\n\n=item\n\nC\u003c--unset xxx\u003e\n\nAdditional 'unset' commands to pass on to gnuplot verbatim. C\u003c--unset 'a b c'\u003e\nwill result in gnuplot seeing a C\u003cunset a b c\u003e command. Can be passed multiple\ntimes.\n\n=item\n\nC\u003c--image filename\u003e\n\nOverlays the data on top of a raster image given in C\u003cfilename\u003e. This is passed\nthrough to gnuplot via C\u003c--equation\u003e, and is not interpreted by C\u003cfeedgnuplot\u003e\nother than checking for existence. Usually images have their origin at the\ntop-left corner, while plots have it in the bottom-left corner instead. Thus if\nthe y-axis extents are not specified (C\u003c--ymin\u003e, C\u003c--ymax\u003e, C\u003c--set 'yrange\n...'\u003e) this option will also flip around the y axis to make the image appear\nproperly. Since this option is just a passthrough to gnuplot, finer control can\nbe achieved by passing in C\u003c--equation\u003e and C\u003c--set yrange ...\u003e directly.\n\n=item\n\nC\u003c--equation xxx\u003e\n\nGnuplot can plot both data and symbolic equations. C\u003cfeedgnuplot\u003e generally\nplots data, but with this option can plot symbolic equations I\u003calso\u003e. This is\ngenerally intended to augment data plots, since for equation-only plots you\ndon't need C\u003cfeedgnuplot\u003e. C\u003c--equation\u003e can be passed multiple times for\nmultiple equations. The given strings are passed to gnuplot directly without\nanything added or removed, so styling and such should be applied in the string.\nA basic example:\n\n seq 100 | awk '{print $1/10, $1/100}' |\n   feedgnuplot --with 'lines lw 3' --domain --ymax 1\n               --equation 'sin(x)/x' --equation 'cos(x)/x with lines lw 4'\n\nHere I plot the incoming data (points along a line) with the given style (a line\nwith thickness 3), I\u003cand\u003e I plot two damped sinusoids on the same plot. The\nsinusoids are not affected by C\u003cfeedgnuplot\u003e styling, so their styles are set\nseparately, as in this example. More complicated example:\n\n seq 360 | perl -nE '$th=$_/360 * 3.14*2; $c=cos($th); $s=sin($th); say \"$c $s\"' |\n   feedgnuplot --domain --square\n               --set parametric --set \"trange [0:2*3.14]\" --equation \"sin(t),cos(t)\"\n\nHere the data I generate is points along the unit circle. I plot these as\npoints, and I I\u003calso\u003e plot a true circle as a parametric equation.\n\n=item\n\nC\u003c--equation-below xxx\u003e\n\nSynonym for C\u003c--equation\u003e. These are rendered I\u003cbelow\u003e all the other data.\n\n=item\n\nC\u003c--equation-above xxx\u003e\n\nLike C\u003c--equation\u003e, but is rendered I\u003con top\u003e of all the other data.\n\n=item\n\nC\u003c--square\u003e\n\nPlot data with aspect ratio 1. For 3D plots, this controls the aspect ratio for\nall 3 axes\n\n=item\n\nC\u003c--square-xy\u003e\n\nFor 3D plots, set square aspect ratio for ONLY the x,y axes\n\n=item\n\nC\u003c--hardcopy xxx\u003e\n\nIf not streaming, output to a file specified here. Format inferred from\nfilename, unless specified by C\u003c--terminal\u003e. If C\u003c--terminal\u003e is given,\nC\u003c--hardcopy\u003e sets I\u003conly\u003e the output filename.\n\n=item\n\nC\u003c--terminal xxx\u003e\n\nString passed to 'set terminal'. No attempts are made to validate this.\nC\u003c--hardcopy\u003e sets this to some sensible defaults if C\u003c--hardcopy\u003e is set to a\nfilename ending in C\u003c.png\u003e, C\u003c.pdf\u003e, C\u003c.ps\u003e, C\u003c.eps\u003e or C\u003c.svg\u003e. If any other\nfile type is desired, use both C\u003c--hardcopy\u003e and C\u003c--terminal\u003e\n\n=item\n\nC\u003c--maxcurves N\u003e\n\nThe maximum allowed number of curves. This is 100 by default, but can be reset\nwith this option. This exists purely to prevent perl from allocating all of the\nsystem's memory when reading bogus data\n\n=item\n\nC\u003c--monotonic\u003e\n\nIf C\u003c--domain\u003e is given, checks to make sure that the x-coordinate in the input\ndata is monotonically increasing. If a given x-variable is in the past, all data\ncurrently cached for this curve is purged. Without C\u003c--monotonic\u003e, all data is\nkept. Does not make sense with 3d plots. No C\u003c--monotonic\u003e by default. The data\nis replotted before being purged. This is useful in streaming plots where the\nincoming data represents multiple iterations of the same process (repeated\nsimulations of the same period in time, for instance).\n\n=item\n\nC\u003c--rangesize curveID N\u003e\n\nThe options C\u003c--rangesizeall\u003e and C\u003c--rangesize\u003e set the number of values are\nneeded to represent each point being plotted (see L\u003c/\"Multi-value style\nsupport\"\u003e above). These options are I\u003conly\u003e needed if unknown styles are used,\nwith C\u003c--styleall\u003e or C\u003c--with\u003e for instance.\n\nC\u003c--rangesize\u003e is used to set how many values are needed to represent the range\nof a point for a particular curve. This overrides any defaults that may exist\nfor this curve only.\n\nWith C\u003c--dataid\u003e, curveID is the ID. Otherwise, it's the index of the curve,\nstarting at 0. curveID can be a comma-separated list of IDs to which the given\nrangesize should apply.\n\n=item\n\nC\u003c--tuplesize curveID N\u003e\n\nVery similar to C\u003c--rangesize\u003e, but instead of specifying the I\u003crange\u003e only,\nthis specifies the whole tuple. For instance if we're plotting circles, the\ntuplesize is 3: C\u003cx,y,radius\u003e. In a 2D plot there's a 1-dimensional domain:\nC\u003cx\u003e, so the rangesize is 2: C\u003cy,radius\u003e. This dimensionality can be given\neither way.\n\n=item\n\nC\u003c--rangesizeall N\u003e\n\nLike C\u003c--rangesize\u003e, but applies to I\u003call\u003e the curves.\n\n=item\n\nC\u003c--tuplesizeall N\u003e\n\nLike C\u003c--tuplesize\u003e, but applies to I\u003call\u003e the curves.\n\n=item\n\nC\u003c--dump\u003e\n\nInstead of printing to gnuplot, print to STDOUT. Very useful for debugging. It\nis possible to send the output produced this way to gnuplot directly.\n\n=item\n\nC\u003c--exit\u003e\n\nThis controls what happens when the input data is exhausted, or when some part\nof the C\u003cfeedgnuplot\u003e pipeline is killed. This option does different things\ndepending on whether C\u003c--stream\u003e is active, so read this closely.\n\nWith interactive gnuplot terminals (qt, x11, wxt), the plot windows live in a\nseparate process from the main C\u003cgnuplot\u003e process. It is thus possible for the\nmain C\u003cgnuplot\u003e process to exit, while leaving the plot windows up (a caveat is\nthat such decapitated windows aren't interactive). There are 3 possible states\nof the polotting pipeline:\n\n=over\n\n=item Alive: C\u003cfeedgnuplot\u003e, C\u003cgnuplot\u003e alive, plot window process alive, no\nshell prompt (shell busy with C\u003cfeedgnuplot\u003e)\n\n=item Half-alive: C\u003cfeedgnuplot\u003e, C\u003cgnuplot\u003e dead, plot window process alive\n(but non-interactive), shell prompt available\n\n=item Dead: C\u003cfeedgnuplot\u003e, C\u003cgnuplot\u003e dead, plot window process dead, shell\nprompt available\n\n=back\n\nThe possibilities are:\n\n=over\n\n=item No C\u003c--stream\u003e, all data read in\n\n=over\n\n=item no C\u003c--exit\u003e (default)\n\nAlive. Need to Ctrl-C to get back into the shell\n\n=item C\u003c--exit\u003e\n\nHalf-alive. Non-interactive prompt up, and the shell accepts new commands.\nWithout C\u003c--stream\u003e the goal is to show a plot, so a Dead state would not be\nuseful.\n\n=back\n\n=item C\u003c--stream\u003e, all data read in or the C\u003cfeedgnuplot\u003e process terminated\n\n=over\n\n=item no C\u003c--exit\u003e (default)\n\nAlive. Need to Ctrl-C to get back into the shell. This means that when making\nlive plots, the first Ctrl-C kills the data feeding process, but leaves the\nfinal plot up for inspection. A second Ctrl-C kills feedgnuplot as well.\n\n=item C\u003c--exit\u003e\n\nDead. No plot is shown, and the shell accepts new commands. With C\u003c--stream\u003e the\ngoal is to show a plot as the data comes in, which we have been doing. Now that\nwe're done, we can clean up everything.\n\n=back\n\n=back\n\nNote that one usually invokes C\u003cfeedgnuplot\u003e as a part of a shell pipeline:\n\n $ write_data | feedgnuplot\n\nIf the user terminates this pipeline with ^C, then I\u003call\u003e the processes in the\npipeline receive SIGINT. This normally kills C\u003cfeedgnuplot\u003e and all its\nC\u003cgnuplot\u003e children, and we let this happen unless C\u003c--stream\u003e and no C\u003c--exit\u003e.\nIf C\u003c--stream\u003e and no C\u003c--exit\u003e, then we ignore the first ^C. The data feeder\ndies, and we behave as if the input data was exhausted. A second ^C kills us\nalso.\n\n=item\n\nC\u003c--geometry\u003e\n\nSpecifies the size, position of the plot window. This applies I\u003conly\u003e to the\nC\u003cx11\u003e gnuplot terminal, and has no effect otherwise. To control the window size\nfor any other terminal, ask for the terminal explicitly, with the options\nspecifying the size. For instance C\u003c--terminal 'qt size 1024,768'\u003e\n\n=item\n\nC\u003c--version\u003e\n\nPrint the version and exit\n\n=back\n\n=head1 RECIPES\n\nFor a tutorial and a gallery please see the guide at\nL\u003chttps://github.com/dkogan/feedgnuplot/blob/master/guide/guide.org\u003e\n\n=head2 Basic plotting of piped data\n\n $ seq 5 | awk '{print 2*$1, $1*$1}'\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' |\n   feedgnuplot --lines --points --legend 0 \"data 0\" --title \"Test plot\" --y2 1\n\n=head2 Realtime plot of network throughput\n\nLooks at wlan0 on Linux.\n\n $ while true; do sleep 1; cat /proc/net/dev; done |\n   gawk '/wlan0/ {if(b) {print $2-b; fflush()} b=$2}' |\n   feedgnuplot --lines --stream --xlen 10 --ylabel 'Bytes/sec' --xlabel seconds\n\n=head2 Realtime plot of battery charge in respect to time\n\nUses the result of the C\u003cacpi\u003e command.\n\n $ while true; do acpi; sleep 15; done |\n   perl -nE 'BEGIN{ $| = 1; } /([0-9]*)%/; say join(\" \", time(), $1);' |\n   feedgnuplot --stream --ymin 0 --ymax 100 --lines --domain --xlabel 'Time' --timefmt '%s' --ylabel \"Battery charge (%)\"\n\n=head2 Realtime plot of temperatures in an IBM Thinkpad\n\nUses C\u003c/proc/acpi/ibm/thermal\u003e, which reports temperatures at various locations\nin a Thinkpad.\n\n $ while true; do cat /proc/acpi/ibm/thermal | awk '{$1=\"\"; print}' ; sleep 1; done |\n   feedgnuplot --stream --xlen 100 --lines --autolegend --ymax 100 --ymin 20 --ylabel 'Temperature (deg C)'\n\n=head2 Plotting a histogram of file sizes in a directory, granular to 10MB\n\n $ ls -l | awk '{print $5/1e6}' |\n   feedgnuplot --histogram 0\n     --binwidth 10\n     --ymin 0 --xlabel 'File size (MB)' --ylabel Frequency\n\n=head2 Plotting a live histogram of the ping round-trip times for the past 20 seconds\n\n $ ping -D 8.8.8.8 |\n   perl -anE 'BEGIN { $| = 1; }\n              $F[0] =~ s/[\\[\\]]//g or next;\n              $F[7] =~ s/.*=//g    or next;\n              say \"$F[0] $F[7]\"' |\n   feedgnuplot --stream --domain --histogram 0 --binwidth 10 \\\n               --xlabel 'Ping round-trip time (s)'  \\\n               --ylabel Frequency --xlen 20\n\n=head2 Plotting points on top of an existing image\n\nThis can be done with C\u003c--image\u003e:\n\n $ \u003c features_xy.data\n   feedgnuplot --points --domain --image \"image.png\"\n\nor with C\u003c--equation\u003e:\n\n $ \u003c features_xy.data\n   feedgnuplot --points --domain\n     --equation '\"image.png\" binary filetype=auto flipy with rgbimage'\n     --set 'yrange [:] reverse'\n\nThe C\u003c--image\u003e invocation is a convenience wrapper for the C\u003c--equation\u003e\nversion. Finer control is available with C\u003c--equation\u003e.\n\n\nHere an existing image is given to gnuplot verbatim, and data to plot on top of\nit is interpreted by feedgnuplot as usual. C\u003cflipy\u003e is useful here because\nusually the y axis points up, but when looking at images, this is usually\nreversed: the origin is the top-left pixel.\n\n=head1 ACKNOWLEDGEMENT\n\nThis program is originally based on the driveGnuPlots.pl script from\nThanassis Tsiodras. It is available from his site at\nL\u003chttp://users.softlab.ece.ntua.gr/~ttsiod/gnuplotStreaming.html\u003e\n\n=head1 REPOSITORY\n\nL\u003chttps://github.com/dkogan/feedgnuplot\u003e\n\n=head1 AUTHOR\n\nDima Kogan, C\u003c\u003c \u003cdima@secretsauce.net\u003e \u003e\u003e\n\n=head1 LICENSE AND COPYRIGHT\n\nCopyright 2011-2021 Dima Kogan.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of either: the GNU General Public License as published\nby the Free Software Foundation; or the Artistic License.\n\nSee http://dev.perl.org/licenses/ for more information.\n\n=cut\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdkogan%2Ffeedgnuplot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdkogan%2Ffeedgnuplot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdkogan%2Ffeedgnuplot/lists"}