gnuplot : writing out particular settings into a "header" - svg

It would be handy to have gnuplot write particular settings to an output file, ideally in a .svg, because svg appears very well suited for that - so the image file and settings are all together - however, it appears this is not feasible directly in gnuplot.
Working within the wxt and svg terminals, and especially multiplot, I have been able to see how gnuplot might interface with the shell (for example):
! ls ; pwd ; echo $0, print sin(pi), show terminal. Trouble happens though when trying usual redirection such as > foo.txt and such - even starting a separate gnuplot session by script just to get the parameters. In particular, I found this interesting :
output is sent to STDOUT
print output is sent to '<stderr>'
... though I'm not sure what to do with that.
I could use e.g. ! cat gnuplot.inp | grep terminal >> gnuplot.svg, and dig into further awk/sed scripting, but before doing that it would help to know if I'm missing any small details in gnuplot first. Thanks.
PS a trivial question : why is the shell in gnuplot sh, when the plain-old linux terminal shell I am using is bash and SHELL=/bin/bash? I notice that shell drops the session into the shell from which gnuplot was executed - not sure if that will help the task.

1 The usual way to save current settings to a file is the command save "filename". There is a script in the gnuplot repository called gpsavediff (it may or may not be included in your distro's gnuplot package) that compares the saved values to the default settings and keeps only the ones that changed. From a gnuplot session under linux a typical use would be
... do a bunch of stuff to make a plot ...
save "| gpsavediff > myplot.gp"
... do a bunch more stuff ...
# recover original plot
reset session
load "myplot.gp"
To write specific lines or text to a file is much simpler than you show. For instance
.
set print "session.log" append
print "# This plot looked good on the screen."
print "# At this point the view angles were ", GPVAL_VIEW_ROT_X, GPVAL_VIEW_ROT_Z
print "# I save a PostScript copy to foo.ps"
set term push
set term postscript color
set output "foo.ps"
replot
unset output
set term pop
...
When invoking a shell, gnuplot uses the libc library function popen(). The gory details of popen() are somewhat system dependent but you probably have a man page for it.
gpsavediff script here

Related

Changing gnuplot x11 output defaults

I am using gnuplot over ssh (-X) and due to different screen resolution issues, my x11 output window has minuscule fonts. I want to access the .Xdefaults file as mentioned in documentation but cannot locate it. This question GNUPLOT_DRIVER_DIRECTORY pointed towards some solution but I don't want to input it every time. Can someone help me find a permanent fix for font sizes?
What is your default terminal ? I think it shoulds be xterm, to have x11 as defaults.
shell> echo $TERM
What is yout default gnuplot terminal display ?
gnuplot> show term
Instruction in ~/.Xdefaults have a special syntax (some example in linuxcertif.com/man/1/gnuplot/ ). But i think that's not what you want to do. This is more for 'fine tuning'. And i think it will only be effective if your default terminal is allready x11.
gnuplot*pointsize: 2
gnuplot*background: white
gnuplot*textColor: black
Anyway, it is better to use gnuplot with a text file : file.gp where you put your commands. Then just put in the beginning of your file :
set term x11 font "arial,15"
And execute your file with :
shell> gnuplot file.gp -
do not forget the 'dash' '-' at the end of the command, so that you can continue to put command in the gnuplot prompt to debug additional command.

Can gnuplot create the equivalent of an Rstudio script?

I am very new to Gnuplot. I have previously used Rstudio, which has a script (which you can write a command and then edit it later and rerun it) and also a console. Does gnuplot have this script equivalent? I notice after writing a command incorrectly I can't delete it. However, I want to save a document only containing correct commands so I can revisiting the code. Any suggestions would be appreciated.
Gnuplot has a "save " command. The file it produces contains the entire set of commands necessary to reproduce the current state of the program, including the most recent plot. Most of the commands in the saved file are not relevant to that particular plot, however, because they explicitly set a property to a value that was already the default. To remove these unneeded commands you can filter the saved file through a script gpsavediff, which can be downloaded from the gnuplot web site if you don't already have a copy with your installed version. The save + filter operation can either be done in two separate steps:
gnuplot> ... lots of stuff including a plot command ...
gnuplot> save 'myverboseplot.gp'
gnuplot> exit
gpsavediff < myverboseplot.gp > myplot.gp
or it can be done all once using a piped command:
gnuplot> ... lots of stuff ...
gnuplot> save '| gpsavediff > myplot.gp'
You can further edit the commands in the saved script just as you would any other text document.

Gnuplot: How do you load a custom command?

I'm looking for a way to load a custom command to my gnuplot sessions. Often after playing around with a plot I want to output it to PDF, and continue working. This will look like:
set terminal pdf
set output 'somefilename.pdf'
replot
set terminal qt
replot
Currently the best I can do is put that in a separate file with the file name a variable instead of a string, define said variable in my session, then load said file. I'm wondering if I can load this script as a command that takes an argument, so I can do something like
exportpdf "myfile.pdf"
I think your your current method is already pretty good, but if you want you can fine-tune it a little bit:
If you are willing to keep storing the name of the file in a gnuplot variable FILENAME, then you can circumvent the need of an external file by using macros:
exportpdf="set term push; set term pdf; set output FILENAME; replot; set output; set term pop"
You can then save your current figure by executing
#exportpdf
If you want to give the filename as an argument you can create a script file exportpdf.gp
set term push
set term pdf
set output ARG1
replot
set output
set term pop
and define the string
exportpdf='call "exportpdf.gp"'
for example in your startup file. Then you can save your current figure to filename simply by executing
#exportpdf "filename.pdf"
if you want to define a custom "function", you could first construct the appropriate command and then evaluate it:
plotPdf(fname) = eval(sprintf("set terminal pdf;set output '%s';replot;set terminal qt;replot;", fname))
this definition can be then conveniently placed in the Gnuplot startup script so that it is automatically available

how to read a script (which is stored as a file) in gnuplot

I want gnuplot to read a script and produce graphs accordingly.
what kind of file should the script be and what is the syntax of reading the file.
To run a script called 'filename', you can type
gnuplot "filename"
or from within an interactive gnuplot environment you can load a script file by typing
load "filename"
Edit: As per Gabriel's comment below, you can let the plot generated by a script persist and close your gnuplot session by using the -p or --persist option. Do note that the plot which persists won't have any interactive features like zooming/scrolling.
gnuplot -p "filename"
More info available on the gnuplot official documentation(page 22)

is gnuplot fit influenced by terminal?

i have a gnuplot script file to fit measurement data, using this structure:
set terminal png
...some format templates...
f(x) = a + b*x + c*x**2
fit f(x) "datafile.txt" using "X":"Y" via a, b, c
...some plotting commands etc...
with this, gnuplot shows some strange behaviour:
when i run the script as-is, it gives me the following error:
Undefined value during function evaluation
"myscriptfile.gnuplot", line 5: error during fit
when i move the set terminal png line after the fit line, it runs without a hassle.
normally, i'm loading this at the beginning of a master script containing format templates and further data processing routines. doing this also gives me the aforementioned error message, even with the moved set terminal command.
since this is just the first part of processing my data i really need it to work from the master script... i already tried setting initial guesses, FIT_LIMIT and loading it from a gnuplot environment. i'm using gnuplot 4.6.5.
does anyone know how to solve this or how fit gets influenced by other commands? or is this some kind of bug?
edit: uploaded a stripped down version of scripts and data files to here. with the reduced data files the computed fits don't concur with the measured points, but with the complete data they do.
I'm not sure, what the real error is, but it seems to be related to your use of using "PHEAT":"RHOT", although that should be fine.
I could reproduce your error with the following minimal setup:
A data file test.dat:
A B
1 2
2 3
3 4
and a file test.gp:
f(x) = a*x**2 + b*x + c
fit f(x) 'test.dat' using "A":"B" via a,b,c
If I call this file with gnuplot test.gp I get the same error as you. It doesn't appear if I use using 1:2. If I paste the code in an interactive terminal, the error also appears, but only once. If I repeat only the fit command again, it works fine. I'll report this as a bug.
In the script you posted, I was also able to fix this by using using 9:8 instead of using "PHEAT":"RHOT". Additionally you must remove the first line of the data file, which can be done on-the-fly with tail, so that you can leave the using statements of the plot unchanged. So you can use:
fit rhotside(x) "< tail -n +2 testdata.txt" using 9:8 via rhot0, rhot1, rhot2
fit rcoldside(x) "< tail -n +2 testdata2.txt" using 9:8 via rcold0, rcold1, rcold2

Resources