Gnuplot: Plot stepwise discontinuities in a cumulative distriubtion - gnuplot

When I plot a cumulative distribution with gnuplot, it interpolates between datapoints; this is seen in the purple curve. How can I plot my data as a stepwise function like the black curve? Something similar to the step method in matplotlib.
Source data
1,1,0
1,2,0
1,3,0
1,4,2
1,5,1
1,6,3
1,7,3
1,8,1
1,9,3
1,10,8
1,11,1
1,12,0
1,13,3
Gnuplot source
set terminal pngcairo font ",14"
set output "cumulative.png"
#set terminal qt font ",14"
set title "Cumulative count" font ",16"
set xlabel "episode"
set ylabel "cumulative count"
set xtics 1
set key bottom right
set grid
unset border
set datafile separator comma
plot "season-01-count.csv" u 2:($3) smooth cumulative title "cumulative count"

Have you done a search or checked the manual at all? Check help steps or check here: http://gnuplot.sourceforge.net/demo_5.2/steps.html or the graph here: How to plot same value until it change?
Code:
### plot with steps
reset session
$Data <<EOD
1,1,0
1,2,0
1,3,0
1,4,2
1,5,1
1,6,3
1,7,3
1,8,1
1,9,3
1,10,8
1,11,1
1,12,0
1,13,3
EOD
set title "Cumulative count" font ",16"
set xlabel "episode"
set ylabel "cumulative count"
set xtics 1
set key bottom right
set grid
unset border
set datafile separator comma
plot $Data u 2:($3) smooth cumulative with steps lw 2 lc "red" ti "cumulative count"
### end of code
Result:

Related

gnuplot: bar charts visualization

My gnuplot script plot a bar graph for 2D data either in monochrome or color format:
set term pngcairo size 800,600
set termoption noenhanced
set tics font "Helvetica,10"
#set xtics noenhanced
set ylabel "Fraction, %"
set xlabel "H-bond donor/aceptor, residue"
set yrange [0:1]
set ytics 0.1
set grid y
set key off
set boxwidth 0.9
set style fill solid 0.5
# TWO OPTIONS FOR BAR VISUALISATIONS!! NB: ADD HERE TRIGGER FROM COLOR_DATA TRIGGER
# 1 - use it with non-colored bars"
#plot "\$data" using 0:2:xtic(1) with boxes, "" using 0:2:2 with labels offset 0,1
# 2 - or use it with colored bars:
plot \$data using 0:2:3:xtic(1) with boxes lc rgb var, \
'' using 0:2:2 with labels offset 0,1
The problem when I have just one bar, one the graph it occupiers all the graph on X:
Would it be possible to set some minimum dimension for the bars to make the dimensions of a single bar similar for a situations with two bars, for instance:
My understanding is the following: if you have only one box:
maybe gnuplot tries to autoscale and the automatic boxwidth is small relative to the autorange (hence just a thin line).
if you set a certain boxwidth, autoscale with scale to the given boxwidth (hence the graph filled with the box).
you could set a fixed xrange, but then you are loosing the benefits of autoscale. Instead you can use set offets (check help offsets).
if you have more than 1 box autoscale will work.
Script:
### boxwidth with boxes style
reset session
$Data1 <<EOD
1 Abc
EOD
$Data2 <<EOD
1 Abc
2 Xyz
EOD
set style fill solid 0.3
set key out
set rmargin screen 0.7
set yrange[0:]
set ytics 0.5
set multiplot layout 4,1
plot $Data1 u 0:1:xtic(2) w boxes ti "No special settings"
set boxwidth 0.9
plot $Data1 u 0:1:xtic(2) w boxes ti "set boxwidth"
set offsets 1,1,0,0
plot $Data1 u 0:1:xtic(2) w boxes ti "set offsets"
set offsets 0,0,0,0
plot $Data2 u 0:1:xtic(2) w boxes ti "more than 1 box"
unset multiplot
### end of script
Result:

Four graphs in one picture

