From a180e1ad8000844546dd504d7e620e96fe004c09 Mon Sep 17 00:00:00 2001 From: Giorgio Calderone Date: Thu, 26 Mar 2020 13:00:24 +0100 Subject: [PATCH] Docs updated --- dev/advanced/index.html | 4 +-- dev/api/index.html | 78 ++++------------------------------------ dev/assets/basic7a.png | Bin 18874 -> 18861 bytes dev/assets/logo.png | Bin 22284 -> 22648 bytes dev/basic/index.html | 4 +-- dev/examples/index.html | 2 +- dev/index.html | 2 +- dev/install/index.html | 2 +- dev/search/index.html | 2 +- dev/search_index.js | 2 +- dev/tips/index.html | 2 +- 11 files changed, 16 insertions(+), 82 deletions(-) diff --git a/dev/advanced/index.html b/dev/advanced/index.html index 79719f7..f6a3145 100644 --- a/dev/advanced/index.html +++ b/dev/advanced/index.html @@ -1,5 +1,5 @@ -Advanced techniques · Gnuplot.jl
diff --git a/dev/api/index.html b/dev/api/index.html index 5f4870a..52ec8d5 100644 --- a/dev/api/index.html +++ b/dev/api/index.html @@ -1,73 +1,7 @@ -API · Gnuplot.jl

API

The list of Gnuplot.jl exported symbols are as follows:

Gnuplot.@gpMacro

@gp args...

The @gp macro (and its companion @gsp, for splot operations) allows to exploit all of the Gnuplot package functionalities using an extremely efficient and concise syntax. Both macros accept the same syntax, as described below.

The macros accepts any number of arguments, with the following meaning:

  • a symbol: the name of the session to use;
  • a string: a command (e.g. "set key left") or plot specification (e.g. "with lines");
  • a string starting with a $ sign: a data set name;
  • an Int > 0: the plot destination in a multiplot session;
  • a keyword/value pair: a keyword value (see below);
  • any other type: a dataset to be passed to Gnuplot. Each dataset must be terminated by either:
    • a string starting with a $ sign (i.e. the data set name);
    • or a string with the plot specifications (e.g. "with lines");
  • the :- symbol, used as first argument, avoids resetting the Gnuplot session. Used as last argument avoids immediate execution of the plot/splot command. This symbol can be used to split a single call into multiple ones.

All entries are optional, and there is no mandatory order. The plot specification can either be:

  • a complete plot/splot command (e.g., "plot sin(x)", both "plot" and "splot" can be abbreviated to "p" and "s" respectively);
  • or a partial specification starting with the "with" clause (if it follows a data set).

The list of accepted keyword is as follows:

  • title::String: plot title;
  • xlabel::String: X axis label;
  • ylabel::String: Y axis label;
  • zlabel::String: Z axis label;
  • xlog::Bool: logarithmic scale for X axis;
  • ylog::Bool: logarithmic scale for Y axis;
  • zlog::Bool: logarithmic scale for Z axis;
  • xrange::NTuple{2, Number}: X axis range;
  • yrange::NTuple{2, Number}: Y axis range;
  • zrange::NTuple{2, Number}: Z axis range;
  • cbrange::NTuple{2, Number}: Color box axis range;

The symbol for the above-mentioned keywords may also be used in a shortened form, as long as there is no ambiguity with other keywords. E.g. you can use: xr=(1,10) in place of xrange=(1,10).

Examples:

Simple examples with no data:

@gp "plot sin(x)"
-@gp "plot sin(x)" "pl cos(x)"
-@gp "plo sin(x)" "s cos(x)"
-
-# Split a `@gp` call in two
-@gp "plot sin(x)" :-
-@gp :- "plot cos(x)"
-
-# Insert a 3 second pause between one plot and the next
-@gp "plot sin(x)" 2 xr=(-2pi,2pi) "pause 3" "plot cos(4*x)"

Simple examples with data:

@gp "set key left" tit="My title" xr=(1,12) 1:10 "with lines tit 'Data'"
-
-x = collect(1.:10)
-@gp x
-@gp x x
-@gp x -x
-@gp x x.^2
-@gp x x.^2 "w l"
-
-lw = 3
-@gp x x.^2 "w l lw $lw"

A more complex example

@gp("set grid", "set key left", xlog=true, ylog=true,
-    title="My title", xlab="X label", ylab="Y label",
-    x, x.^0.5, "w l tit 'Pow 0.5' dt 2 lw 2 lc rgb 'red'",
-    x, x     , "w l tit 'Pow 1'   dt 1 lw 3 lc rgb 'blue'",
-    x, x.^2  , "w l tit 'Pow 2'   dt 3 lw 2 lc rgb 'purple'")

Multiplot example:

@gp(xr=(-2pi,2pi), "unset key",
-    "set multi layout 2,2 title 'Multiplot title'",
-    1, "p sin(x)"  ,
-    2, "p sin(2*x)",
-    3, "p sin(3*x)",
-    4, "p sin(4*x)")

or equivalently

@gp xr=(-2pi,2pi) "unset key" "set multi layout 2,2 title 'Multiplot title'" :-
-for i in 1:4
-  @gp :- i "p sin($i*x)" :-
-end
-@gp

Multiple gnuplot sessions

@gp :GP1 "plot sin(x)"
-@gp :GP2 "plot sin(x)"
-
-Gnuplot.quitall()

Further examples

x = range(-2pi, stop=2pi, length=100);
-y = 1.5 * sin.(0.3 .+ 0.7x) ;
-noise = randn(length(x))./2;
-e = 0.5 * fill(1, size(x));
-
-name = "\$MyDataSet1"
-@gp x y name "plot $name w l" "pl $name u 1:(2*\$2) w l"
-
-@gsp randn(Float64, 30, 50)
-@gp randn(Float64, 30, 50) "w image"
-@gsp x y y
-
-@gp("set key horizontal", "set grid",
-    xrange=(-7,7), ylabel="Y label",
-    x, y, "w l t 'Real model' dt 2 lw 2 lc rgb 'red'",
-    x, y+noise, e, "w errorbars t 'Data'")
-
-@gp "f(x) = a * sin(b + c*x); a = 1; b = 1; c = 1;"   :-
-@gp :- x y+noise e name                               :-
-@gp :- "fit f(x) $name u 1:2:3 via a, b, c;"         :-
-@gp :- "set multiplot layout 2,1"                     :-
-@gp :- "plot $name w points" ylab="Data and model"   :-
-@gp :- "plot $name u 1:(f(\$1)) w lines"           :-
-@gp :- 2 xlab="X label" ylab="Residuals"              :-
-@gp :- "plot $name u 1:((f(\$1)-\$2) / \$3):(1) w errorbars notit"
-
-# Retrieve values for a, b and c
-a = Meta.parse(Gnuplot.exec("print a"))
-b = Meta.parse(Gnuplot.exec("print b"))
-c = Meta.parse(Gnuplot.exec("print c"))
-
-# Save to a PDF file
-save(term="pdf", output="gnuplot.pdf")

Display an image

using TestImages
-img = testimage("lena");
-@gp img "w image"
-@gp "set size square" img "w rgbimage" # Color image with correct proportions
-@gp "set size square" img "u 2:(-\$1):3:4:5 with rgbimage" # Correct orientation
source
+API · Gnuplot.jl

API

Exported symbols

The list of Gnuplot.jl exported symbols is as follows:

Gnuplot.@gpMacro
@gp args...

The @gp macro, and its companion @gsp for 3D plots, allows to send data and commands to the gnuplot using an extremely concise syntax. The macros accepts any number of arguments, with the following meaning:

  • one, or a group of consecutive, array(s) build up a dataset. The different arrays are accessible as columns 1, 2, etc. from the gnuplot process. The number of required input arrays depends on the chosen plot style (see gnuplot documentation);

  • a string occurring before a dataset is interpreted as a gnuplot command (e.g. set grid);

  • a string occurring immediately after a dataset is interpreted as a plot element for the dataset, by which you can specify using clause, with clause, line styles, etc.. All keywords may be abbreviated following gnuplot conventions. Moreover, "plot" and "splot" can be abbreviated to "p" and "s" respectively;

  • the special symbol :-, whose meaning is to avoid starting a new plot (if given as first argument), or to avoid immediately running all commands to create the final plot (if given as last argument). Its purpose is to allow splitting one long statement into multiple (shorter) ones;

  • any other symbol is interpreted as a session ID;

  • an Int (> 0) is interpreted as the plot destination in a multi-plot session (this specification applies to subsequent arguments, not previous ones);

  • an input in the form keyword=value is interpreted as a keyword/value pair. The accepted keywords and their corresponding gnuplot commands are as follows:

    • xrange=[low, high] => "set xrange [low:high];
    • yrange=[low, high] => "set yrange [low:high];
    • zrange=[low, high] => "set zrange [low:high];
    • cbrange=[low, high]=> "set cbrange[low:high];
    • key="..." => "set key ...";
    • title="..." => "set title "..."";
    • xlabel="..." => "set xlabel "..."";
    • ylabel="..." => "set ylabel "..."";
    • zlabel="..." => "set zlabel "..."";
    • xlog=true => set logscale x;
    • ylog=true => set logscale y;
    • zlog=true => set logscale z.

All Keyword names can be abbreviated as long as the resulting name is unambiguous. E.g. you can use xr=[1,10] in place of xrange=[1,10];

  • an input in the form "name"=>(array1, array2, etc...) is interpreted as a named dataset.
source
Gnuplot.@gspMacro
@gsp args...

This macro accepts the same syntax as @gp, but produces a 3D plot instead of a 2D one.

source
Gnuplot.saveFunction
save(sid::Symbol; term="", output="")
+save(sid::Symbol, script_filename::String, ;term="", output="")
+save(; term="", output="")
+save(script_filename::String ;term="", output="")

Export a (multi-)plot into the external file name provided in the output= keyword. The gnuplot terminal to use is provided through the term= keyword.

If the script_filename argument is provided a gnuplot script will be written in place of the output image. The latter can then be used in a pure gnuplot session (Julia is no longer needed) to generate exactly the same original plot.

If the sid argument is provided the operation applies to the corresponding session.

source

Non-exported symbols

The following functions are not exported by the Gnuplot.jl package since they are typically not used in every day work, or aimed to debugging purposes. Still, they can be useful in some case, hence they are documented here.

