I have been working with gnuplot for a while now. Recently started using it to create reports to send to customers. I tried to experiment with my plotting script but not much has come of it.
My question simply is, how to make charts from Gnuplot look really awesome? Think of D3/chartjs output for comparison.
I understand 'awesome' is subjective. But general pointers in this regard would help a lot!
Look for color palettes that you like online. One nice source is this.
Experiment with border styles, grid styles et cetera.
Once you are happy with it, put the style items in your gnuplotrc.
This is my gnuplotrc:
set encoding utf8
# See https://github.com/Gnuplotting/gnuplot-palettes
# Line styles (colorbrewer Set1)
set style line 1 lc rgb '#E41A1C' pt 1 ps 1 lt 1 lw 2 # red
set style line 2 lc rgb '#377EB8' pt 6 ps 1 lt 1 lw 2 # blue
set style line 3 lc rgb '#4DAF4A' pt 2 ps 1 lt 1 lw 2 # green
set style line 4 lc rgb '#984EA3' pt 3 ps 1 lt 1 lw 2 # purple
set style line 5 lc rgb '#FF7F00' pt 4 ps 1 lt 1 lw 2 # orange
set style line 6 lc rgb '#FFFF33' pt 5 ps 1 lt 1 lw 2 # yellow
set style line 7 lc rgb '#A65628' pt 7 ps 1 lt 1 lw 2 # brown
set style line 8 lc rgb '#F781BF' pt 8 ps 1 lt 1 lw 2 # pink
# Palette
set palette maxcolors 8
set palette defined ( 0 '#E41A1C', 1 '#377EB8', 2 '#4DAF4A', 3 '#984EA3',\
4 '#FF7F00', 5 '#FFFF33', 6 '#A65628', 7 '#F781BF' )
# Standard border
set style line 11 lc rgb '#808080' lt 1 lw 3
set border 0 back ls 11
set tics out nomirror
# Standard grid
set style line 12 lc rgb '#808080' lt 0 lw 1
set grid back ls 12
unset grid
And this is my template for gnuplot files:
set terminal pdfcairo enhanced color dashed font "Alegreya, 14" \
rounded size 16 cm, 9.6 cm
# Default encoding, line styles, pallette, border and grid are set in
# /usr/local/share/gnuplot/x.y/gnuplotrc.
set xlabel "x"
set ylabel "f(x)"
set grid
set key right top
set xrange[0:6.28]
set yrange[-1:1]
set output 'sinx.pdf'
plot sin(x) w l ls 1, cos(x) w l ls 2
(You should change the font to one that you have available.)
It looks like this:
Is this awesome? Well I like to think so! But in all seriousness, there are reasons for this layout.
I want the data to be paramount. That is why the border is not empasized and there is no background color.
Nevertheless, I want the viewer to see where the graph crosses the values shown on the labels, hence the visible tickmarks and (unobtrusive) grid.
To make the graphs "fit" into the style of the document I tend to do a couple of things:
Use the same font as the body text of my documents.
Use the same size, line style, borders et cetera for all the graphs in the document.
Match the graph size to the width of the column or text block.
Related
I am using the epslatex terminal, and I am trying to define specific line styles for my upcoming paper. I created the following styles:
set style line 1 lc rgb '#0060ad' pt 1 lt 1 lw 2 # blue
set style line 2 lc rgb '#dd181f' pt 2 lt 2 lw 2 # red
set style line 3 lc rgb '#ff9933' pt 3 lt 3 lw 2 # orange
set style line 4 lc rgb '#ffcc33' pt 4 lt 4 lw 2 # light orange
set style line 5 lc rgb '#336600' pt 5 lt 5 lw 2 # green
set style line 6 lc rgb '#9900CC' pt 6 lt 6 lw 2 # purple
set style line 7 lc rgb '#000000' pt 7 lt 7 lw 2 # black
However, the moment that I use the following styles in a different Figure, their appearance changes. What can I do to keep my plots' line style standard without changing when using the same terminal? I use lines with points style. Also, I can not change the thickness of the lines in the styles I use.
The standard gnuplot styles are stored somewhere (certainly somewhere in the gnuplot directory) and I am sure you can modify them such that after starting up of gnuplot you will have these as standard styles after gnuplot startup. (check help linestyles vs linetypes).
Anyway, the following is simple and flexible. Simply write your desired styles into a text file and load it during your scripts (check help load).
Style file: SO72347937_Styles.gp
set style line 1 lc rgb '#0060ad' pt 1 lt 1 lw 2 # blue
set style line 2 lc rgb '#dd181f' pt 2 lt 2 lw 2 # red
set style line 3 lc rgb '#ff9933' pt 3 lt 3 lw 2 # orange
set style line 4 lc rgb '#ffcc33' pt 4 lt 4 lw 2 # light orange
set style line 5 lc rgb '#336600' pt 5 lt 5 lw 2 # green
set style line 6 lc rgb '#9900CC' pt 6 lt 6 lw 2 # purple
set style line 7 lc rgb '#000000' pt 7 lt 7 lw 2 # black
Script:
### load custom style file
reset session
load "SO72347937_Styles.gp"
set key top left
set samples 20
plot for [i=1:7] '+' u 1:($1*i) w lp ls i ti sprintf("Style %d",i)
### end of code
Result:
I am using the bellow line styles in gnuplot. But because I have a lot of data and I would like to show 4 charts on the same line they became very small. Consequently, the line style loses its propose. Sometimes I cannot differentiate points, cross, stars.
What kind of line styles could I use to make the plots more clear?
If possible, I would like also to make them appear good also in black and white.
set style line 1 lc rgb '#E02F44' lt 1 lw 0.5 ps 0.3 pt 7 # input throughput
set style line 2 lc rgb '#FF780A' lt 1 lw 0.5 ps 0.3 pt 1 # output throughput
set style line 3 lc rgb '#56A64B' lt 2 lw 0.5 ps 0.3 pt 2 # average processing latency
set style line 4 lc rgb '#000000' lt 3 lw 0.5 ps 0.3 pt 3 # 99th percentile processing latency
set style line 5 lc rgb '#3274D9' lt 1 lw 0.5 ps 0.3 # pre-agg parameter
set style arrow 1 heads ls 4
I have created a graph that uses lines for the average of my data and filledcurves for the error (average-error, average+error). My problem is that the last filledcurves that is plotted, covers all other fills, even though I have set its transparency. I want to change this so that when two or more filledcurves meet the color is changed and thus the errors are clearly shown for all lines.
My script is:
set datafile separator whitespace
set style line 1 lc rgb '#aa5500' lt 1 lw 2 pt 7 ps 1
set style line 2 lc rgb '#55aaff' lt 1 lw 2 pt 7 ps 1
set style line 3 lc rgb '#aa557f' lt 1 lw 2 pt 7 ps 1
set style line 4 lc rgb '#55007f' lt 1 lw 2 pt 7 ps 1
set style line 5 lc rgb '#005500' lt 1 lw 2 pt 7 ps 1
set style line 6 lc rgb '#0055ff' lt 1 lw 2 pt 7 ps 1
set tics nomirror
set tics front
set style line 12 lc rgb '#808080' lt 0 lw 1
set grid front ls 12
set output 'network_utilization_servers_3_2.png'
set terminal png size 1000,800
set style fill transparent solid 0.25
set style fill noborder
set xrange[0:77]
set yrange[0:1500]
set xlabel "Time (seconds)" font ",12"
set ylabel "Incoming Traffic (KB/s)" font ",12"
set title "Network Utilization in the Servers" font "Helvetica,16"
set key box title "Server" width 10
plot for [i=0:|Group|-1] $Data3 u ($2-6):($3-$4):($3+$4) index i with filledcurves ls i+1 notitle, \
for [i=0:|Group|-1] $Data3 u ($2-6):3:4 index i w lines ti sprintf("%g",Group[i+1]) ls i+1
and my pragh:
My goal is something like this:
Is there a way to achieve this?
I'm programming a graph with axes (y "%" and x "date") and when less than 7 records have not shown well
These are the files
data.csv:
20-04-2016 96.8 95.8 100
21-04-2016 97.07 97.99 100
22-04-2016 98.05 99.5 100
23-04-2016 98.64 97.88 100
24-04-2016 98.96 98.99 100
25-04-2016 98.68 98.11 100
graph
reset
set terminal png size 1200,500
#set xlabel "Time (days)"
set xdata time
set timefmt "%d-%m-%Y"
set ylabel "Total Petitions (%)"
set yrange [95:100]
set title "Akamai"
set key reverse Left outside
set grid
set style data linespoints
plot "datos.csv" using 1:2 title "One (%)", \
"" using 1:3 title "Two (%)", \
"" using 1:4 title "Ideal (%)"
He shows me this
As shown, the dates are repeated, and I want one date per record appears.
I also like to put the date
%d-%m\n%Y
This is solved if I put 7 or more records
And this happens if I put the full date but the description of the axis x
It could put the date vertically?
Thank you very much for your help
Use set format x;
set terminal pngcairo enhanced color dashed \
rounded size 1200,500
set title "Akamai"
set xlabel "date"
set xdata time
set timefmt "%d-%m-%Y"
set format x "%d/%m\n%Y"
set xtics 86400
set nomxtics
set ylabel "Total Petitions (%)"
set yrange [95:100]
set style data linespoints
set grid
set key right bottom
set output 'user1847844.png'
plot "datos.csv" using 1:2 title "One (%)", \
"" using 1:3 title "Two (%)", \
"" using 1:4 title "Ideal (%)"
Internally, gnuplot converts datetimes to seconds. So the line set xtics 86400 basically says to make one tick per day since one day has 24*60*60 = 86400 seconds. The set nomxtics tells gnuplot to not show minor tick marks on the x-axis.
This gives:
If you want to rotate the label, use:
set format x "%d/%m/%Y"
set xtics rotate 86400
That should format the dates as a single line and rotate the labels by 90 degrees.
Update:
Note that I'm using the pngcairo terminal. This is based on the cairo graphics library. This is designed to give consistent output on all output media. But gnuplot must be compiled with cairo support for this to work.
In general, I prefer the pdfcairo terminal. This produces PDF output which can be scaled without giving pixellation effects.
Update 2:
To get consistency in my graphs, I've defined certain styles in my gnuplotrc, which I use in my graphs. The contents of my gnuplotrc are shown below.
set encoding utf8
# See https://github.com/Gnuplotting/gnuplot-palettes
# Line styles (colorbrewer Set1)
set style line 1 lc rgb '#E41A1C' pt 1 ps 1 lt 1 lw 2 # red
set style line 2 lc rgb '#377EB8' pt 6 ps 1 lt 1 lw 2 # blue
set style line 3 lc rgb '#4DAF4A' pt 2 ps 1 lt 1 lw 2 # green
set style line 4 lc rgb '#984EA3' pt 3 ps 1 lt 1 lw 2 # purple
set style line 5 lc rgb '#FF7F00' pt 4 ps 1 lt 1 lw 2 # orange
set style line 6 lc rgb '#FFFF33' pt 5 ps 1 lt 1 lw 2 # yellow
set style line 7 lc rgb '#A65628' pt 7 ps 1 lt 1 lw 2 # brown
set style line 8 lc rgb '#F781BF' pt 8 ps 1 lt 1 lw 2 # pink
# Palette
set palette maxcolors 8
set palette defined ( 0 '#E41A1C', 1 '#377EB8', 2 '#4DAF4A', 3 '#984EA3',\
4 '#FF7F00', 5 '#FFFF33', 6 '#A65628', 7 '#F781BF' )
# Standard border
set style line 11 lc rgb '#808080' lt 1 lw 3
set border 0 back ls 11
set tics out nomirror
# Standard grid
set style line 12 lc rgb '#808080' lt 0 lw 1
set grid back ls 12
unset grid
And I use a pdfcairo terminal as standard, like this.
set terminal pdfcairo enhanced color dashed font "Alegreya, 14" \
rounded size 16 cm, 9.6 cm
The font used is an example. For graphs in reports I tend to use the same font as the body text.
The plot command uses the defined styles.
plot "user1847844.d" using 1:2 ls 1 title "One (%)", \
"" using 1:3 ls 2 title "Two (%)", \
"" using 1:4 ls 3 title "Ideal (%)"
This produces a figure looking like this.
Note: Since StackOverflow doesn't accept PDF images, I converted it to a PNG using ImageMagick.
convert -density 300 <input.pdf> -quality 100 -sharpen 0x1.0 <output.png>
I want to set the background of data labels to white! The considered plot is a data plot of the following data (gnuDC.dat):
4 1570.96 1571
8 770.63 771
12 530.33 530
16 385.13 385
24 261.87 262
48 137.71 138
96 81.42 81
The plot command reads:
plot "gnuDC.dat" using 1:2 title "DC: GNU Fortran 4.7.2 + Open MPI 1.6.3" w p ls 1, \
"gnuDC.dat" using 1:2:3 with labels center offset 2.,0.7 font "Helvetica,14" tc ls 4 notitle, \
"gnuDC.dat" using 1:3 notitle smooth csplines ls 14
Which gives me:
It looks ok but think one could read the lables better when the would have an white background. Is there an easy way to add the white background for all labels at once?
Here is the whole print file:
set terminal postscript eps size 14cm,10cm enhanced color \
font 'Helvetica,18' linewidth 2
set output 'test.eps'
# Line style for axes
set style line 80 lt 0
set style line 80 lt rgb "#808080"
# Line style for grid
set style line 81 lt 3 # dashed
set style line 81 lt rgb "#808080" lw 0.5 # grey
set grid back linestyle 81
set border 3 back linestyle 80
set xtics nomirror
set ytics nomirror
set style line 100 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1.5
set style line 200 lc rgb '#a2142f' lt 1 lw 2 pt 7 ps 1.5
set pointintervalbox 0
set style line 1 lc rgb '#0072bd' lt 1 lw 1 pt 9 pi -10 ps 2
set style line 2 lc rgb '#77ac30' lt 1 lw 1 pt 7 pi -10 ps 2
set style line 3 lc rgb '#d95319' lt 1 lw 1 pt 1 pi -10 ps 2
set bmargin 4
set lmargin 5
set rmargin 4
unset title
set size 1,1
#set origin 0,0.27
set xlabel "number of cores, -"
set ylabel "Computational time, s"
set key top right
set key spacing 1.5
set key width -12
set yrange [0:1710]
plot "gnuDC.dat" using 1:2 title "DC: GNU Fortran 4.7.2 + Open MPI 1.6.3" w p ls 1, \
"gnuDC.dat" using 1:2:3 with labels center offset 2.,0.7 font "Helvetica,14" tc ls 4 notitle, \
"gnuDC.dat" using 1:3 notitle smooth csplines ls 14
With gnuplot version 5 there is a boxed option which does exactly this: give labels a background and, if you want, also a border. The style is controlled with set style textbox, e.g.
set style textbox opaque noborder
plot ... with labels boxed ...
Applied to your script (with some minor changes due to the changed dash handling since 5.0):
# Line style for axes
set style line 80 lt rgb "#808080"
# Line style for grid
set style line 81 dt 3 # dashed
set style line 81 lt rgb "#808080" lw 0.5 # grey
set grid back linestyle 81
set border 3 back linestyle 80
set tics nomirror
set linetype 1 lc rgb '#0072bd' pt 9 pi -10 ps 2 dt 3
set bmargin 4
set lmargin 5
set rmargin 4
set xlabel "number of cores, -"
set ylabel "Computational time, s"
set key top right
set key spacing 1.5
set key width -12
set yrange [0:1710]
set style textbox opaque noborder
plot "gnuDC.dat" using 1:2 title "DC: GNU Fortran 4.7.2 + Open MPI 1.6.3" w p lt 1, \
"gnuDC.dat" using 1:2:3 with labels boxed center offset 2.,0.7 font "Helvetica,10" tc ls 1 notitle, \
"gnuDC.dat" using 1:3 notitle smooth csplines lt 1
No, for versions 4.6 and earlier there isn't an easy way to achieve this.