From 17d751cb667bc15b0941a179d41b750d19740260 Mon Sep 17 00:00:00 2001 From: Giorgio Calderone Date: Thu, 26 Mar 2020 23:10:21 +0100 Subject: [PATCH] Docstrings updated --- dev/advanced/index.html | 2 +- dev/api/index.html | 23 ++++++++++++++++++++--- dev/assets/basic7a.png | Bin 18861 -> 18867 bytes dev/basic/index.html | 2 +- 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 +- 10 files changed, 28 insertions(+), 11 deletions(-) diff --git a/dev/advanced/index.html b/dev/advanced/index.html index f6a3145..bf3214d 100644 --- a/dev/advanced/index.html +++ b/dev/advanced/index.html @@ -9,4 +9,4 @@ fz(x,y) = sin.(sqrt.(x.^2 + y.^2))./sqrt.(x.^2+y.^2) fxy = [fz(x,y) for x in x, y in y] @gsp :- 2 x y fxy "w pm3d notit" -

Multiple sessions

Named datasets

Histograms (1D)

Histograms (2D)

Contour lines

Animations

Dry sessions

Options

+

Multiple sessions

Named datasets

Histograms (1D)

Histograms (2D)

Contour lines

Animations

Dry sessions

Options

diff --git a/dev/api/index.html b/dev/api/index.html index 52ec8d5..bb2ba41 100644 --- a/dev/api/index.html +++ b/dev/api/index.html @@ -1,7 +1,24 @@ -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="")
+API · Gnuplot.jl

API

Index

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.contourlinesFunction
contourlines(x::Vector{Float64}, y::Vector{Float64}, h::Matrix{Float64}; cntrparam="level auto 10")

Compute paths of contour lines for 2D data, and return a vector of IsoContourLines object.

Arguments:

  • x, y: Coordinates;
  • h: the levels on which iso contour lines are to be calculated
  • cntrparam: settings to compute contour line paths (see gnuplot documentation for cntrparam).

Example

x = randn(5000);
+y = randn(5000);
+h = hist(x, y, nbins1=20, nbins2=20);
+clines = contourlines(h.bins1, h.bins2, h.counts, cntrparam="levels discrete 15, 30, 45");
+@gp "set size ratio -1"
+for i in 1:length(clines)
+    @gp :- clines[i].data "w l t '$(clines[i].z)' dt $i"
+end
source
Gnuplot.histFunction
hist(v::Vector{T}; range=extrema(v), bs=NaN, nbins=0, pad=true) where T <: Number

Calculates the histogram of the values in v and returns a Histogram1D structure.

Arguments

  • v: a vector of values to compute the histogra;
  • range: values of the left edge of the first bin and of the right edge of the last bin;
  • bs: size of histogram bins;
  • nbins: number of bins in the histogram;
  • pad: if true add one dummy bins with zero counts before the first bin and after the last.

If bs is given nbins is ignored.

Example

v = randn(1000)
+h = hist(v, bs=0.5)
+@gp h  # preview
+@gp h.bins h.counts "w histep notit"
source
hist(v1::Vector{T1 <: Number}, v2::Vector{T2 <: Number}; range1=[NaN,NaN], bs1=NaN, nbins1=0, range2=[NaN,NaN], bs2=NaN, nbins2=0)

Calculates the 2D histogram of the values in v1 and v2 and returns a Histogram2D structure.

Arguments

  • v1: a vector of values along the first dimension;
  • v2: a vector of values along the second dimension;
  • range1: values of the left edge of the first bin and of the right edge of the last bin, along the first dimension;
  • range1: values of the left edge of the first bin and of the right edge of the last bin, along the second dimension;
  • bs1: size of histogram bins along the first dimension;
  • bs2: size of histogram bins along the second dimension;
  • nbins1: number of bins along the first dimension;
  • nbins2: number of bins along the second dimension;

If bs1 (bs2) is given nbins1 (nbins2) is ignored.

Example

v1 = randn(1000)
+v2 = randn(1000)
+h = hist(v1, v2, bs1=0.5, bs2=0.5)
+@gp h  # preview
+@gp "set size ratio -1" "set auto fix" h.bins1 h.bins2 h.counts "w image notit"
source
Gnuplot.linetypesFunction
linetypes(cmap::ColorScheme)
+linetypes(s::Symbol)

Convert a ColorScheme object into a string containing the gnuplot commands to set up linetype colors.

If the argument is a Symbol it is interpreted as the name of one of the predefined schemes in ColorSchemes.

source
Gnuplot.paletteFunction
palette(cmap::ColorScheme)
+palette(s::Symbol)

Convert a ColorScheme object into a string containing the gnuplot commands to set up the corresponding palette.

If the argument is a Symbol it is interpreted as the name of one of the predefined schemes in ColorSchemes.

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)
+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
Gnuplot.terminalsFunction
terminals()