What is wrong please with this graph? I would like to plot four graph in one picture. It displays two graphs. I would like to have one legends with 3 titles, because there are three color used. Then I don't know how to write two titles - one for graphs in left and one for graphs in right.
I would like to have 4 differents plot 2x2 - I have 4 plot in script. I there is lots of mistake.
set tics out nomirror
set encoding iso_8859_1
unset xtics
set ylabel "{/:Italic F} [a. u.]" font "Segoe UI,12" offset 2,0
set ytics nomirror font "Segoe UI,12"
set lmargin screen 0.2 #levý prostor vedle graf
set rmargin screen 0.9 #pravý prostor vedle grafu
set multiplot layout 2,2
set bmargin screen 0.40
set key Left reverse out horiz
set format y "%.2f"
set key tc variable
set xrange [4272:4500]
set yrange [0.7:1.02]
set title "Title 1" font "Segoe UI,12"
set title "Title 2" font "Segoe UI,12"
plot \
x title "Fitted" with lines linecolor rgb "red" lw 1.5,\
x title "Measured" with lines linecolor rgb "black" lw 1.5
unset ytics
set y2tics
set link y2
unset ylabel
set y2label "{/:Italic F} [a. u.]" font "Segoe UI,12" offset 1,0
set tmargin screen 0.4 #posun horní čáry dolního graf
set bmargin screen 0.15 #posun dolní čáry dolního graf
unset key
set tics out nomirror
set xlabel "{/:Italic {/Symbol l}} ({\305})" font "Segoe UI,12"
set xrange [4272:4500]
set yrange [-0.05:0.03]
plot x title "Measured - fitted" with lines linecolor rgb "navy" lw 1.5
set margin
set margin
plot \
x title "Fitted" with lines linecolor rgb "red" lw 1.5,\
x title "Measured" with lines linecolor rgb "black" lw 1.5
set margin
set margin
plot x title "Measured - fitted" with lines linecolor rgb "navy" lw 1.5
I suggest you have a look at plots in the gnuplot online demo collection, in particular this one: custom_key.dem
That demo illustrates automatic placement of separate plots into a grid via the set multiplot layout command, and also illustrates construction of a single legend holding titles and information from the constituent plots. The online copy includes a copy of the commands that generated the plot. If you have trouble adapting that example to your own data, come back and show what you have tried so that people can make further suggestions.
I could see that you used some symbols from symbol font.
If you want, use set encoding utf8 option and write symbols is directly.
You could set font as a terminal option also.
For example: set terminal pngcairo size 800,600 font "Segoe UI,8" enhanced.
To help you to understand as margins screen works, take a look on this figure.
This grid divides the screen (size 800,600 on terminal command) each 10% (0.1 screen unit).
In order to have graphs with the same size and align them each other we have to set the margins of the individual graphs manually.
To make it more easy I used macros commands.
Below a complete example of how to create a 2×2 graph using the multiplot.
reset
set encoding utf8 # Encoding
set terminal pngcairo size 800,600 font "Segoe UI,8" enhanced # Terminal settings
set output "multiplot_2x2.png" # Output file name
set grid ls -1 lc "gray" # grid lines
set tics out nomirror # tics marks
# Line styles
set style line 1 lc "#e41a1c" # red
set style line 2 lc "#377eb8" # blue
set style line 3 lc "#4daf4a" # green
set style line 4 lc "#984ea3" # purple
# Margins for each row and column
Row1 = "set tmargin screen 0.90; set bmargin screen 0.56" # Top and bottom margins
Row2 = "set tmargin screen 0.42; set bmargin screen 0.08"
Col1 = "set lmargin screen 0.08; set rmargin screen 0.48" # Left and right margins
Col2 = "set lmargin screen 0.57; set rmargin screen 0.97"
# Multiplot option with main title
set multiplot layout 2,2 rowsfirst title "{/:Bold=12 Multiplot 2×2}"
# -------------------------------------------------------------------
#Row1; #Col1 # Calling the macros
set title "{/:Bold=10 Row 1, Col 1}" # Title for plot
set xrange [-10:10] # x-range
set yrange [0:50] # y-range
set xtics 2 # Increment for x-tics
set ytics 10 # Increment for y-tics
set xlabel "Crazy distance / Å" # x-label
set ylabel "Crazy values / a.u." # y-label
plot x**2 w l ls 1 title "x^{2}" # The plot
# -------------------------------------------------------------------
#Row1; #Col2
set title "{/:Bold=10 Row 1, Col 2}"
set xrange [-15:20]
set yrange [-4000:8000]
set xtics 5
set ytics 2000
set xlabel "Crazy temperature / °C"
set ylabel "Crazy pressure / Pa"
plot x**3 w l ls 2 title "x^{3}"
# -------------------------------------------------------------------
#Row2; #Col1
set title "{/:Bold=10 Row 2, Col 1}"
set xrange [-15:15]
set yrange [-0.4:1.2]
set xtics 5
set ytics 0.2
set xlabel "Crazy energy / kJ"
set ylabel "Crazy volume / m^{3}"
plot sin(x)/x w l ls 3
# -------------------------------------------------------------------
#Row2; #Col2
set title "{/:Bold=10 Row 2, Col 2}"
set xrange [0:14]
set yrange [-10:15]
set xtics 2
set ytics 5
set xlabel "Crazy value {/:Italic N}_{A} / 10^{23}"
set ylabel "Crazy property / cd sr kg^{−1} m^{−2} s^{3}"
plot cos(x)*x w l ls 4
# -------------------------------------------------------------------
unset multiplot
The result:
Exactly the same result can be achieved using approach on #Ethan's answer, with the advantage dismiss macros use, just write:
set multiplot \
layout 2,2 rowsfirst \
title "{/:Bold=12 Multiplot 2×2}" \
margins screen 0.08,0.97,0.08,0.90 \
spacing screen 0.09,0.14

