gnuplot histogram label values - gnuplot

I want to put the Y values over the top of bars of the histogram for the graph below:
`
set style data histogram
#clustered
#set terminal wxt enhanced persist
set term post eps enhanced "Times-Roman, 14"
set output 'avg_waste.bmp'
set boxwidth 1.3
set grid
set auto y
set auto x
set style histogram clustered gap 1 title offset 1,0.25
set ylabel "\nAverage Resource Wastage\n\n\n" font "Times-Roman,25"
set xlabel "\nWorkflows\n" font "Times-Roman,25"
#set style fill solid noborder
set style fill pattern border -1
set key at graph 0.2, 0.9
set key spacing 2 font "Times-Roman,18"
set xtics font ", 25"
set ytics font ", 25"
plot for [COL=2:3] 'avg_waste' using COL:xticlabels(1) title columnheader fs pattern 2 `
when I try to use labels, gnuplot gives the error Not enough columns for this style
My data file is
#WASTAGE
CRCH HEFT
Cybershake 20.89 22.5785714286
LIGO 187.3228571429 199.5134285714
SIPHT 205.7514285714 210.3685714286
Montage 12.1485714286 12.7942857143

One possibility would be to place those labels manually as for example:
reset
fontSpec(s) = sprintf("Times-Roman, %d", s)
set term post eps enhanced fontSpec(16)
set output 'avg_waste.eps'
set grid
set auto y
set auto x
ticsFont=fontSpec(16)
set xtics font ticsFont
set ytics font ticsFont
set ylabel "Average Resource Wastage" font fontSpec(25) offset char -1,0
set xlabel "Workflows" font fontSpec(25) offset 0,char -1
set style fill pattern border -1
set style data histograms
set boxwidth 1.0
set style histogram clustered gap 1
keyFont=fontSpec(18)
set key spacing 2 font keyFont
#using directly 'set key spacing 2 font fontSpec(18)' doesn't seem to work...
set key at graph 0.25, 0.9
fn(v) = sprintf("%.1f", v)
plot \
for [COL=2:3] 'avg_waste' using COL:xticlabels(1) title columnheader fs pattern 2, \
'avg_waste' u ($0-1-1./6):2:(fn($2)) w labels font fontSpec(14) offset char 0,0.5 t '' , \
'avg_waste' u ($0-1+1./6):3:(fn($3)) w labels font fontSpec(14) offset char 0,0.5 t ''
Also, since you seem to want to use the titles taken from columnheaders, the script above assumes that the input data is of the form:
WASTAGE CRCH HEFT
Cybershake 20.89 22.5785714286
LIGO 187.3228571429 199.5134285714
SIPHT 205.7514285714 210.3685714286
Montage 12.1485714286 12.7942857143
i.e., the first line is not commented out.
This then produces:
EDIT:
As for the using specification ($0-1-1./6):2:(fn($2)), it's based on the fact that the individual "block" of bars are centered at integer coordinates 0,1,2, and 3. Now, with two blocks per group, the width of each block is 0.3 (2 blocks between the centers of each group + one empty one for the space). The column 0, $0, contains the 0-based index of a particular line in the data file so for example for the "Cybershake" line, it is equal to 1, thus the syntax ($0-1-1./6):2:(fn($2)) then tells Gnuplot to place a label generated by the function fn at coordinates -1./6,$2, i.e., on top of the left bar in the "Cybershake" group. Here, fn is used just as a "macro" to format an input floating point number via the sprintf function.

Related

gnuplot: add values above bar graphs

my gnuplot script plot bar graphs in the following 2D format:
using the following sctipt:
set term pngcairo size 800,600
set termoption noenhanced
set title "$file_name" font "Century,22" textcolor "#b8860b"
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
plot '<cat' using 2:xtic(1) with boxes
In order to add values above the bars, I've tried to modify it to
plot '<cat' using 0:2:xtic(1) with boxes, '' u 0:2:2 w labels offset 0,1
but the values were not added to the bars, with the following warning
"/dev/fd/63" line 17: warning: Skipping data file with no valid points
I can only test for Windows, but I assume cat under Linux is the equivalent for type under Windows.
So, what is your filename? I would say your filename is simply missing. Check help piped-data.
Something like the following should work:
plot '<cat myDataFile.dat' using 0:2:xtic(1) with boxes, '' u 0:2:2 w labels offset 0,1
But then, what is the difference to using directly the filename?
plot 'myDataFile.dat' using 0:2:xtic(1) with boxes, '' u 0:2:2 w labels offset 0,1

Bars overlapping box area gnuplot