Return a Vector{String} with the names of all the available gnuplot terminals.

source
Gnuplot.terminalFunction
terminal(sid::Symbol = :default)

Return a String with the current gnuplot terminal (and its options) of the process associated to session sid.

source
Gnuplot.test_terminalFunction
test_terminal(term=nothing; linetypes=nothing, palette=nothing)

Run the test and test palette commands on a gnuplot terminal.

If no term is given it will use the default terminal. If linetypes and palette are given they are used as input to the linetypes and palette function repsetcively to load the associated color scheme.

Examples

test_terminal()
+test_terminal("wxt", linetypes=:rust, palette=:viridis)
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.Histogram1DType
Histogram1D

A 1D histogram data.

Fields

  • bins::Vector{Float64}: middle points of the bins;
  • counts::Vector{Float64}: couts in the bins;
  • binsize::Float64: size of each bin;
source
Gnuplot.Histogram2DType
Histogram2D

A 2D histogram data.

Fields

  • bins1::Vector{Float64}: middle points of the bins along first dimension;
  • bins2::Vector{Float64}: middle points of the bins along second dimension;
  • counts::Vector{Float64}: couts in the bins;
  • binsize1::Float64: size of each bin along first dimension;
  • binsize2::Float64: size of each bin along second dimension;
source
Gnuplot.IsoContourLinesType
IsoContourLines

Coordinates of all contour lines of a given level.

Fields

  • paths::Vector{Path2d}: vector of Path2d objects, one for each continuous path;
  • data::Vector{String}: vector with string representation of all paths (ready to be sent to gnuplot);
  • z::Float64: level of the contour lines.
source
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
+Gnuplot.exec("plot sin(x)")
source
Gnuplot.gpversionFunction
Gnuplot.gpversion()