Gnuplot Multiplot Individual Plot Sizes + Labels

I am currently trying to produce a decent multiplot in Gnuplot. Sadly I ran into some problems.
As the y-axis for both figures is the same I want to only label and tic it once, however I cant remove those from only the left plot.
Secondly I want to increase the width of the left plot while decreasing the one of the right.
Here is a picture of what I got so far, the code is below.
Plot so far
set term postscript eps enhanced color "Helvetica" 10
set output "dosband.eps"
set title "Bandstructure and Density of States"
#
set multiplot layout 1,2 \
margins 0.075,0.98,0.1,0.98 \
spacing 0.02,0.08 #margins: left,right,bottom,top; spacing: vertical, horizontal
set title "Bandstructure"
plot 'plotband.dat' using 1:2 with lines lt 1 lw 0.5 linecolor rgb "black" notitle
set xlabel "Density [states/eV]" #dont ask me why I have to swap the xlabels around
set ylabel "Energy [eV]"
#
set title "Density of States"
plot 'plotdos.dat' using 1:2 with lines lt 1 linecolor rgb "black" notitle
set xlabel "K-Points"
unset multiplot
Thanks in advance for any answers!
As noted by #Christoph, using explicit margins is one of the solutions. In your particular case, you could proceed as:
#dimensions are in screen units
width_left = 0.48
width_right = 0.25
eps_v = 0.12
eps_h_left = 0.1
eps_h_right = 0.05
unset key
set multiplot
set tmargin at screen 1. - eps_v
set bmargin at screen eps_v
set lmargin at screen 0.1
set rmargin at screen eps_h_left + width_left
set xr [0:1.4]
set xtics 0,0.2,1.4
set yr [-40:5]
unset ytics
set y2r [-40:5]
set y2tics in mirror
set format y2 "" #draw ticks but no tic labels
set title "Plot 1"
set xlabel "title 1"
plot 1/0
set lmargin at screen 1. - (width_right + eps_h_right)
set rmargin at screen 1. - eps_h_right
set xr [0:100]
set xtics 0,25,100
unset y2tics
set yr [-40:5]
set ytics in mirror
set mytics 1
set title "Plot 2"
set xlabel "title 2"
set ylabel "Energy [eV]"
plot 1/0
This produces:
In case the Energy [eV] label is supposed to be moved completely to the left, one can adjust the spacings/tics accordingly...

Adjusting position of individual plots in gnuplot multiplot