I have a histogram plot where the bars are simply too high that they overlap the box at the top right that displays information about each bar (what do you call this box?)
Currently it looks like this:
I'm been tring to change the size (height) of the canvas so that it is taller with set size but I couldn't get it to work. I then used yrange but I don't want to specify more range to solve this problem. I want it so that the inner canvas is more square and not rectangular (more height) without changing the range. How do I do this?
set term png
set output 'output.png'
red = "#FF0000";
green = "#00FF00";
blue = "#0000FF";
skyblue = "#87CEEB";
purple = "#4B0082";
set ylabel "Time (s)"
set xlabel "CPU"
set style data histogram
set style histogram cluster
set style fill solid
set boxwidth 0.9
set grid ytics
set xtics rotate
set title "Compiled with gcc/g++"
plot "processor.dat" using 2:xtic(1) title "-O1" linecolor rgb red, \
'' using 3 title "-O2" linecolor rgb blue, \
'' using 4 title "-O3" linecolor rgb green, \
'' using 5 title "-Os" linecolor rgb skyblue, \
'' using 6 title "-Ofast" linecolor rgb purple
The "box" is called "key". In the gnuplot command line, help set key explains its options. You can move it to the empty left upper corner with
set key left
To increase the height of the picture I would change the overall size of the png like this:
set terminal png size 640,640
On my system, your command set term png defaults to set terminal png size 640,480.
To make the plot area an exact square, the following command is used:
set size ratio 1
This is the result with some fake data:

Changing ytic font size in gnuplot epslatex (multiplot)

I have problems changing the font size of my ytics (xtics as well) in an epslatex gnuplot.
I tried set format y '\tiny{%g}'
It is only working for the first of the two plots.
This is my code:
set terminal epslatex
set output "w_alt_nsyB_multi.tex"
set multiplot layout 1,1
set xrange [-0.5:17]
set yrange [0:110]
set xlabel "days"
set ylabel "Survival (\\%)" offset 2.5
set key reverse
set xtics font 'Arial,4' s
et style histogram errorbars gap 2 lw 1
set style data histogram
set style fill solid 1 border lt -1
set boxwidth 0.8
plot 'w_alt_nsyB.dat' every ::::7 using 2:3:xticlabels(1) title 'w1118' lt rgb "#000000",\
'w_alt_nsyB.dat' every ::::7 using 4:5 title 'wtSYN' lt rgb "#FF0000",\
'w_alt_elav_endoG.dat' every ::::7 using 6:7 title '38085' lt rgb "#9400D3"
set origin 0.5, 0.25
set size 0.5, 0.5
set xrange [-0.5:6]
set yrange [0:110]
set xlabel "\\tiny{Time of $Mn^{2+}$ treatment}"
set ytics ('10'10,'50'50,'100'100) nomirror
unset border
set xtics nomirror
unset ylabel
unset key
plot 'w_alt_nsyB_100.dat' using 2:3:xticlabels(1) lt rgb "#000000",\
'w_alt_nsyB_100.dat' using 4:5:xticlabels(1) lt rgb "#FF0000",\
'w_alt_nsyB_100.dat' using 6:7:xticlabels(1) lt rgb "#9400D3"
unset multiplot
Can anyone help me please?
The format given in set format ... isn't applied if you give an explicit manual label like you do with
set ytics ('10'10,'50'50,'100'100)
You must either just give the locations of the labels
set format y '\tiny %g'
set ytics (10, 50, 100)
or include the font macro in every manual label
set ytics ('\tiny 10' 10, '\tiny 50' 50, '\tiny 100' 100)
Note also, that your syntax \tiny{%g} is wrong, \tiny is only a switch and doesn't take any arguments. In this case it doesn't matter, because every label is wrapped in an individual LaTeX box, but in other situations it makes a big difference. To wrap the tiny font you would usually need {\tiny %g}.
The same happens for the explicit labels which are set with xticlabel. Also here, the format from set format x doesn't apply. Instead of giving a column number to xticlabel (like xticlabel(1) in your example), you must give the complete label string including the macro:
xl(c) = sprintf('\tiny %s', strcol(c))
plot 'file.dat' using 2:3:xticlabel(xl(1))
Next time, please give a minimal example which allows others to reproduce your problem. We don't have your data files to run the script. And your problem isn't related to you specific data file, so you can as well construct an example using functions, which possibly leads you itself to the solution...

Transparency works only for one set of boxes

