gnuplot: why is linewidth 0 not zero in width? - gnuplot

What is the reason that lw 0 doesn't have zero linewidth, i.e. invisible?
What I find in the gnuplot manual:
The line width and point size are multipliers for the current
terminal's default width ...
Ok, if lw 0 is a multiplier then the resulting linewidth should be zero independent of the terminal's default linewidth.
The reason for asking is to eventually have the possibility to use with linespoints and programmatically switch within a loop between with lines and with points.
Code:
### linewidth 0 isn't zero
reset session
set key out
set yrange[-0.9:10.9]
set ytics 1
plot for [i=0:10] i with lines lw i title sprintf("linewidth %g",i)
### end of code
Result:
By the way, what are the artefacts at the y-axis e.g. at ytics 3,4,6,7,9,10 (wxt-terminal)?

Mike Nakis is correct that for at least some of the gnuplot output terminals, including PostScript, gnuplot asks for a 0 width line and the language or library in question interprets that as "1 pixel" or "thinnest possible line".
Similarly "pointtype 0" is not truly missing, it produces a single pixel dot.
You can, however, disable the line drawing altogether by using linetype "nodraw".
That gives a complementary pair of commands
plot sin(x) with linespoints lt nodraw pt 7 # only the points are visible
plot sin(x) with linespoints lt 1 pt 0 # only the lines are visible
In some circumstances it may help to know that the numeric equivalent for lt nodraw is lt -2.

I don't know for sure what the official explanation is for gnuplot in particular, but in my experience, most graphics packages / tools / libraries etc. use a special convention for a line width of zero.
According to this convention, a line width of zero does not mean invisible; it simply means "the thinnest line possible". This means the thinnest line that can be displayed on the device, regardless of zoom, transformations, logical-to-physical mapping, etc.
So, on monitors, it will be a line which is one pixel wide.
On a printer, it will be the thinnest line that the printer is capable of producing. So, if the printer has a high enough resolution, then the line might practically be invisible, though a magnifying glass should still be able to reveal its existence.
And note that "regardless of zoom, etc." means that even if you set up some scaling that makes your 10-point line look as thick as 100 pixels, the zero-width line will still be exactly one pixel thick.

Related

Gnuplot: Change Density of dotted line in splot

I am trying to plot a dotted line within an splot with the following code in Gnuplot 4.6 patchlevel 4:
set terminal "pdfcairo" enhanced dashed size 15,10
set pm3d map
set output "test.pdf"
splot 'map.dat' using 1:($2/1000):3 notitle, \
'line1.dat' using 1:($2/1000):1 notitle with lines ls 2, \
'line2.dat' using 1:($2/1000):1 notitle with lines ls 2
unset output
The heat map works and so does line1.dat. However, the second line appears mostly solid. The difference is that line1.dat has 70 entries and line2.dat has 900. The second line has a jump between two points and there it is dotted.
Does somebody know how I can change the dot density so that the whole line appears dotted. Changing the original data file is not an option.
Thank you for your help,
noes
EDIT:
One workaround I found is
splot 'line2.dat' every ...
but that can get unconvenient at the jump in the data.
The command (s)plot 'line.dat' with lines first plots the datapoints and then connects the datapoints using lines with the respective linestyle. If the datapoints are too close to each other, there is no place for some gaps when a dashed linestyle is used.
To display a dotted/dashed line, you can try to replace the points by a function or to reduce the number of points.
Try dotted lines instead of dashed lines. Linestyle and linecolor can be set independently: splot 'line.dat' with lines ls 0 lc 2. 900 points might be too many for this approach.
Fitting a function would work, but probably it is too difficult to find a suitable function.
The every option reduces the number of points.
Another possibility to reduce the number of points would be to interpolate the points using the smooth option. This requires a temporary file and works as follows:
# [prepare plot]
set samples 100
set table "line2.dat.tmp"
plot 'line2.dat' using 1:($2/1000) smooth mcsplines with lines ls 2
unset table
set terminal "pdfcairo" enhanced dashed size 15,10
set pm3d map
set output "test.pdf"
# [plot]
splot 'map.dat' using 1:($2/1000):3 notitle, \
'line1.dat' using 1:($2/1000):1 notitle with lines ls 2, \
'line2.dat.tmp' using 1:2:1 notitle with lines ls 2
unset output
In the [prepare plot] section a temporary file "line2.dat.tmp" is created which contains datapoints interpolating line2.dat. You have to play with set samples to get the right number of points. In the example we have 100 equidistant points instead of 900 points with different distances.
The option smooth mcsplines preserves the monotonicity and convexity of the original data points, see help smooth mcsplines in a gnuplot shell.
In the [plot] section the original "lines2.dat" is replaced by the interpolated data.
This approach works if the original data is smooth enough so that replacing 900 points by 100 points does not skip important information. Maybe you want to plot both "lines2.dat" and "lines2.dat.tmp" in a single diagram to compare them.
User the every key-word, like this:
'line2.dat' every 20 using 1:($2/1000):1 notitle with lines ls 2