In order to call these functions you should add the Gnuplot. prefix to the function name.

Gnuplot.execFunction
Gnuplot.exec(sid::Symbol, command::String)
+Gnuplot.exec(command::String)

Execute the gnuplot command command on the underlying gnuplot process of the sid session, and return the results as a Vector{String}. If a gnuplot error arises it is propagated as an ErrorException.

The sid argument is (optional): if not given, :default is used.

Examples:

Gnuplot.exec("print GPVAL_TERM")
+Gnuplot.exec("plot sin(x)")
source
Gnuplot.gpversionFunction
Gnuplot.gpversion()

Returns the gnuplot application version.

Raise an error if version is < 4.7 (required to use data blocks).

source
Gnuplot.quitFunction
Gnuplot.quit(sid::Symbol)

Quit the session identified by sid and the associated gnuplot process (if any).

source
Gnuplot.quitallFunction
Gnuplot.quitall()

Quit all the sessions and the associated gnuplot processes.

source
diff --git a/dev/assets/basic7a.png b/dev/assets/basic7a.png index 75f33e054d35095ed4ce1f01331b59355460d314..6d414dabf373cbe52ccd4f14303eef7a7bfd0ed9 100644 GIT binary patch literal 18861 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≠|Gav^=#DOs(1c7k*y&Ua%bLDu8 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