So, I am playing around with gnuplot, and it somehow behaves weird. here is the full code:
reset
#set terminal cairolatex pdf input
#set output 'test.tex'
set terminal wxt
poisson(n) = nexp**n/int(n)!*exp(-nexp)
nexp = 3
ax = nexp
ay = 1
bw = 0.2
set xrange[-0.5:12.5]
set samples 13
#set style data boxes
set boxwidth bw absolute
set style fill transparent solid 0.5 border
set xtics 1
set xlabel '$n$'
set ylabel 'Probabiltity of finding $n$ photons'
set key off
plot '+' using (ax+bw/2):(ay) with boxes lc rgb"green" title 'Fock state with $n = 3$',\
'+' using ($0-bw/2):(poisson($0)) with boxes lc rgb"blue" title 'Coherent state with $\langle n \rangle = 3$'
This is the output I get:
For some reason the green box is not transparent in the plot, but transparent in the key. Anyone knows why or how to solve it?
Thanks a lot for any tips.
You generate 13 samples and plot 13 boxes at the sample place. Of course you don't see the transparency anymore. Change the first part of your plot command to draw a single box only:
plot '+' using (ax+bw/2):($0 == 0 ? ay : 1/0) with boxes lc rgb "green"

Gnuplot Candlesticks and boxwidth