Return 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 6d414dabf373cbe52ccd4f14303eef7a7bfd0ed9..0659dc0a5aff20440cb2168664bbb9d30c2f6b1e 100644 GIT binary patch literal 18867 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 R+dzjgdAj;io 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≠|Gav^=#DOs(1c7k*y&Ua%bLDu8 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

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 cad5aa4..19f3401 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 1477e88..bbd12f5 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 836c3a0..6d8abd2 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 1e6f108..018702c 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 9543e1d..d10cde4 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/#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"}] +[{"location":"api/#API-1","page":"API","title":"API","text":"","category":"section"},{"location":"api/#Index-1","page":"API","title":"Index","text":"","category":"section"},{"location":"api/#","page":"API","title":"API","text":"","category":"page"},{"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\ncontourlines\nhist\nlinetypes\npalette\nsave\nterminals\nterminal\ntest_terminal","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.contourlines","page":"API","title":"Gnuplot.contourlines","text":"contourlines(x::Vector{Float64}, y::Vector{Float64}, h::Matrix{Float64}; cntrparam=\"level auto 10\")\n\nCompute paths of contour lines for 2D data, and return a vector of IsoContourLines object.\n\nArguments:\n\nx, y: Coordinates;\nh: the levels on which iso contour lines are to be calculated\ncntrparam: settings to compute contour line paths (see gnuplot documentation for cntrparam).\n\nExample\n\nx = randn(5000);\ny = randn(5000);\nh = hist(x, y, nbins1=20, nbins2=20);\nclines = contourlines(h.bins1, h.bins2, h.counts, cntrparam=\"levels discrete 15, 30, 45\");\n@gp \"set size ratio -1\"\nfor i in 1:length(clines)\n @gp :- clines[i].data \"w l t '$(clines[i].z)' dt $i\"\nend\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.hist","page":"API","title":"Gnuplot.hist","text":"hist(v::Vector{T}; range=extrema(v), bs=NaN, nbins=0, pad=true) where T <: Number\n\nCalculates the histogram of the values in v and returns a Histogram1D structure.\n\nArguments\n\nv: a vector of values to compute the histogra;\nrange: values of the left edge of the first bin and of the right edge of the last bin;\nbs: size of histogram bins;\nnbins: number of bins in the histogram;\npad: if true add one dummy bins with zero counts before the first bin and after the last.\n\nIf bs is given nbins is ignored.\n\nExample\n\nv = randn(1000)\nh = hist(v, bs=0.5)\n@gp h # preview\n@gp h.bins h.counts \"w histep notit\"\n\n\n\n\n\nhist(v1::Vector{T1 <: Number}, v2::Vector{T2 <: Number}; range1=[NaN,NaN], bs1=NaN, nbins1=0, range2=[NaN,NaN], bs2=NaN, nbins2=0)\n\nCalculates the 2D histogram of the values in v1 and v2 and returns a Histogram2D structure.\n\nArguments\n\nv1: a vector of values along the first dimension;\nv2: a vector of values along the second dimension;\nrange1: values of the left edge of the first bin and of the right edge of the last bin, along the first dimension;\nrange1: values of the left edge of the first bin and of the right edge of the last bin, along the second dimension;\nbs1: size of histogram bins along the first dimension;\nbs2: size of histogram bins along the second dimension;\nnbins1: number of bins along the first dimension;\nnbins2: number of bins along the second dimension;\n\nIf bs1 (bs2) is given nbins1 (nbins2) is ignored.\n\nExample\n\nv1 = randn(1000)\nv2 = randn(1000)\nh = hist(v1, v2, bs1=0.5, bs2=0.5)\n@gp h # preview\n@gp \"set size ratio -1\" \"set auto fix\" h.bins1 h.bins2 h.counts \"w image notit\"\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.linetypes","page":"API","title":"Gnuplot.linetypes","text":"linetypes(cmap::ColorScheme)\nlinetypes(s::Symbol)\n\nConvert a ColorScheme object into a string containing the gnuplot commands to set up linetype colors.\n\nIf the argument is a Symbol it is interpreted as the name of one of the predefined schemes in ColorSchemes.\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.palette","page":"API","title":"Gnuplot.palette","text":"palette(cmap::ColorScheme)\npalette(s::Symbol)\n\nConvert a ColorScheme object into a string containing the gnuplot commands to set up the corresponding palette.\n\nIf the argument is a Symbol it is interpreted as the name of one of the predefined schemes in ColorSchemes.\n\n\n\n\n\n","category":"function"},{"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/#Gnuplot.terminals","page":"API","title":"Gnuplot.terminals","text":"terminals()\n\nReturn a Vector{String} with the names of all the available gnuplot terminals.\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.terminal","page":"API","title":"Gnuplot.terminal","text":"terminal(sid::Symbol = :default)\n\nReturn a String with the current gnuplot terminal (and its options) of the process associated to session sid.\n\n\n\n\n\n","category":"function"},{"location":"api/#Gnuplot.test_terminal","page":"API","title":"Gnuplot.test_terminal","text":"test_terminal(term=nothing; linetypes=nothing, palette=nothing)\n\nRun the test and test palette commands on a gnuplot terminal.\n\nIf no term is given it will use the default terminal. If linetypes and palette are given they are used as input to the linetypes and palette function repsetcively to load the associated color scheme.\n\nExamples\n\ntest_terminal()\ntest_terminal(\"wxt\", linetypes=:rust, palette=:viridis)\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.Histogram1D\nGnuplot.Histogram2D\nGnuplot.IsoContourLines\nGnuplot.Path2d\nGnuplot.exec\nGnuplot.gpversion\nGnuplot.quit\nGnuplot.quitall\nGnuplot.version","category":"page"},{"location":"api/#Gnuplot.Histogram1D","page":"API","title":"Gnuplot.Histogram1D","text":"Histogram1D\n\nA 1D histogram data.\n\nFields\n\nbins::Vector{Float64}: middle points of the bins;\ncounts::Vector{Float64}: couts in the bins;\nbinsize::Float64: size of each bin;\n\n\n\n\n\n","category":"type"},{"location":"api/#Gnuplot.Histogram2D","page":"API","title":"Gnuplot.Histogram2D","text":"Histogram2D\n\nA 2D histogram data.\n\nFields\n\nbins1::Vector{Float64}: middle points of the bins along first dimension;\nbins2::Vector{Float64}: middle points of the bins along second dimension;\ncounts::Vector{Float64}: couts in the bins;\nbinsize1::Float64: size of each bin along first dimension;\nbinsize2::Float64: size of each bin along second dimension;\n\n\n\n\n\n","category":"type"},{"location":"api/#Gnuplot.IsoContourLines","page":"API","title":"Gnuplot.IsoContourLines","text":"IsoContourLines\n\nCoordinates of all contour lines of a given level.\n\nFields\n\npaths::Vector{Path2d}: vector of Path2d objects, one for each continuous path;\ndata::Vector{String}: vector with string representation of all paths (ready to be sent to gnuplot);\nz::Float64: level of the contour lines.\n\n\n\n\n\n","category":"type"},{"location":"api/#Gnuplot.Path2d","page":"API","title":"Gnuplot.Path2d","text":"Path2d\n\nA path in 2D.\n\nFields\n\nx::Vector{Float64}\ny::Vector{Float64}\n\n\n\n\n\n","category":"type"},{"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\nReturn 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\nReturn 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)\nGnuplot.exec(\"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 82b6547..7f7e9ad 100644 --- a/dev/tips/index.html +++ b/dev/tips/index.html @@ -1,2 +1,2 @@ -Tips · Gnuplot.jl
      +Tips · Gnuplot.jl