i!kP@xkh^z({`m3A++2W<@8tAUDd9=poFhCy zh!q%*YJpbx?3u5^1AII@YH{zn_z?!p55NlSQY-Wbm?T7;msLdXGHFQ)vPrC~EOGoY^ss5QO4rN9=!xH{G7Q)E#8if07aCPGzzgSV8WYAH*DE)>Ps z5MKtmy1LBF%r-YS4GavxAHZK5&v$`4tJo0H46R(i2QdL!T2Vrk-4<_Oo1@I~# zg8t48p&m6B)Pqmhr=WXQHE;hnYpQylx>dOjFQ+F6Dgi~XzEkE052!D@(Q6twqrp38 zaGUo1)QP&U9B$779su;6Xw|#Bn3-iS_5pwXpI4>eEmwLsgPu`f8#OOdX9Fj)wy{Z0 zO|?6gN4wF1RJAu}?@g5J4BM^$7irZ2!eZqEMXpiQJ|5{h4x0ffMwF+3w54dCmhQTB>%NoRD$3|^t zJG7;U-ljgE346BV<|bgV9E!22%_Bt2avyeY!qxrd)X z$5>~(RsjSLuBfQ^_HFgd$8dSHolgw38rQh20nfe#Bm469!*;N7!8dcD2{}DUU0hfI zb=s$;A2&XJDgOeK%2Krf&5=Mx1@lM}P!FJpENsL8zCX0d{PjpFP(wgb2jmj#%Sirn zAtB(31JeZEC=DuS(0qz+8n@{Kjcp8q_C{xi8vw%FtEi}e<(JZahs)tf_nU7jF}CRK zDALmIv9Q4VL`8ir&%rO*fzXJ}nUP`ZjkL11Uh0Sk*16tMUu{D}Wf_^{e}r5CUpVER*2QdR*^d0m}|=zxlv8W{t_73d-bF2<3uu}U#v<6|dPEiFo5 z$=jLz2`bTQy~)GQaZnCxtE)SMF6jOJec)sQn?i{0cS~8NP%r=e(IYXnBdPs#36!#L zD`jD>uCAbX&I%3f1obI_p0v!w3FzZ`qL3;k%Fez9&eS9FSmNreRXByLKIKk9^qp|9 zslu8AuqBC|E@uP;1c-VZF6V`S20mc@OA+@G12(zALD%zRwDa;+h!fcDA_Dy60W(^k+L0WS7lVq-LQ%^&2_3jJ7_z0cZhPN>G811c(Fsep3bGcQ9&VidAX82PdjjO<%C1pRu7iD91gV$9nPkAdscUFdG&t_g z|0ZFQrt~V91r#?J;-l4pKUJnGZ$#k$G=PaH1V9Lw1!JKO#igZq#KhuY@0K<8>gsAB z1t!3U2(;y7K%RlUiZe_EJ8%s8&>Sb-R__hJ|2H^}@_;I0EIKLawVB!BexI^6{q97S z0}}~IK`qwDC@<&W6XQG+A3)kDY#)8u+3Kwq{vcTr}&< z0bDkCSn4MhpS%9t5eD`BH3u_u=7I4xh%15g z?m#*}9SRLB6zB_t*SgK~J;CteVhUJKVK2LhC*00UmVg1IA583TX7&?!hN zte|Cukr6l<0TWZLrvw9zUy#20G7|z9_*|@d0rMFWLg1y&X!TMD!NSK^?t%(Nk9Af6 z(3e51Fnje1bovANIfOwR&>Ulr12+ZRut*f+9;a`dskJ0A&Y;HuGuj@DnJs!X zgA_rgh9*}gkb+M^`^8rpG%fxAzZud0-~L4hS7TSL4_02P@S^u*l7lP33MGx+|3498 BEt3EM diff --git a/dev/assets/logo.png b/dev/assets/logo.png index 264872baaa68994bfe3c215d829869d4fa1f640d..99765be5725fd5b39761d35098d9939b1c372798 100644 GIT binary patch literal 22648 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

L6yqm;Zw?j<-(yVaR4oSi$#Kl7`R;< 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 literal 22284 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 diff --git a/dev/basic/index.html b/dev/basic/index.html index 256943e..4107485 100644 --- a/dev/basic/index.html +++ b/dev/basic/index.html @@ -1,5 +1,5 @@ -Basic usage · Gnuplot.jl

Basic usage

The main purpose of the Gnuplot.jl package is to send data and commands to the underlying gnuplot process, in order to generate plots. Unlike other packages, however, the actual commands to plot, or the plot attributes, are not specified through function calls. This is what makes Gnuplot.jl easy to learn and use: there are no functions or keywords names to memorize[1].

The most important symbols exported by the package are the @gp (for 2D plots) and @gsp (for 3D plots) macros, both accepting any number of arguments, and whose meaning is interpreted as follows:

  • one, or a group of consecutive, array(s) build up a dataset. The different arrays are accessible as columns 1, 2, etc. from the gnuplot process. The number of required input arrays depends on the chosen plot style (see gnuplot documentation);

  • a string occurring before a dataset is interpreted as a gnuplot command (e.g. set grid);

  • a string occurring immediately after a dataset is interpreted as a plot element for the dataset, by which you can specify using clause, with clause, line styles, etc.;

  • the special symbol :-, whose meaning is to avoid creating a new plot (if given as first argument), or to avoid immediately running all commands to create the final plot (if given as last argument). Its purpose is to allow splitting one long statement into multiple (shorter) ones.

The above lists all the required concepts to follow the examples presented below. The @gp and @gsp macros also accepts further arguments, but their use will be discussed in Advanced techniques.

2D plots

Here we will show a few examples to generate 2D plots. The examples are intentionally very simple to highlight the behavior of Gnuplot.jl. See Examples for more complex ones.

Remember to run:

using Gnuplot

before running the examples.

Simple examples involving just gnuplot commands:


Plot a sinusoid:

@gp "plot sin(x)"


Plot two curves:

@gp "set key left" "plot sin(x)" "pl cos(x)"

Note

Note that all gnuplot commands can be abbreviated as long as the resulting string is not ambiguous. In the example above we used pl in place of plot.


Split a @gp call in three statements:

@gp    "set grid"  :-
+Basic usage · Gnuplot.jl

Basic usage

The main purpose of the Gnuplot.jl package is to send data and commands to the underlying gnuplot process, in order to generate plots. Unlike other packages, however, the actual commands to plot, or the plot attributes, are not specified through function calls. This is what makes Gnuplot.jl easy to learn and use: there are no functions or keywords names to memorize[1].

The most important symbols exported by the package are the @gp (for 2D plots) and @gsp (for 3D plots) macros, both accepting any number of arguments, and whose meaning is interpreted as follows:

  • one, or a group of consecutive, array(s) build up a dataset. The different arrays are accessible as columns 1, 2, etc. from the gnuplot process. The number of required input arrays depends on the chosen plot style (see gnuplot documentation);

  • a string occurring before a dataset is interpreted as a gnuplot command (e.g. set grid);

  • a string occurring immediately after a dataset is interpreted as a plot element for the dataset, by which you can specify using clause, with clause, line styles, etc.;

  • the special symbol :-, whose meaning is to avoid starting a new plot (if given as first argument), or to avoid immediately running all commands to create the final plot (if given as last argument). Its purpose is to allow splitting one long statement into multiple (shorter) ones.

The above lists all the required concepts to follow the examples presented below. The @gp and @gsp macros also accepts further arguments, but their use will be discussed in Advanced techniques.

2D plots

Here we will show a few examples to generate 2D plots. The examples are intentionally very simple to highlight the behavior of Gnuplot.jl. See Examples for more complex ones.

Remember to run:

using Gnuplot

before running the examples.

Simple examples involving just gnuplot commands:


Plot a sinusoid:

@gp "plot sin(x)"


Plot two curves:

@gp "set key left" "plot sin(x)" "pl cos(x)"

Note

Note that all gnuplot commands can be abbreviated as long as the resulting string is not ambiguous. In the example above we used pl in place of plot.


Split a @gp call in three statements:

@gp    "set grid"  :-
 @gp :- "p sin(x)"  :-
 @gp :- "plo cos(x)"

Send data from Julia to gnuplot:

Plot a parabola

@gp (1:20).^2


Plot a parabola with scaled x axis, lines and legend

x = 1:20
 @gp "set key left"   x ./ 20   x.^2   "with lines tit 'Parabola'"


Multiple datasets, logarithmic axis, labels and colors, etc.

x = 1:0.1:10
@@ -19,4 +19,4 @@ img = testimage("lena");
 x = 1:0.1:4pi
 for i in 1:5
     @gp :- x i.* sin.(x) "w l notit lw 5"
-end

Exporting plots to files

The save() function allows to export all plots (as well as multiplots, see Multiplot) to a file using one of the many available gnuplot terminals. To check which terminals are available in your platform type set term in your gnuplot terminal.

All plots in this page have been saved with:

save(term="pngcairo size 480,360", output="assets/output.png")

except the Lena image, saved with the jpeg terminal:

save(term="jpeg size 480,360", output="assets/output.png")

Gnuplot scripts

Besides exporting plots in a file Gnuplot.jl can also save a script, i.e. a file containing the minimum set of data and commands required to generate a plot within gnuplot.

To generate a script for one of the example above use:

save("script.gp")

after the plot has been displayed. The script can then be used within a gnuplot session as follows:

gunplot> load 'script.gp'

to generate a plot identical to the original one, without using the Julia language.

The purpose of gnuplot scripts is to allow sharing all data, alongside a plot, in order to foster collaboration among scientists and replicability of results. Moreover, a script can be used at any time to change the details of a plot, without the need to re-run the Julia code used to generate it the first time.

Finally, the scripts are the only possible output when Dry sessions are used (i.e. when gnuplot is not available in the user platform.

  • 1a previous knowledge of gnuplot usage is, nevertheless, required.
+end

Exporting plots to files

The save() function allows to export all plots (as well as multiplots, see Multiplot) to a file using one of the many available gnuplot terminals. To check which terminals are available in your platform type set term in your gnuplot terminal.

All plots in this page have been saved with:

save(term="pngcairo size 480,360", output="assets/output.png")

except the Lena image, saved with the jpeg terminal:

save(term="jpeg size 480,360", output="assets/output.png")

Gnuplot scripts

Besides exporting plots in a file Gnuplot.jl can also save a script, i.e. a file containing the minimum set of data and commands required to generate a plot within gnuplot.

To generate a script for one of the example above use:

save("script.gp")

after the plot has been displayed. The script can then be used within a gnuplot session as follows:

gunplot> load 'script.gp'

to generate a plot identical to the original one, without using the Julia language.

The purpose of gnuplot scripts is to allow sharing all data, alongside a plot, in order to foster collaboration among scientists and replicability of results. Moreover, a script can be used at any time to change the details of a plot, without the need to re-run the Julia code used to generate it the first time.

Finally, the scripts are the only possible output when Dry sessions are used (i.e. when gnuplot is not available in the user platform.

  • 1a previous knowledge of gnuplot usage is, nevertheless, required.
diff --git a/dev/examples/index.html b/dev/examples/index.html index f2624f2..cad5aa4 100644 --- a/dev/examples/index.html +++ b/dev/examples/index.html @@ -1,2 +1,2 @@ -Examples · Gnuplot.jl
+Examples · Gnuplot.jl
diff --git a/dev/index.html b/dev/index.html index 4e1f210..1477e88 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Home · Gnuplot.jl

Gnuplot.jl

A Julia interface to Gnuplot.

The Gnuplot.jl package allows easy and fast use of gnuplot as a data visualization tool in Julia. Have a look at Basic usage and Examples for a quick overview. The package main features are:

  • fast time-to-first-plot (~1 sec);

  • extremely concise yet meaningful syntax, makes it ideal for interactive data exploration;

  • no need to learn new API functions or keywords: only two macros (@gp for 2D plots, @gsp for 3D plots) and a basic knowledge of gnuplot are enough to generate the most complex plots;

  • transparent interface between Julia and gnuplot to exploit all functionalities of the latter, both present and future ones;

  • fast data transmission through system pipes (no temporary files involved);

  • availability of all the palettes from ColorSchemes;

  • support for multiple plots in one window, multiple plotting windows, as well as ASCII and Sixel plots (to plot directly in a terminal);

  • support for histograms (both 1D and 2D);

  • enhanced support for contour plots;

  • export to a huge number of formats such as pdf, png, $\LaTeX$, svg, etc. (actually all those supported by gnuplot);

  • save sessions into gnuplot scripts enables easy plot reproducibility and modifications.

Yet another plotting package?

A powerful plotting framework is among the most important tool in the toolbox of any modern scientist and engineer. As such, it is hard to find a single package to fit all needs, and many solutions are indeed available in the Julia ecosystem.

Gnuplot.jl package fills the niche of users who needs:

  1. publication-quality plots, by exploiting the capabilities of a widely used tool such as gnuplot, and its many output formats available;
  2. a well-documented framework, by taking advantage of all the gnuplot documentation, tutorials and examples available on the web;
  3. a fast response, by relying on an external program (rather than on a large Julia code base);
  4. an interactive data exploration framework, by exposing a carefully designed, extremely concise and easy to remember syntax (at least for users with minimal gnuplot knowledge);
  5. a procedure to foster plot reproducibility by sharing just the data and commands in the form of gnuplot scripts, rather than the original Julia code.

Unlike other packages Gnuplot.jl is not a pure Julia solution as it depends on an external package to actually generate plots. However, if gnuplot is not available on a given platform, the package could still be used in "dry" mode, and no error for a missing dependency will be raised (see Dry sessions).

The Gnuplot.jl package development follows a minimalistic approach: it is essentially a thin layer to send data and string commands to gnuplot. This way all underlying capabilities, both present and future ones, are automatically exposed to Julia user, with no need to implement dedicated wrappers.

The functionalities 1, 2 and 3 listed above are similar to those provided by the Gaston package. Gnuplot.jl also provides features 4 and 5, as well as the minimalistic approach.

Do Gnuplot.jl suits my needs?

Any modern plotting package is able to produce a simple scatter plot, with custom symbols, line styles, colors and axis labels. Indeed, this is exactly the example that is reported in every package documentation (also here: see 2D plots). Still, producing complex and publication-quality plots is not an easy task. As a consequence is also not easy to determine whether a package can cope with the most difficult cases (unless you actually try it out) and a reasonable choice is typically to rely on the size of the user base, the availability of documentation / tutorials, and the possibility to preview complex examples.

Gnuplot.jl aims to be ready for even the most challenging plots by relying on the widely and long lasting used gnuplot application, and by allowing each native feature (both present and future ones) to be immediately available in the Julia language. Moreover, Gnuplot.jl provides a unique syntax specifically aimed to increase productivity while performing interactive data exploration.

Last but not least, have a look at the Gnuplot.jl Examples page.

Notation

In this documentation:

  • Gnuplot.jl refers to the Julia package;
  • gnuplot refers to the gnuplot application.

Table of Contents

+Home · Gnuplot.jl

Gnuplot.jl

A Julia interface to gnuplot.

The Gnuplot.jl package allows easy and fast use of gnuplot as a data visualization tool in Julia. Have a look at Basic usage and Examples for a quick overview. The package main features are:

  • fast time-to-first-plot (~1 sec);

  • extremely concise yet meaningful syntax, makes it ideal for interactive data exploration;

  • no need to learn new API functions or keywords: only two macros (@gp for 2D plots, @gsp for 3D plots) and a basic knowledge of gnuplot are enough to generate the most complex plots;

  • transparent interface between Julia and gnuplot to exploit all functionalities of the latter, both present and future ones;

  • fast data transmission through system pipes (no temporary files involved);

  • availability of all the palettes from ColorSchemes;

  • support for multiple plots in one window, multiple plotting windows, as well as ASCII and Sixel plots (to plot directly in a terminal);

  • support for histograms (both 1D and 2D);

  • enhanced support for contour plots;

  • export to a huge number of formats such as pdf, png, $\LaTeX$, svg, etc. (actually all those supported by gnuplot);

  • save sessions into gnuplot scripts enables easy plot reproducibility and modifications.

Yet another plotting package?

A powerful plotting framework is among the most important tool in the toolbox of any modern scientist and engineer. As such, it is hard to find a single package to fit all needs, and many solutions are indeed available in the Julia ecosystem.

Gnuplot.jl package fills the niche of users who needs:

  1. publication-quality plots, by exploiting the capabilities of a widely used tool such as gnuplot, and its many output formats available;
  2. a well-documented framework, by taking advantage of all the gnuplot documentation, tutorials and examples available on the web;
  3. a fast response, by relying on an external program (rather than on a large Julia code base);
  4. an interactive data exploration framework, by exposing a carefully designed, extremely concise and easy to remember syntax (at least for users with minimal gnuplot knowledge);
  5. a procedure to foster plot reproducibility by sharing just the data and commands in the form of gnuplot scripts, rather than the original Julia code.

Unlike other packages Gnuplot.jl is not a pure Julia solution as it depends on an external package to actually generate plots. However, if gnuplot is not available on a given platform, the package could still be used in "dry" mode, and no error for a missing dependency will be raised (see Dry sessions).

The Gnuplot.jl package development follows a minimalistic approach: it is essentially a thin layer to send data and string commands to gnuplot. This way all underlying capabilities, both present and future ones, are automatically exposed to Julia user, with no need to implement dedicated wrappers.

The functionalities 1, 2 and 3 listed above are similar to those provided by the Gaston package. Gnuplot.jl also provides features 4 and 5, as well as the minimalistic approach.

Do Gnuplot.jl suits my needs?

Any modern plotting package is able to produce a simple scatter plot, with custom symbols, line styles, colors and axis labels. Indeed, this is exactly the example that is reported in every package documentation (also here: see 2D plots). Still, producing complex and publication-quality plots is not an easy task. As a consequence is also not easy to determine whether a package can cope with the most difficult cases (unless you actually try it out) and a reasonable choice is typically to rely on the size of the user base, the availability of documentation / tutorials, and the possibility to preview complex examples.

Gnuplot.jl aims to be ready for even the most challenging plots by relying on the widely and long lasting used gnuplot application, and by allowing each native feature (both present and future ones) to be immediately available in the Julia language. Moreover, Gnuplot.jl provides a unique syntax specifically aimed to increase productivity while performing interactive data exploration.

Last but not least, have a look at the Gnuplot.jl Examples page.

Notation

In this documentation:

  • Gnuplot.jl refers to the Julia package;
  • gnuplot refers to the gnuplot application.

Table of Contents

diff --git a/dev/install/index.html b/dev/install/index.html index e8d6c96..836c3a0 100644 --- a/dev/install/index.html +++ b/dev/install/index.html @@ -2,4 +2,4 @@ Installation · Gnuplot.jl

Installation

Prerequisite

In order to use the Gnuplot.jl package you'll need gnuplot (ver. >= 4.7) installed on your system, and its executable available in your path.

If gnuplot is not available in your platform you can still use Gnuplot.jl in "dry" mode (see Dry sessions). In this case a plot can not be generated, but you may still generate Gnuplot scripts.

Package installation

In the Julia REPL type:

julia> ]add Gnuplot

Then hit backspace key to return to Julia REPL.

Check installation

Check execution and version of the underlying gnuplot process:

julia> using Gnuplot
 
 julia> Gnuplot.gpversion()
-v"5.2.0"

Generate the first plot:

julia> @gp 1:9
+v"5.2.0"

Generate the first plot:

julia> @gp 1:9
diff --git a/dev/search/index.html b/dev/search/index.html index 707fbd6..1e6f108 100644 --- a/dev/search/index.html +++ b/dev/search/index.html @@ -1,2 +1,2 @@ -Search · Gnuplot.jl

Loading search...

    +Search · Gnuplot.jl

    Loading search...

      diff --git a/dev/search_index.js b/dev/search_index.js index 8850648..9543e1d 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"api/#API-1","page":"API","title":"API","text":"","category":"section"},{"location":"api/#","page":"API","title":"API","text":"The list of Gnuplot.jl exported symbols are as follows:","category":"page"},{"location":"api/#","page":"API","title":"API","text":"@gp","category":"page"},{"location":"api/#Gnuplot.@gp","page":"API","title":"Gnuplot.@gp","text":"@gp args...\n\nThe @gp macro (and its companion @gsp, for splot operations) allows to exploit all of the Gnuplot package functionalities using an extremely efficient and concise syntax. Both macros accept the same syntax, as described below.\n\nThe macros accepts any number of arguments, with the following meaning:\n\na symbol: the name of the session to use;\na string: a command (e.g. \"set key left\") or plot specification (e.g. \"with lines\");\na string starting with a $ sign: a data set name;\nan Int > 0: the plot destination in a multiplot session;\na keyword/value pair: a keyword value (see below);\nany other type: a dataset to be passed to Gnuplot. Each dataset must be terminated by either:\na string starting with a $ sign (i.e. the data set name);\nor a string with the plot specifications (e.g. \"with lines\");\nthe :- symbol, used as first argument, avoids resetting the Gnuplot session. Used as last argument avoids immediate execution of the plot/splot command. This symbol can be used to split a single call into multiple ones.\n\nAll entries are optional, and there is no mandatory order. The plot specification can either be:\n\na complete plot/splot command (e.g., \"plot sin(x)\", both \"plot\" and \"splot\" can be abbreviated to \"p\" and \"s\" respectively);\nor a partial specification starting with the \"with\" clause (if it follows a data set).\n\nThe list of accepted keyword is as follows:\n\ntitle::String: plot title;\nxlabel::String: X axis label;\nylabel::String: Y axis label;\nzlabel::String: Z axis label;\nxlog::Bool: logarithmic scale for X axis;\nylog::Bool: logarithmic scale for Y axis;\nzlog::Bool: logarithmic scale for Z axis;\nxrange::NTuple{2, Number}: X axis range;\nyrange::NTuple{2, Number}: Y axis range;\nzrange::NTuple{2, Number}: Z axis range;\ncbrange::NTuple{2, Number}: Color box axis range;\n\nThe symbol for the above-mentioned keywords may also be used in a shortened form, as long as there is no ambiguity with other keywords. E.g. you can use: xr=(1,10) in place of xrange=(1,10).\n\nExamples:\n\nSimple examples with no data:\n\n@gp \"plot sin(x)\"\n@gp \"plot sin(x)\" \"pl cos(x)\"\n@gp \"plo sin(x)\" \"s cos(x)\"\n\n# Split a `@gp` call in two\n@gp \"plot sin(x)\" :-\n@gp :- \"plot cos(x)\"\n\n# Insert a 3 second pause between one plot and the next\n@gp \"plot sin(x)\" 2 xr=(-2pi,2pi) \"pause 3\" \"plot cos(4*x)\"\n\nSimple examples with data:\n\n@gp \"set key left\" tit=\"My title\" xr=(1,12) 1:10 \"with lines tit 'Data'\"\n\nx = collect(1.:10)\n@gp x\n@gp x x\n@gp x -x\n@gp x x.^2\n@gp x x.^2 \"w l\"\n\nlw = 3\n@gp x x.^2 \"w l lw $lw\"\n\nA more complex example\n\n@gp(\"set grid\", \"set key left\", xlog=true, ylog=true,\n title=\"My title\", xlab=\"X label\", ylab=\"Y label\",\n x, x.^0.5, \"w l tit 'Pow 0.5' dt 2 lw 2 lc rgb 'red'\",\n x, x , \"w l tit 'Pow 1' dt 1 lw 3 lc rgb 'blue'\",\n x, x.^2 , \"w l tit 'Pow 2' dt 3 lw 2 lc rgb 'purple'\")\n\nMultiplot example:\n\n@gp(xr=(-2pi,2pi), \"unset key\",\n \"set multi layout 2,2 title 'Multiplot title'\",\n 1, \"p sin(x)\" ,\n 2, \"p sin(2*x)\",\n 3, \"p sin(3*x)\",\n 4, \"p sin(4*x)\")\n\nor equivalently\n\n@gp xr=(-2pi,2pi) \"unset key\" \"set multi layout 2,2 title 'Multiplot title'\" :-\nfor i in 1:4\n @gp :- i \"p sin($i*x)\" :-\nend\n@gp\n\nMultiple gnuplot sessions\n\n@gp :GP1 \"plot sin(x)\"\n@gp :GP2 \"plot sin(x)\"\n\nGnuplot.quitall()\n\nFurther examples\n\nx = range(-2pi, stop=2pi, length=100);\ny = 1.5 * sin.(0.3 .+ 0.7x) ;\nnoise = randn(length(x))./2;\ne = 0.5 * fill(1, size(x));\n\nname = \"\\$MyDataSet1\"\n@gp x y name \"plot $name w l\" \"pl $name u 1:(2*\\$2) w l\"\n\n@gsp randn(Float64, 30, 50)\n@gp randn(Float64, 30, 50) \"w image\"\n@gsp x y y\n\n@gp(\"set key horizontal\", \"set grid\",\n xrange=(-7,7), ylabel=\"Y label\",\n x, y, \"w l t 'Real model' dt 2 lw 2 lc rgb 'red'\",\n x, y+noise, e, \"w errorbars t 'Data'\")\n\n@gp \"f(x) = a * sin(b + c*x); a = 1; b = 1; c = 1;\" :-\n@gp :- x y+noise e name :-\n@gp :- \"fit f(x) $name u 1:2:3 via a, b, c;\" :-\n@gp :- \"set multiplot layout 2,1\" :-\n@gp :- \"plot $name w points\" ylab=\"Data and model\" :-\n@gp :- \"plot $name u 1:(f(\\$1)) w lines\" :-\n@gp :- 2 xlab=\"X label\" ylab=\"Residuals\" :-\n@gp :- \"plot $name u 1:((f(\\$1)-\\$2) / \\$3):(1) w errorbars notit\"\n\n# Retrieve values for a, b and c\na = Meta.parse(Gnuplot.exec(\"print a\"))\nb = Meta.parse(Gnuplot.exec(\"print b\"))\nc = Meta.parse(Gnuplot.exec(\"print c\"))\n\n# Save to a PDF file\nsave(term=\"pdf\", output=\"gnuplot.pdf\")\n\nDisplay an image\n\nusing TestImages\nimg = testimage(\"lena\");\n@gp img \"w image\"\n@gp \"set size square\" img \"w rgbimage\" # Color image with correct proportions\n@gp \"set size square\" img \"u 2:(-\\$1):3:4:5 with rgbimage\" # Correct orientation\n\n\n\n\n\n","category":"macro"},{"location":"basic/#Basic-usage-1","page":"Basic usage","title":"Basic usage","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The main purpose of the Gnuplot.jl package is to send data and commands to the underlying gnuplot process, in order to generate plots. Unlike other packages, however, the actual commands to plot, or the plot attributes, are not specified through function calls. This is what makes Gnuplot.jl easy to learn and use: there are no functions or keywords names to memorize[1].","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The most important symbols exported by the package are the @gp (for 2D plots) and @gsp (for 3D plots) macros, both accepting any number of arguments, and whose meaning is interpreted as follows:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"one, or a group of consecutive, array(s) build up a dataset. The different arrays are accessible as columns 1, 2, etc. from the gnuplot process. The number of required input arrays depends on the chosen plot style (see gnuplot documentation);\na string occurring before a dataset is interpreted as a gnuplot command (e.g. set grid);\na string occurring immediately after a dataset is interpreted as a plot element for the dataset, by which you can specify using clause, with clause, line styles, etc.;\nthe special symbol :-, whose meaning is to avoid creating a new plot (if given as first argument), or to avoid immediately running all commands to create the final plot (if given as last argument). Its purpose is to allow splitting one long statement into multiple (shorter) ones.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The above lists all the required concepts to follow the examples presented below. The @gp and @gsp macros also accepts further arguments, but their use will be discussed in Advanced techniques.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"[1]: a previous knowledge of gnuplot usage is, nevertheless, required.","category":"page"},{"location":"basic/#plots2d-1","page":"Basic usage","title":"2D plots","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Here we will show a few examples to generate 2D plots. The examples are intentionally very simple to highlight the behavior of Gnuplot.jl. See Examples for more complex ones.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Remember to run:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"using Gnuplot","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"before running the examples.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"using Gnuplot\nGnuplot.quitall()\nmkdir(\"assets\")\nGnuplot.splash(\"assets/logo.png\")\nsaveas(file) = save(term=\"pngcairo size 480,360\", output=\"assets/$(file).png\")\nempty!(Gnuplot.options.init)\npush!(Gnuplot.options.init, \"set term unknown\")","category":"page"},{"location":"basic/#Simple-examples-involving-just-gnuplot-commands:-1","page":"Basic usage","title":"Simple examples involving just gnuplot commands:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Plot-a-sinusoid:-1","page":"Basic usage","title":"Plot a sinusoid:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"plot sin(x)\"\nsaveas(\"basic1\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Plot-two-curves:-1","page":"Basic usage","title":"Plot two curves:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set key left\" \"plot sin(x)\" \"pl cos(x)\"\nsaveas(\"basic2\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"note: Note\nNote that all gnuplot commands can be abbreviated as long as the resulting string is not ambiguous. In the example above we used pl in place of plot.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Split-a-@gp-call-in-three-statements:-1","page":"Basic usage","title":"Split a @gp call in three statements:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set grid\" :-\n@gp :- \"p sin(x)\" :-\n@gp :- \"plo cos(x)\"\nsaveas(\"basic3\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#Send-data-from-Julia-to-gnuplot:-1","page":"Basic usage","title":"Send data from Julia to gnuplot:","text":"","category":"section"},{"location":"basic/#Plot-a-parabola-1","page":"Basic usage","title":"Plot a parabola","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp (1:20).^2\nsaveas(\"basic4\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Plot-a-parabola-with-scaled-x-axis,-lines-and-legend-1","page":"Basic usage","title":"Plot a parabola with scaled x axis, lines and legend","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 1:20\n@gp \"set key left\" x ./ 20 x.^2 \"with lines tit 'Parabola'\"\nsaveas(\"basic5\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Multiple-datasets,-logarithmic-axis,-labels-and-colors,-etc.-1","page":"Basic usage","title":"Multiple datasets, logarithmic axis, labels and colors, etc.","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 1:0.1:10\n@gp \"set grid\" \"set key left\" \"set logscale y\"\n@gp :- \"set title 'Plot title'\" \"set label 'X label'\" \"set xrange [0:12]\"\n@gp :- x x.^0.5 \"w l tit 'Pow 0.5' dt 2 lw 2 lc rgb 'red'\"\n@gp :- x x \"w l tit 'Pow 1' dt 1 lw 3 lc rgb 'blue'\"\n@gp :- x x.^2 \"w l tit 'Pow 2' dt 3 lw 2 lc rgb 'purple'\"\nsaveas(\"basic6\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"note: Note\nThe above example lacks the trailing :- symbol. This means the plot will be updated at each command, adding one curve at a time.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Keywords-for-common-commands-1","page":"Basic usage","title":"Keywords for common commands","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"In order to avoid typing long, and very frequently used gnuplot commands, Gnuplot.jl provides a few keywords which can be used in both @gp and @sgp calls:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"xrange=[low, high] => \"set xrange [low:high];\nyrange=[low, high] => \"set yrange [low:high];\nzrange=[low, high] => \"set zrange [low:high];\ncbrange=[low, high]=> \"set cbrange[low:high];\nkey=\"...\" => \"set key ...\";\ntitle=\"...\" => \"set title \\\"...\\\"\";\nxlabel=\"...\" => \"set xlabel \\\"...\\\"\";\nylabel=\"...\" => \"set ylabel \\\"...\\\"\";\nzlabel=\"...\" => \"set zlabel \\\"...\\\"\";\nxlog=true => set logscale x;\nylog=true => set logscale y;\nzlog=true => set logscale z;","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"All such keywords can be abbreviated to unambiguous names.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"By using the above keywords the first lines of the previous example:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set grid\" \"set key left\" \"set logscale y\"\n@gp :- \"set title 'Plot title'\" \"set label 'X label'\" \"set xrange [0:12]\"","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"can be replaced with a shorter version:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set grid\" k=\"left\" ylog=true\n@gp :- tit=\"Plot title\" xlab=\"X label\" xr=[0,12]","category":"page"},{"location":"basic/#Plot-images-1","page":"Basic usage","title":"Plot images","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Gnuplot.jl can also display images, i.e. 2D arrays:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"img = randn(Float64, 30, 50)\nimg[10,:] .= -4\n@gp img \"w image notit\"\nsaveas(\"basic7a\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Note that the first index corresponds to the X coordinate when the image is displayed.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The following example shows how to fix orientation of an image by means of the using clause (the TestImages package is required to run this example):","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"using TestImages\nimg = testimage(\"lena\");\n@gp \"set size square\" \"set autoscale fix\" img \"u 2:(-\\$1):3:4:5 with rgbimage notit\"\nsave(term=\"jpeg size 480,360\", output=\"assets/basic7b.jpg\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#plots3d-1","page":"Basic usage","title":"3D plots","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"3D plots follow the same rules as 2D ones, just replace the @gp macro with @gsp and add the required columns (according to the plotting style).","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"E.g., to plot a spiral increasing in size along the X direction:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 0:0.1:10pi\n@gsp x sin.(x) .* x cos.(x) .* x x./20 \"w p pt 7 ps var lc pal\"\nsaveas(\"basic8\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The keywords discussed above can also be used in 3D plots.","category":"page"},{"location":"basic/#Palettes-and-line-types-1","page":"Basic usage","title":"Palettes and line types","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The Gnuplot.jl package comes with all the ColorSchemes palettes readily available.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"A gnuplot-compliant palette can be retrieved with palette(), and used as any other command. The previous example may use an alternative palette with:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 0:0.1:10pi\n@gsp palette(:viridis) x sin.(x) .* x cos.(x) .* x x./20 \"w p pt 7 ps var lc pal\"\nsaveas(\"basic8a\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The ColorSchemes palettes can also be used to generate line types (actually just color attributes), by means of the linetypes() function, e.g.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp linetypes(:deepsea)\nx = 1:0.1:4pi\nfor i in 1:5\n @gp :- x i.* sin.(x) \"w l notit lw 5\"\nend\nsaveas(\"basic9\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#Exporting-plots-to-files-1","page":"Basic usage","title":"Exporting plots to files","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The save() function allows to export all plots (as well as multiplots, see Multiplot) to a file using one of the many available gnuplot terminals. To check which terminals are available in your platform type set term in your gnuplot terminal.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"All plots in this page have been saved with:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"save(term=\"pngcairo size 480,360\", output=\"assets/output.png\")","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"except the Lena image, saved with the jpeg terminal:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"save(term=\"jpeg size 480,360\", output=\"assets/output.png\")","category":"page"},{"location":"basic/#Gnuplot-scripts-1","page":"Basic usage","title":"Gnuplot scripts","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Besides exporting plots in a file Gnuplot.jl can also save a script, i.e. a file containing the minimum set of data and commands required to generate a plot within gnuplot.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"To generate a script for one of the example above use:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"save(\"script.gp\")","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"after the plot has been displayed. The script can then be used within a gnuplot session as follows:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"gunplot> load 'script.gp'","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"to generate a plot identical to the original one, without using the Julia language.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The purpose of gnuplot scripts is to allow sharing all data, alongside a plot, in order to foster collaboration among scientists and replicability of results. Moreover, a script can be used at any time to change the details of a plot, without the need to re-run the Julia code used to generate it the first time.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Finally, the scripts are the only possible output when Dry sessions are used (i.e. when gnuplot is not available in the user platform.","category":"page"},{"location":"examples/#Examples-1","page":"Examples","title":"Examples","text":"","category":"section"},{"location":"examples/#","page":"Examples","title":"Examples","text":"An exhaustive gallery of example is available here:","category":"page"},{"location":"examples/#","page":"Examples","title":"Examples","text":"https://lazarusa.github.io/gnuplot-examples/","category":"page"},{"location":"examples/#","page":"Examples","title":"Examples","text":"Further gnuplot examples can be found here: http://www.gnuplotting.org/","category":"page"},{"location":"advanced/#Advanced-techniques-1","page":"Advanced techniques","title":"Advanced techniques","text":"","category":"section"},{"location":"advanced/#Multiplot-1","page":"Advanced techniques","title":"Multiplot","text":"","category":"section"},{"location":"advanced/#Mixing-2D-and-3D-plots-1","page":"Advanced techniques","title":"Mixing 2D and 3D plots","text":"","category":"section"},{"location":"advanced/#","page":"Advanced techniques","title":"Advanced techniques","text":"\n@gp \"set multiplot layout 1,2\"\n@gp :- 1 \"plot sin(x) w l\"\n\n\nx = y = -10:0.33:10\nfz(x,y) = sin.(sqrt.(x.^2 + y.^2))./sqrt.(x.^2+y.^2)\nfxy = [fz(x,y) for x in x, y in y]\n\n@gsp :- 2 x y fxy \"w pm3d notit\"\n","category":"page"},{"location":"advanced/#Multiple-processes-1","page":"Advanced techniques","title":"Multiple processes","text":"","category":"section"},{"location":"advanced/#Named-datasets-1","page":"Advanced techniques","title":"Named datasets","text":"","category":"section"},{"location":"advanced/#Histograms-(1D)-1","page":"Advanced techniques","title":"Histograms (1D)","text":"","category":"section"},{"location":"advanced/#Histograms-(2D)-1","page":"Advanced techniques","title":"Histograms (2D)","text":"","category":"section"},{"location":"advanced/#Contour-lines-1","page":"Advanced techniques","title":"Contour lines","text":"","category":"section"},{"location":"advanced/#Animations-1","page":"Advanced techniques","title":"Animations","text":"","category":"section"},{"location":"advanced/#Dry-sessions-1","page":"Advanced techniques","title":"Dry sessions","text":"","category":"section"},{"location":"advanced/#Options-1","page":"Advanced techniques","title":"Options","text":"","category":"section"},{"location":"install/#Installation-1","page":"Installation","title":"Installation","text":"","category":"section"},{"location":"install/#Prerequisite-1","page":"Installation","title":"Prerequisite","text":"","category":"section"},{"location":"install/#","page":"Installation","title":"Installation","text":"In order to use the Gnuplot.jl package you'll need gnuplot (ver. >= 4.7) installed on your system, and its executable available in your path.","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"If gnuplot is not available in your platform you can still use Gnuplot.jl in \"dry\" mode (see Dry sessions). In this case a plot can not be generated, but you may still generate Gnuplot scripts.","category":"page"},{"location":"install/#Package-installation-1","page":"Installation","title":"Package installation","text":"","category":"section"},{"location":"install/#","page":"Installation","title":"Installation","text":"In the Julia REPL type:","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"julia> ]add Gnuplot","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"Then hit backspace key to return to Julia REPL.","category":"page"},{"location":"install/#Check-installation-1","page":"Installation","title":"Check installation","text":"","category":"section"},{"location":"install/#","page":"Installation","title":"Installation","text":"Check execution and version of the underlying gnuplot process:","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"using Gnuplot\nGnuplot.gpversion()","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"Generate the first plot:","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"julia> @gp 1:9","category":"page"},{"location":"#Gnuplot.jl-1","page":"Home","title":"Gnuplot.jl","text":"","category":"section"},{"location":"#A-Julia-interface-to-Gnuplot.-1","page":"Home","title":"A Julia interface to Gnuplot.","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"The Gnuplot.jl package allows easy and fast use of gnuplot as a data visualization tool in Julia. Have a look at Basic usage and Examples for a quick overview. The package main features are:","category":"page"},{"location":"#","page":"Home","title":"Home","text":"fast time-to-first-plot (~1 sec);\nextremely concise yet meaningful syntax, makes it ideal for interactive data exploration;\nno need to learn new API functions or keywords: only two macros (@gp for 2D plots, @gsp for 3D plots) and a basic knowledge of gnuplot are enough to generate the most complex plots;\ntransparent interface between Julia and gnuplot to exploit all functionalities of the latter, both present and future ones;\nfast data transmission through system pipes (no temporary files involved);\navailability of all the palettes from ColorSchemes;\nsupport for multiple plots in one window, multiple plotting windows, as well as ASCII and Sixel plots (to plot directly in a terminal);\nsupport for histograms (both 1D and 2D);\nenhanced support for contour plots;\nexport to a huge number of formats such as pdf, png, LaTeX, svg, etc. (actually all those supported by gnuplot);\nsave sessions into gnuplot scripts enables easy plot reproducibility and modifications.","category":"page"},{"location":"#Yet-another-plotting-package?-1","page":"Home","title":"Yet another plotting package?","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"A powerful plotting framework is among the most important tool in the toolbox of any modern scientist and engineer. As such, it is hard to find a single package to fit all needs, and many solutions are indeed available in the Julia ecosystem.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Gnuplot.jl package fills the niche of users who needs:","category":"page"},{"location":"#","page":"Home","title":"Home","text":"publication-quality plots, by exploiting the capabilities of a widely used tool such as gnuplot, and its many output formats available;\na well-documented framework, by taking advantage of all the gnuplot documentation, tutorials and examples available on the web;\na fast response, by relying on an external program (rather than on a large Julia code base);\nan interactive data exploration framework, by exposing a carefully designed, extremely concise and easy to remember syntax (at least for users with minimal gnuplot knowledge);\na procedure to foster plot reproducibility by sharing just the data and commands in the form of gnuplot scripts, rather than the original Julia code.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Unlike other packages Gnuplot.jl is not a pure Julia solution as it depends on an external package to actually generate plots. However, if gnuplot is not available on a given platform, the package could still be used in \"dry\" mode, and no error for a missing dependency will be raised (see Dry sessions).","category":"page"},{"location":"#","page":"Home","title":"Home","text":"The Gnuplot.jl package development follows a minimalistic approach: it is essentially a thin layer to send data and string commands to gnuplot. This way all underlying capabilities, both present and future ones, are automatically exposed to Julia user, with no need to implement dedicated wrappers.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"The functionalities 1, 2 and 3 listed above are similar to those provided by the Gaston package. Gnuplot.jl also provides features 4 and 5, as well as the minimalistic approach.","category":"page"},{"location":"#Do-Gnuplot.jl-suits-my-needs?-1","page":"Home","title":"Do Gnuplot.jl suits my needs?","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"Any modern plotting package is able to produce a simple scatter plot, with custom symbols, line styles, colors and axis labels. Indeed, this is exactly the example that is reported in every package documentation (also here: see 2D plots). Still, producing complex and publication-quality plots is not an easy task. As a consequence is also not easy to determine whether a package can cope with the most difficult cases (unless you actually try it out) and a reasonable choice is typically to rely on the size of the user base, the availability of documentation / tutorials, and the possibility to preview complex examples.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Gnuplot.jl aims to be ready for even the most challenging plots by relying on the widely and long lasting used gnuplot application, and by allowing each native feature (both present and future ones) to be immediately available in the Julia language. Moreover, Gnuplot.jl provides a unique syntax specifically aimed to increase productivity while performing interactive data exploration.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Last but not least, have a look at the Gnuplot.jl Examples page.","category":"page"},{"location":"#Notation-1","page":"Home","title":"Notation","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"In this documentation:","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Gnuplot.jl refers to the Julia package;\ngnuplot refers to the gnuplot application.","category":"page"},{"location":"#Table-of-Contents-1","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"Pages = [\"index.md\", \"install.md\", \"basic.md\", \"advanced.md\", \"examples.md\", \"api.md\"]","category":"page"},{"location":"tips/#Tips-1","page":"Tips","title":"Tips","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"This page collects useful tips in using Gnuplot.jl.","category":"page"},{"location":"tips/#Which-terminal-should-I-use-?-1","page":"Tips","title":"Which terminal should I use ?","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"Gnuplot provides dozens of terminals to display and export plots. Here we report a few tips on how to exploit the most used terminals.","category":"page"},{"location":"tips/#wxt-and-qt-1","page":"Tips","title":"wxt and qt","text":"","category":"section"},{"location":"tips/#Mouse-interactions-1","page":"Tips","title":"Mouse interactions","text":"","category":"section"},{"location":"tips/#dumb-and-sixelgd-1","page":"Tips","title":"dumb and sixelgd","text":"","category":"section"},{"location":"tips/#cairopng-1","page":"Tips","title":"cairopng","text":"","category":"section"},{"location":"tips/#gif-1","page":"Tips","title":"gif","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"see Animations.","category":"page"},{"location":"tips/#pdf-1","page":"Tips","title":"pdf","text":"","category":"section"},{"location":"tips/#latex-and-cairolatex-1","page":"Tips","title":"latex and cairolatex","text":"","category":"section"},{"location":"tips/#unknown-1","page":"Tips","title":"unknown","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"This is a dummy terminal, it produces no output. It is mainly used for debugging purposes.","category":"page"}] +[{"location":"api/#API-1","page":"API","title":"API","text":"","category":"section"},{"location":"api/#Exported-symbols-1","page":"API","title":"Exported symbols","text":"","category":"section"},{"location":"api/#","page":"API","title":"API","text":"The list of Gnuplot.jl exported symbols is as follows:","category":"page"},{"location":"api/#","page":"API","title":"API","text":"@gp\n@gsp\nsave","category":"page"},{"location":"api/#Gnuplot.@gp","page":"API","title":"Gnuplot.@gp","text":"@gp args...\n\nThe @gp macro, and its companion @gsp for 3D plots, allows to send data and commands to the gnuplot using an extremely concise syntax. The macros accepts any number of arguments, with the following meaning:\n\none, or a group of consecutive, array(s) build up a dataset. The different arrays are accessible as columns 1, 2, etc. from the gnuplot process. The number of required input arrays depends on the chosen plot style (see gnuplot documentation);\na string occurring before a dataset is interpreted as a gnuplot command (e.g. set grid);\na string occurring immediately after a dataset is interpreted as a plot element for the dataset, by which you can specify using clause, with clause, line styles, etc.. All keywords may be abbreviated following gnuplot conventions. Moreover, \"plot\" and \"splot\" can be abbreviated to \"p\" and \"s\" respectively;\nthe special symbol :-, whose meaning is to avoid starting a new plot (if given as first argument), or to avoid immediately running all commands to create the final plot (if given as last argument). Its purpose is to allow splitting one long statement into multiple (shorter) ones;\nany other symbol is interpreted as a session ID;\nan Int (> 0) is interpreted as the plot destination in a multi-plot session (this specification applies to subsequent arguments, not previous ones);\nan input in the form keyword=value is interpreted as a keyword/value pair. The accepted keywords and their corresponding gnuplot commands are as follows:\nxrange=[low, high] => \"set xrange [low:high];\nyrange=[low, high] => \"set yrange [low:high];\nzrange=[low, high] => \"set zrange [low:high];\ncbrange=[low, high]=> \"set cbrange[low:high];\nkey=\"...\" => \"set key ...\";\ntitle=\"...\" => \"set title \"...\"\";\nxlabel=\"...\" => \"set xlabel \"...\"\";\nylabel=\"...\" => \"set ylabel \"...\"\";\nzlabel=\"...\" => \"set zlabel \"...\"\";\nxlog=true => set logscale x;\nylog=true => set logscale y;\nzlog=true => set logscale z.\n\nAll Keyword names can be abbreviated as long as the resulting name is unambiguous. E.g. you can use xr=[1,10] in place of xrange=[1,10];\n\nan input in the form \"name\"=>(array1, array2, etc...) is interpreted as a named dataset.\n\n\n\n\n\n","category":"macro"},{"location":"api/#Gnuplot.@gsp","page":"API","title":"Gnuplot.@gsp","text":"@gsp args...\n\nThis macro accepts the same syntax as @gp, but produces a 3D plot instead of a 2D one.\n\n\n\n\n\n","category":"macro"},{"location":"api/#Gnuplot.save","page":"API","title":"Gnuplot.save","text":"save(sid::Symbol; term=\"\", output=\"\")\nsave(sid::Symbol, script_filename::String, ;term=\"\", output=\"\")\nsave(; term=\"\", output=\"\")\nsave(script_filename::String ;term=\"\", output=\"\")\n\nExport a (multi-)plot into the external file name provided in the output= keyword. The gnuplot terminal to use is provided through the term= keyword.\n\nIf the script_filename argument is provided a gnuplot script will be written in place of the output image. The latter can then be used in a pure gnuplot session (Julia is no longer needed) to generate exactly the same original plot.\n\nIf the sid argument is provided the operation applies to the corresponding session.\n\n\n\n\n\n","category":"function"},{"location":"api/#Non-exported-symbols-1","page":"API","title":"Non-exported symbols","text":"","category":"section"},{"location":"api/#","page":"API","title":"API","text":"The following functions are not exported by the Gnuplot.jl package since they are typically not used in every day work, or aimed to debugging purposes. Still, they can be useful in some case, hence they are documented here.","category":"page"},{"location":"api/#","page":"API","title":"API","text":"In order to call these functions you should add the Gnuplot. prefix to the function name.","category":"page"},{"location":"api/#","page":"API","title":"API","text":"Gnuplot.exec\nGnuplot.gpversion\nGnuplot.quit\nGnuplot.quitall\nGnuplot.version","category":"page"},{"location":"api/#Gnuplot.exec","page":"API","title":"Gnuplot.exec","text":"Gnuplot.exec(sid::Symbol, command::String)\nGnuplot.exec(command::String)\n\nExecute the gnuplot command command on the underlying gnuplot process of the sid session, and return the results as a Vector{String}. If a gnuplot error arises it is propagated as an ErrorException.\n\nThe sid argument is (optional): if not given, :default is used.\n\nExamples:\n\nGnuplot.exec(\"print GPVAL_TERM\")\nGnuplot.exec(\"plot sin(x)\")\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.gpversion","page":"API","title":"Gnuplot.gpversion","text":"Gnuplot.gpversion()\n\nReturns the gnuplot application version.\n\nRaise an error if version is < 4.7 (required to use data blocks).\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.quit","page":"API","title":"Gnuplot.quit","text":"Gnuplot.quit(sid::Symbol)\n\nQuit the session identified by sid and the associated gnuplot process (if any).\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.quitall","page":"API","title":"Gnuplot.quitall","text":"Gnuplot.quitall()\n\nQuit all the sessions and the associated gnuplot processes.\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.version","page":"API","title":"Gnuplot.version","text":"Gnuplot.version()\n\nReturns the Gnuplot.jl package version.\n\n\n\n\n\n","category":"function"},{"location":"basic/#Basic-usage-1","page":"Basic usage","title":"Basic usage","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The main purpose of the Gnuplot.jl package is to send data and commands to the underlying gnuplot process, in order to generate plots. Unlike other packages, however, the actual commands to plot, or the plot attributes, are not specified through function calls. This is what makes Gnuplot.jl easy to learn and use: there are no functions or keywords names to memorize[1].","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The most important symbols exported by the package are the @gp (for 2D plots) and @gsp (for 3D plots) macros, both accepting any number of arguments, and whose meaning is interpreted as follows:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"one, or a group of consecutive, array(s) build up a dataset. The different arrays are accessible as columns 1, 2, etc. from the gnuplot process. The number of required input arrays depends on the chosen plot style (see gnuplot documentation);\na string occurring before a dataset is interpreted as a gnuplot command (e.g. set grid);\na string occurring immediately after a dataset is interpreted as a plot element for the dataset, by which you can specify using clause, with clause, line styles, etc.;\nthe special symbol :-, whose meaning is to avoid starting a new plot (if given as first argument), or to avoid immediately running all commands to create the final plot (if given as last argument). Its purpose is to allow splitting one long statement into multiple (shorter) ones.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The above lists all the required concepts to follow the examples presented below. The @gp and @gsp macros also accepts further arguments, but their use will be discussed in Advanced techniques.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"[1]: a previous knowledge of gnuplot usage is, nevertheless, required.","category":"page"},{"location":"basic/#plots2d-1","page":"Basic usage","title":"2D plots","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Here we will show a few examples to generate 2D plots. The examples are intentionally very simple to highlight the behavior of Gnuplot.jl. See Examples for more complex ones.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Remember to run:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"using Gnuplot","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"before running the examples.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"using Gnuplot\nGnuplot.quitall()\nmkdir(\"assets\")\nGnuplot.splash(\"assets/logo.png\")\nsaveas(file) = save(term=\"pngcairo size 480,360\", output=\"assets/$(file).png\")\nempty!(Gnuplot.options.init)\npush!(Gnuplot.options.init, \"set term unknown\")","category":"page"},{"location":"basic/#Simple-examples-involving-just-gnuplot-commands:-1","page":"Basic usage","title":"Simple examples involving just gnuplot commands:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Plot-a-sinusoid:-1","page":"Basic usage","title":"Plot a sinusoid:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"plot sin(x)\"\nsaveas(\"basic1\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Plot-two-curves:-1","page":"Basic usage","title":"Plot two curves:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set key left\" \"plot sin(x)\" \"pl cos(x)\"\nsaveas(\"basic2\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"note: Note\nNote that all gnuplot commands can be abbreviated as long as the resulting string is not ambiguous. In the example above we used pl in place of plot.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Split-a-@gp-call-in-three-statements:-1","page":"Basic usage","title":"Split a @gp call in three statements:","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set grid\" :-\n@gp :- \"p sin(x)\" :-\n@gp :- \"plo cos(x)\"\nsaveas(\"basic3\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#Send-data-from-Julia-to-gnuplot:-1","page":"Basic usage","title":"Send data from Julia to gnuplot:","text":"","category":"section"},{"location":"basic/#Plot-a-parabola-1","page":"Basic usage","title":"Plot a parabola","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp (1:20).^2\nsaveas(\"basic4\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Plot-a-parabola-with-scaled-x-axis,-lines-and-legend-1","page":"Basic usage","title":"Plot a parabola with scaled x axis, lines and legend","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 1:20\n@gp \"set key left\" x ./ 20 x.^2 \"with lines tit 'Parabola'\"\nsaveas(\"basic5\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Multiple-datasets,-logarithmic-axis,-labels-and-colors,-etc.-1","page":"Basic usage","title":"Multiple datasets, logarithmic axis, labels and colors, etc.","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 1:0.1:10\n@gp \"set grid\" \"set key left\" \"set logscale y\"\n@gp :- \"set title 'Plot title'\" \"set label 'X label'\" \"set xrange [0:12]\"\n@gp :- x x.^0.5 \"w l tit 'Pow 0.5' dt 2 lw 2 lc rgb 'red'\"\n@gp :- x x \"w l tit 'Pow 1' dt 1 lw 3 lc rgb 'blue'\"\n@gp :- x x.^2 \"w l tit 'Pow 2' dt 3 lw 2 lc rgb 'purple'\"\nsaveas(\"basic6\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"note: Note\nThe above example lacks the trailing :- symbol. This means the plot will be updated at each command, adding one curve at a time.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"","category":"page"},{"location":"basic/#Keywords-for-common-commands-1","page":"Basic usage","title":"Keywords for common commands","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"In order to avoid typing long, and very frequently used gnuplot commands, Gnuplot.jl provides a few keywords which can be used in both @gp and @sgp calls:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"xrange=[low, high] => \"set xrange [low:high];\nyrange=[low, high] => \"set yrange [low:high];\nzrange=[low, high] => \"set zrange [low:high];\ncbrange=[low, high]=> \"set cbrange[low:high];\nkey=\"...\" => \"set key ...\";\ntitle=\"...\" => \"set title \\\"...\\\"\";\nxlabel=\"...\" => \"set xlabel \\\"...\\\"\";\nylabel=\"...\" => \"set ylabel \\\"...\\\"\";\nzlabel=\"...\" => \"set zlabel \\\"...\\\"\";\nxlog=true => set logscale x;\nylog=true => set logscale y;\nzlog=true => set logscale z;","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"All such keywords can be abbreviated to unambiguous names.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"By using the above keywords the first lines of the previous example:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set grid\" \"set key left\" \"set logscale y\"\n@gp :- \"set title 'Plot title'\" \"set label 'X label'\" \"set xrange [0:12]\"","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"can be replaced with a shorter version:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp \"set grid\" k=\"left\" ylog=true\n@gp :- tit=\"Plot title\" xlab=\"X label\" xr=[0,12]","category":"page"},{"location":"basic/#Plot-images-1","page":"Basic usage","title":"Plot images","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Gnuplot.jl can also display images, i.e. 2D arrays:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"img = randn(Float64, 30, 50)\nimg[10,:] .= -4\n@gp img \"w image notit\"\nsaveas(\"basic7a\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Note that the first index corresponds to the X coordinate when the image is displayed.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The following example shows how to fix orientation of an image by means of the using clause (the TestImages package is required to run this example):","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"using TestImages\nimg = testimage(\"lena\");\n@gp \"set size square\" \"set autoscale fix\" img \"u 2:(-\\$1):3:4:5 with rgbimage notit\"\nsave(term=\"jpeg size 480,360\", output=\"assets/basic7b.jpg\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#plots3d-1","page":"Basic usage","title":"3D plots","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"3D plots follow the same rules as 2D ones, just replace the @gp macro with @gsp and add the required columns (according to the plotting style).","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"E.g., to plot a spiral increasing in size along the X direction:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 0:0.1:10pi\n@gsp x sin.(x) .* x cos.(x) .* x x./20 \"w p pt 7 ps var lc pal\"\nsaveas(\"basic8\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The keywords discussed above can also be used in 3D plots.","category":"page"},{"location":"basic/#Palettes-and-line-types-1","page":"Basic usage","title":"Palettes and line types","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The Gnuplot.jl package comes with all the ColorSchemes palettes readily available.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"A gnuplot-compliant palette can be retrieved with palette(), and used as any other command. The previous example may use an alternative palette with:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"x = 0:0.1:10pi\n@gsp palette(:viridis) x sin.(x) .* x cos.(x) .* x x./20 \"w p pt 7 ps var lc pal\"\nsaveas(\"basic8a\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The ColorSchemes palettes can also be used to generate line types (actually just color attributes), by means of the linetypes() function, e.g.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"@gp linetypes(:deepsea)\nx = 1:0.1:4pi\nfor i in 1:5\n @gp :- x i.* sin.(x) \"w l notit lw 5\"\nend\nsaveas(\"basic9\") # hide","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"(Image: )","category":"page"},{"location":"basic/#Exporting-plots-to-files-1","page":"Basic usage","title":"Exporting plots to files","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The save() function allows to export all plots (as well as multiplots, see Multiplot) to a file using one of the many available gnuplot terminals. To check which terminals are available in your platform type set term in your gnuplot terminal.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"All plots in this page have been saved with:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"save(term=\"pngcairo size 480,360\", output=\"assets/output.png\")","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"except the Lena image, saved with the jpeg terminal:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"save(term=\"jpeg size 480,360\", output=\"assets/output.png\")","category":"page"},{"location":"basic/#Gnuplot-scripts-1","page":"Basic usage","title":"Gnuplot scripts","text":"","category":"section"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Besides exporting plots in a file Gnuplot.jl can also save a script, i.e. a file containing the minimum set of data and commands required to generate a plot within gnuplot.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"To generate a script for one of the example above use:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"save(\"script.gp\")","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"after the plot has been displayed. The script can then be used within a gnuplot session as follows:","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"gunplot> load 'script.gp'","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"to generate a plot identical to the original one, without using the Julia language.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"The purpose of gnuplot scripts is to allow sharing all data, alongside a plot, in order to foster collaboration among scientists and replicability of results. Moreover, a script can be used at any time to change the details of a plot, without the need to re-run the Julia code used to generate it the first time.","category":"page"},{"location":"basic/#","page":"Basic usage","title":"Basic usage","text":"Finally, the scripts are the only possible output when Dry sessions are used (i.e. when gnuplot is not available in the user platform.","category":"page"},{"location":"examples/#Examples-1","page":"Examples","title":"Examples","text":"","category":"section"},{"location":"examples/#","page":"Examples","title":"Examples","text":"An exhaustive gallery of example is available here:","category":"page"},{"location":"examples/#","page":"Examples","title":"Examples","text":"https://lazarusa.github.io/gnuplot-examples/","category":"page"},{"location":"examples/#","page":"Examples","title":"Examples","text":"Further gnuplot examples can be found here: http://www.gnuplotting.org/","category":"page"},{"location":"advanced/#Advanced-techniques-1","page":"Advanced techniques","title":"Advanced techniques","text":"","category":"section"},{"location":"advanced/#Multiplot-1","page":"Advanced techniques","title":"Multiplot","text":"","category":"section"},{"location":"advanced/#Mixing-2D-and-3D-plots-1","page":"Advanced techniques","title":"Mixing 2D and 3D plots","text":"","category":"section"},{"location":"advanced/#","page":"Advanced techniques","title":"Advanced techniques","text":"\n@gp \"set multiplot layout 1,2\"\n@gp :- 1 \"plot sin(x) w l\"\n\n\nx = y = -10:0.33:10\nfz(x,y) = sin.(sqrt.(x.^2 + y.^2))./sqrt.(x.^2+y.^2)\nfxy = [fz(x,y) for x in x, y in y]\n\n@gsp :- 2 x y fxy \"w pm3d notit\"\n","category":"page"},{"location":"advanced/#Multiple-sessions-1","page":"Advanced techniques","title":"Multiple sessions","text":"","category":"section"},{"location":"advanced/#Named-datasets-1","page":"Advanced techniques","title":"Named datasets","text":"","category":"section"},{"location":"advanced/#Histograms-(1D)-1","page":"Advanced techniques","title":"Histograms (1D)","text":"","category":"section"},{"location":"advanced/#Histograms-(2D)-1","page":"Advanced techniques","title":"Histograms (2D)","text":"","category":"section"},{"location":"advanced/#Contour-lines-1","page":"Advanced techniques","title":"Contour lines","text":"","category":"section"},{"location":"advanced/#Animations-1","page":"Advanced techniques","title":"Animations","text":"","category":"section"},{"location":"advanced/#Dry-sessions-1","page":"Advanced techniques","title":"Dry sessions","text":"","category":"section"},{"location":"advanced/#Options-1","page":"Advanced techniques","title":"Options","text":"","category":"section"},{"location":"install/#Installation-1","page":"Installation","title":"Installation","text":"","category":"section"},{"location":"install/#Prerequisite-1","page":"Installation","title":"Prerequisite","text":"","category":"section"},{"location":"install/#","page":"Installation","title":"Installation","text":"In order to use the Gnuplot.jl package you'll need gnuplot (ver. >= 4.7) installed on your system, and its executable available in your path.","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"If gnuplot is not available in your platform you can still use Gnuplot.jl in \"dry\" mode (see Dry sessions). In this case a plot can not be generated, but you may still generate Gnuplot scripts.","category":"page"},{"location":"install/#Package-installation-1","page":"Installation","title":"Package installation","text":"","category":"section"},{"location":"install/#","page":"Installation","title":"Installation","text":"In the Julia REPL type:","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"julia> ]add Gnuplot","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"Then hit backspace key to return to Julia REPL.","category":"page"},{"location":"install/#Check-installation-1","page":"Installation","title":"Check installation","text":"","category":"section"},{"location":"install/#","page":"Installation","title":"Installation","text":"Check execution and version of the underlying gnuplot process:","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"using Gnuplot\nGnuplot.gpversion()","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"Generate the first plot:","category":"page"},{"location":"install/#","page":"Installation","title":"Installation","text":"julia> @gp 1:9","category":"page"},{"location":"#Gnuplot.jl-1","page":"Home","title":"Gnuplot.jl","text":"","category":"section"},{"location":"#A-Julia-interface-to-*gnuplot*.-1","page":"Home","title":"A Julia interface to gnuplot.","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"The Gnuplot.jl package allows easy and fast use of gnuplot as a data visualization tool in Julia. Have a look at Basic usage and Examples for a quick overview. The package main features are:","category":"page"},{"location":"#","page":"Home","title":"Home","text":"fast time-to-first-plot (~1 sec);\nextremely concise yet meaningful syntax, makes it ideal for interactive data exploration;\nno need to learn new API functions or keywords: only two macros (@gp for 2D plots, @gsp for 3D plots) and a basic knowledge of gnuplot are enough to generate the most complex plots;\ntransparent interface between Julia and gnuplot to exploit all functionalities of the latter, both present and future ones;\nfast data transmission through system pipes (no temporary files involved);\navailability of all the palettes from ColorSchemes;\nsupport for multiple plots in one window, multiple plotting windows, as well as ASCII and Sixel plots (to plot directly in a terminal);\nsupport for histograms (both 1D and 2D);\nenhanced support for contour plots;\nexport to a huge number of formats such as pdf, png, LaTeX, svg, etc. (actually all those supported by gnuplot);\nsave sessions into gnuplot scripts enables easy plot reproducibility and modifications.","category":"page"},{"location":"#Yet-another-plotting-package?-1","page":"Home","title":"Yet another plotting package?","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"A powerful plotting framework is among the most important tool in the toolbox of any modern scientist and engineer. As such, it is hard to find a single package to fit all needs, and many solutions are indeed available in the Julia ecosystem.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Gnuplot.jl package fills the niche of users who needs:","category":"page"},{"location":"#","page":"Home","title":"Home","text":"publication-quality plots, by exploiting the capabilities of a widely used tool such as gnuplot, and its many output formats available;\na well-documented framework, by taking advantage of all the gnuplot documentation, tutorials and examples available on the web;\na fast response, by relying on an external program (rather than on a large Julia code base);\nan interactive data exploration framework, by exposing a carefully designed, extremely concise and easy to remember syntax (at least for users with minimal gnuplot knowledge);\na procedure to foster plot reproducibility by sharing just the data and commands in the form of gnuplot scripts, rather than the original Julia code.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Unlike other packages Gnuplot.jl is not a pure Julia solution as it depends on an external package to actually generate plots. However, if gnuplot is not available on a given platform, the package could still be used in \"dry\" mode, and no error for a missing dependency will be raised (see Dry sessions).","category":"page"},{"location":"#","page":"Home","title":"Home","text":"The Gnuplot.jl package development follows a minimalistic approach: it is essentially a thin layer to send data and string commands to gnuplot. This way all underlying capabilities, both present and future ones, are automatically exposed to Julia user, with no need to implement dedicated wrappers.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"The functionalities 1, 2 and 3 listed above are similar to those provided by the Gaston package. Gnuplot.jl also provides features 4 and 5, as well as the minimalistic approach.","category":"page"},{"location":"#Do-Gnuplot.jl-suits-my-needs?-1","page":"Home","title":"Do Gnuplot.jl suits my needs?","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"Any modern plotting package is able to produce a simple scatter plot, with custom symbols, line styles, colors and axis labels. Indeed, this is exactly the example that is reported in every package documentation (also here: see 2D plots). Still, producing complex and publication-quality plots is not an easy task. As a consequence is also not easy to determine whether a package can cope with the most difficult cases (unless you actually try it out) and a reasonable choice is typically to rely on the size of the user base, the availability of documentation / tutorials, and the possibility to preview complex examples.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Gnuplot.jl aims to be ready for even the most challenging plots by relying on the widely and long lasting used gnuplot application, and by allowing each native feature (both present and future ones) to be immediately available in the Julia language. Moreover, Gnuplot.jl provides a unique syntax specifically aimed to increase productivity while performing interactive data exploration.","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Last but not least, have a look at the Gnuplot.jl Examples page.","category":"page"},{"location":"#Notation-1","page":"Home","title":"Notation","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"In this documentation:","category":"page"},{"location":"#","page":"Home","title":"Home","text":"Gnuplot.jl refers to the Julia package;\ngnuplot refers to the gnuplot application.","category":"page"},{"location":"#Table-of-Contents-1","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"#","page":"Home","title":"Home","text":"Pages = [\"index.md\", \"install.md\", \"basic.md\", \"advanced.md\", \"examples.md\", \"api.md\"]","category":"page"},{"location":"tips/#Tips-1","page":"Tips","title":"Tips","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"This page collects useful tips in using Gnuplot.jl.","category":"page"},{"location":"tips/#Which-terminal-should-I-use-?-1","page":"Tips","title":"Which terminal should I use ?","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"Gnuplot provides dozens of terminals to display and export plots. Here we report a few tips on how to exploit the most used terminals.","category":"page"},{"location":"tips/#wxt-and-qt-1","page":"Tips","title":"wxt and qt","text":"","category":"section"},{"location":"tips/#Mouse-interactions-1","page":"Tips","title":"Mouse interactions","text":"","category":"section"},{"location":"tips/#dumb-and-sixelgd-1","page":"Tips","title":"dumb and sixelgd","text":"","category":"section"},{"location":"tips/#cairopng-1","page":"Tips","title":"cairopng","text":"","category":"section"},{"location":"tips/#gif-1","page":"Tips","title":"gif","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"see Animations.","category":"page"},{"location":"tips/#pdf-1","page":"Tips","title":"pdf","text":"","category":"section"},{"location":"tips/#latex-and-cairolatex-1","page":"Tips","title":"latex and cairolatex","text":"","category":"section"},{"location":"tips/#unknown-1","page":"Tips","title":"unknown","text":"","category":"section"},{"location":"tips/#","page":"Tips","title":"Tips","text":"This is a dummy terminal, it produces no output. It is mainly used for debugging purposes.","category":"page"}] } diff --git a/dev/tips/index.html b/dev/tips/index.html index 97d62d9..82b6547 100644 --- a/dev/tips/index.html +++ b/dev/tips/index.html @@ -1,2 +1,2 @@ -Tips · Gnuplot.jl
      +Tips · Gnuplot.jl