How to manage `;` expected error in gnuplot

I am getting the following error while plotting graph in gnuplot 4.4
gnuplot> set style fill transparent pattern 2 noborder
^
"./clusterload_all.pg", line 16: ';' expected
Also some errors like this :
gdImageStringFT: Could not find/open font while printing string 45 with font Arial
gnuplot> plot "cpu.dat" using 1:2 with lines title "CPU% total" lw 5 lc 1,
'' using 1:3 with lines title "MEM% total" lw 5 lc 2,
'' using 1:4 with lines title "CPU% for clmServer" lw 5 lc 6,
'' using 1:5 with lines title "MEM% for clmServer" lw 5 lc 10,
'' using 1:8 with boxes fill transparent pattern 2 title "1: Uninstall Licenses" lw 2 lc 5,
'' using 1:9 with boxes fill transparent pattern 2 title "2: Install Licenses" lw 2 lc 6,
'' using 1:10 with boxes fill transparent pattern 2 title "3: Query Installed Licenses" lw 2 lc 7,
'' using 1:11 with boxes fill transparent pattern 2 title "4: Creating Feature Codes" lw 2 lc 11,
'' using 1:12 with boxes fill transparent pattern 2 title "5: Register Feature Codes" lw 2 lc 3,
'' using 1:13 with boxes fill transparent pattern 2 title "6: Query Feature Codes" lw 2 lc 1,
'' using 1:14 with boxes fill transparent pattern 2 title "7: Unregister Feature Codes" lw 2 lc 21
^
"./clusterload_all.pg", line 29: ';' expected
Could anyone please help me regarding this.
To manage the error you need to understand what happens in the line that generated it.
Gnuplot interpreter gives an help signing with the cursor "^" the first letter of the offending word and writing the line number where it is possible to find it (the line number if a script is loaded with load "myscript.gp" or gnuplot is invoked by command line asgnuplot myscript.gp).
The origin can be various since, until that offending word, the syntax seems to be acceptable.
Let me cite just a few examples:
A not correct order in the option sequence
plot "<seq 1 20" with lines using 0:($1) # before "using" after "with"
A line currently accepted by a version of gnuplot but not from a different one (that differs not only for version or subversion number, but even only for compilation option)
Note: with the use of the backslash(\) it's possible to split on different lines a long long command as if it was written in a single line. It's cosy and clean especially in a script.
When the error is generated the output of this long long line is recomposed so the column of the cursor(^) can appear wrong if compared with the position of the offending word in the script.
To reproduce your specific error we can check only the kernel of your command with some different version of gnuplot.
set style fill transparent pattern 2 noborder
With the results reported below:
in gnuplot 4.1.0 and it gives me the same error message
gnuplot> set style fill transparent pattern 2 noborder
^
';' expected
in gnuplot 4.6.3 I have no error at all.
in a gnuplot linux Version 4.4 patchlevel 0 (last modified March 2010) with no error.
If you avoid the feature transparent you will avoid the error in the older version too (4.1.0).
Please verify once again the version you have on your system...
...and feel you free to update it as you can :-) it's rather old.
More seriously if you cannot upload the version you use, you can take hints about the past syntax from the old demo (i.e. http://gnuplot.sourceforge.net/demo_4.4/ )... or from the older ones. Usually there is backward compatibility, meanwhile the forward compatibility is more difficult to find.
ps> You can write that long command line from the internal interpreter or in a more cosy way you can write it in an external file (a script). You can load the script in gnuplot or with the command load "./clusterload_all.pg" inside the gnuplot interpreter or you can call with the command line gnuplot -persist ./clusterload_all.pg from the shell prompt.

Dash line in windows terminal -gnuplot

I am using gnuplot for Windows using the default windows terminal. I need to plot a dashed line instead of normal solid line
I used
set style line 1 lt 0 lc 3
plot 'dashcca.txt'
but it does not work
Any suggestions?
See help terminal windows, which shows you the terminal option dashed. Either use
set terminal windows dashed
or
set termoption dashed
And of course you must use a line type which is dashed. Type test to see all supported line types with the current terminal settings.
In order to use a certain dash pattern with a different line color, use e.g.
plot x linetype 2 linecolor 1
This uses the dash pattern of line type 2, and the color of line type 1 (red). You can use arbitrary colors with linecolor rgb:
plot x linetype 2 linecolor rgb 'black', x**2 linetype 3 linecolor rgb '#bb0000'

gnuplot - adjust horizontal spacing of subscript letters

I am trying to adjust the horizontal spacing of letters in subscript in the postscript (enhanced) terminal. The default is to align the spacing as you would for normal letters, but for big letters such as P, the subscripted letter appears too far away. Is there a way to adjust the spacing of subscripted letters?
Edit: minimal example, as requested. My use case is with Times-Italic font, so that's what I've done here, but the look is similar with Times-Roman
set term post enh eps font "Times-Italic"
set output "test.eps"
set title "{P_{/*0.75 C}}"
plot sin(x)
set output
Edit 2: I'm pretty sure the reason is that the typesetter is aligning the left side of the second letter at the right edge of the first letter, but for letters like P where there is a large space between the bottom left corner and furthest right point, it doesn't look very nice when a letter is subscripted next to the P (or T, etc.)
If you are picky about typography, then maybe you should use LaTeX. Gnuplot has a variety of LaTeX terminal types, such as tikz, epslatex, and cairolatex. The downside is that you must then pass the generated plot through latex or pdflatex in order to render it, so plotting is not interactive. Also, you must learn some basic LaTeX.
There is a nice tutorial on using the TikZ terminal. That page gives the following example gnuplot script (xlabel added by me):
set term tikz standalone color solid size 5in,3in
set output 'sin.tex'
set xlabel '$t_{\alpha\beta}$'
set xrange [0:2*pi]
plot sin(x) with lines
exit
Note that the exit is important, otherwise sin.tex will be incomplete. To turn this into a PDF, run pdflatex sin.tex.
You still cannot control the positioning of the subscript (well, probably LaTeX will let you do this if you are expert enough), however the defaults were chosen by typographic experts who probably have a better eye than you or me.

Gnuplot - Using replot with png terminal

I am trying to use replot with png terminal in Gnuplot.
If I do the following I get two plots on one graph without any problem:
plot sin(x)/x
replot sin(x)
Now if do the same for a png terminal type the resulting png file only contains the first plot.
set terminal png
set output 'file.png'
plot sin(x)/x
replot sin(x)
Am I missing something at the end to get the second plot in my png file?
This is actually a very good question, and the behavior here is terminal dependent. Some terminals (e.g. postscript) will give you a new page for each replot. You have a couple of solutions...
First Option: You can make your plot prior to setting the terminal/output and then replot again after you set the terminal/output:
plot sin(x)/x
replot sin(x)
set terminal png
set output 'file.png
replot
This option is sometimes convenient if you want to plot the same thing in multiple terminals, but I rarely use it for anything else.
Second (better) Option: You can pack multiple plots into one command separating each with a comma.
set terminal png
set output 'file.png'
plot sin(x)/x, sin(x)
I very much prefer the second way -- when in a multiplot environment, this is the only way to put multiple graphs on the same plot. If you have very long functions to plot, you can break the line with gnuplot's line continuation (\ at the end of the line -- Nothing is allowed after the \, not even whitespace)
plot sin(x)/x with lines linecolor rgb "blue" linetype 7 lineweight 4, \
sin(x), \
cos(x)

Resources