Been working with candlesticks on real financial data. It works great unless I have gaps in the data, which there are plenty with historical financial data.
I have had "set boxwidth 1 relative" and it works ok, it gives me a proper "width" of the candlestick in most cases. But if there is no data between 2 points the candlestick will become fatter, i.e. it extends right to fill that gap. The visual is horrible, the extension to the right is really bad.
I have tried playing with set boxwidth x absolute, but I cannot come to terms in how it is displaying. I have narrowed it down to set boxwidth 37500 absolute and have no idea why that number works, even though it has even worse problems then the set boxwidth 1 relative.
The first image is what it looks like using set boxwidth 37500 absolute. There the dates goes from 01/31/13, 02/01/13, 02/03/13, 02/04/13, 02/05/13. There is no 02/02/13:
The absolute shows a proper gap between 02/01 and 02/02 but 02/03 and 02/04 overlap for reasons I cannot explain.
The second image uses set boxwidth 1 relative. This has it mostly the way I want it. The candlesticks are adjacent and mostly right. But the gap on 02/02/13 it fattens to the right. There is also a gap on 02/09/13 where it also fattens, or possibly the 2 on either side extend to fill the gap I do not know.
How can I configure this so that all the candlesticks are the same width adjacent and gaps in the data are empty?
I googled this like crazy and no one talks about it. The few examples of candlesticks that I have found do not use "dates" but integers, totally worthless. Candlestick charts require dates per the manual.
Running Gnuplot 4.6 patchlevel 0 on Windows 7.
Thank you
PS: I should have added data here goes.
basic.csv:
2013-01-15 00:00:00,93.879000,93.949000,92.874000,93.078000
2013-01-16 00:00:00,93.079000,93.672000,92.458000,92.800000
2013-01-17 00:00:00,92.799000,95.011000,92.629000,94.616000
2013-01-18 00:00:00,94.617000,94.872000,94.157000,94.662000
2013-01-20 17:00:00,94.649000,94.820000,93.965000,94.155000
2013-01-21 00:00:00,94.159000,94.938000,93.726000,94.009000
2013-01-22 00:00:00,94.011000,94.284000,93.147000,93.231000
2013-01-23 00:00:00,93.229000,94.024000,92.793000,93.649000
2013-01-24 00:00:00,93.650000,94.715000,93.559000,94.489000
2013-01-25 00:00:00,94.490000,95.083000,94.472000,94.749000
2013-01-27 17:00:00,94.819000,95.007000,94.652000,94.834000
2013-01-28 00:00:00,94.835000,94.968000,94.082000,94.809000
2013-01-29 00:00:00,94.803000,95.330000,94.370000,95.248000
2013-01-30 00:00:00,95.245000,95.450000,94.255000,94.365000
2013-01-31 00:00:00,94.372000,95.799000,94.328000,95.714000
2013-02-01 00:00:00,95.715000,96.718000,95.457000,96.597000
2013-02-03 17:00:00,96.716000,96.777000,96.370000,96.572000
2013-02-04 00:00:00,96.574000,97.064000,95.968000,96.044000
2013-02-05 00:00:00,96.043000,97.426000,95.945000,97.131000
2013-02-06 00:00:00,97.133000,97.284000,96.092000,96.395000
2013-02-07 00:00:00,96.396000,97.023000,95.813000,96.145000
2013-02-08 00:00:00,96.146000,96.182000,95.124000,95.625000
2013-02-10 17:00:00,95.623000,95.744000,95.210000,95.339000
2013-02-11 00:00:00,95.336000,96.877000,95.168000,96.537000
2013-02-12 00:00:00,96.536000,96.719000,95.776000,96.214000
2013-02-13 00:00:00,96.216000,96.890000,96.114000,96.775000
2013-02-14 00:00:00,96.771000,96.964000,95.609000,95.621000
2013-02-15 00:00:00,95.622000,96.676000,95.521000,96.351000
absolute.plt:
reset
set border linecolor rgbcolor "yellow"
set key textcolor rgbcolor "white"
set obj 1 rectangle behind from screen 0,0 to screen 1,1
set obj 1 fillstyle solid 1.0 fillcolor rgbcolor "black"
set xdata time
set timefmt"%Y-%m-%d %H:%M:%S"
set xrange ["2013-01-15 00:00:00":"2013-02-15 23:59:59"]
set yrange [*:*]
set datafile separator ","
set palette defined (-1 'red', 1 'green')
set cbrange [-1:1]
unset colorbox
set style fill solid noborder
set boxwidth 37500 absolute
set title "AUDJPY" textcolor rgbcolor "white"
plot 'basic.csv' using 1:2:4:3:5:($5 < $2 ? -1 : 1) with candlesticks palette
relative.plt:
reset
set border linecolor rgbcolor "yellow"
set key textcolor rgbcolor "white"
set obj 1 rectangle behind from screen 0,0 to screen 1,1
set obj 1 fillstyle solid 1.0 fillcolor rgbcolor "black"
set xdata time
set timefmt"%Y-%m-%d %H:%M:%S"
set xrange ["2013-01-15 00:00:00":"2013-02-15 23:59:59"]
set yrange [*:*]
set datafile separator ","
set palette defined (-1 'red', 1 'green')
set cbrange [-1:1]
unset colorbox
set style fill solid noborder
set boxwidth 1 relative
set title "AUDJPY" textcolor rgbcolor "white"
plot 'basic.csv' using 1:2:4:3:5:($5 < $2 ? -1 : 1) with candlesticks palette
When using set boxwidth absolute, the width is given in units of the x-axis, which in the case of dates is seconds. So, a width of 37500 is 10 hours.
You could also use an explicit width in the 6th column, and switch to -2 to get an automatic box width for certain columns. That however would require you to manipulate your data file by hand.
Another point: Is it essential for you to include the hours in some data points? This is what narrows the distance of some adjacent points. You could ignore the hours, which would give you a point distance of minimum one day. To strip the hours, use strptime in the using statement:
reset
set border linecolor rgbcolor "yellow"
set key textcolor rgbcolor "white"
set obj 1 rectangle behind from screen 0,0 to screen 1,1
set obj 1 fillstyle solid 1.0 fillcolor rgbcolor "black"
set xdata time
set timefmt"%Y-%m-%d %H:%M:%S"
set xrange ["2013-01-15 00:00:00":"2013-02-15 23:59:59"]
set yrange [*:*]
set datafile separator ","
set palette defined (-1 'red', 1 'green')
set cbrange [-1:1]
unset colorbox
set style fill solid noborder
set boxwidth 60000 absolute
set title "AUDJPY" textcolor rgbcolor "white"
plot 'basic.csv' using (strptime('%Y-%m-%d', strcol(1))):2:4:3:5:($5 < $2 ? -1 : 1) with candlesticks palette
Result with 4.6.0:
Another script,
from candlestick_chart import Candle, Chart
# Add some candles
candles = [
Candle(133.520004, 133.610001, 126.760002, 129.410004),
Candle(128.889999, 131.740005, 128.429993, 131.009995),
Candle(127.720001, 131.050003, 126.379997, 126.599998),
Candle(128.360001, 131.630005, 127.860001, 130.919998),
Candle(132.429993, 132.630005, 130.229996, 132.050003),
]
# Create and display the chart
# Optional keyword arguments: title, width, height
chart = Chart(candles, title="Optional title")
# Set the chart title
chart.set_name("BTC/USDT")
# Set customs colors
chart.set_bear_color(1, 205, 254)
chart.set_bull_color(255, 107, 153)
chart.set_vol_bull_color(1, 205, 254)
chart.set_vol_bear_color(255, 107, 153)
# Set custom labels (empty string => label not displayed)
chart.set_label("highest", "ATH")
chart.set_label("lowest", "ATL")
chart.set_label("average", "")
chart.set_label("volume", "")
# Volume pane settings
chart.set_volume_pane_height(6)
chart.set_volume_pane_enabled(False)
# And, it is also responsive!
new_width = 200
new_height = 150
chart.update_size(new_width, new_height)
# By the way, did you know that you can add more candles in real-time?
chart.update_candles(candles[:3])
# Or completely replace current candles `enter code here`
chart.update_candles(candles[:3], reset=True)
chart.draw()

Resources