I am using multiplot to plot four graphs. My code is given below
set term postscript eps enhanced color
set pm3d map
set pm3d corners2color c1
set size square
set out 'defect2.eps'
unset colorbox
set colorbox horiz user origin 0.1,0.7 size 0.8,0.02
set cbrange [-1.6:0]
set xtics 25
set ytics 25
set lmargin at screen 0.1
set rmargin at screen 0.9
set multiplot layout 1,4
set xlabel "i" font "Times-italic,20"
set ylabel "j" font "Times-italic,20"
spl 'defect.dat' notitle
unset ylabel
spl 'defect_2.dat' notitle
spl 'defect_3.dat' notitle
spl 'defect_4.dat' notitle
unset multiplot
set out
This produces a following plot
However, individual plots in the picture are not properly placed. I cannot see ylabel for the first plot as it is hidden behind the screen whereas there are large blank gaps between those plots. Is there any way to reduce these gaps, increase size of these plots and show the labels properly?
Thanks in advance.
The Problem is your margin setting. The margin defines the size of the white stripe between the box containing the plot and the border of the window.
This means, tic and axis labels are printet on the Martin area! And your 10% of window width is not enough, so the labels are clipped.
So you can adjust the margins to shift all plots more to the left or adjust label font sites and offsets (Miguel's comment).

Only 1 y label in GNUplot multiplot

I use gnu plot to draw a multiplot and in my script I set the y label like that:
set ylabel "foobar"
Now every plot in the multiplot has a dedicated y label on their y axis. However, I would like to have only one y label for all the plots in the multiplot and center that label also on the common y axis. How can I do that? The multiplot layout I use is a 7.1 So all the plots have the same y axis.
The simplest way is to make the first plot, then turn off the y label:
set ylabel 'foo'
set multiplot
plot 'data1.dat'
unset ylabel
plot 'data2.dat'
plot ...
unset multiplot
This will make the x-dimension of the first plot different from that of all the other plots, so you may have to play with the margins if you want all the plots the exact same size.
Plot the individual panels of reduced size without labels but with border, tics and title, then define a full-sized panel with labels but without border, tics and title.You may have to plot a dummy function (1/0).
Global label workaround
This is not ideal, but if you desperate like me, you can use a rotated global label + larger left margins:
#!/usr/bin/env gnuplot
label_label_size = 14
set terminal png
set output "gnuplot.png"
set multiplot layout 2,1 title "Multiplot with one ylabel" font ",18"
set lmargin 10
set label "My y-label" at screen 0.05,0.5 center front rotate \
font "," . label_label_size
plot sin(x)
set xlabel 'My x-label' font "," . label_label_size
plot cos(x)
Here is a realistic application that motivated me to do this: Heap vs Binary Search Tree (BST)
Tested in gnuplot 5.2 patchlevel 6, Ubuntu 19.04.
This is basically the suggestion from Fabian Claremont's answer, but (for beginners) put into code and visualized. Actually, Ciro Santilli's solution is even shorter.
Tested with gnuplot 5.2. For gnuplot 4.6 (the time of OP's question), replace reset session with reset and set margin 8,-1,1-1 with set lmargin 8 and set bmargin 1.
Code:
### Multiplot with single y-label
reset session
unset key
set sample 500
set multiplot layout 7,1
unset ylabel
set linetype 1 lc rgb "red"
set margins 8,-1,1,-1 # left, right, bottom, top (-1=auto)
set ytic 1.0
set title "Plot 1" offset 0,-1
plot sin(1*x)
set title "Plot 2" offset 0,-1
plot sin(2*x)
set title "Plot 3" offset 0,-1
plot sin(3*x)
set title "Plot 4" offset 0,-1
plot sin(4*x)
set title "Plot 5" offset 0,-1
plot sin(5*x)
set title "Plot 6" offset 0,-1
plot sin(6*x)
set title "Plot 7" offset 0,-1
plot sin(7*x)
set lmargin -1 # automatic lmargin
unset title
set origin 0,0
set size 1,1
set border 0
unset tics
set ylabel "This is a centered y-label"
plot [][0:1] -1 # plot a dummy line out of range
unset multiplot
### end of code
Result:

Resources