Our data file, brokenhist.dat, is as follows
"Jan" 1 2 "Feb" 44 4 "Mar" 3 1 "Apr" 2 25 "May" 4 5 "June" 2 1and here is our script:
reset blue = "#babaff" set xrange [-0.5:5.5] set yrange [0:11] set isosample 2, 100 set table 'brokenhist_b.dat' splot 1-exp(-y/2.0) unset table unset colorbox set border 1 set xtics rotate by 45 nomirror offset 0, -1 unset ytics f(x) = (x < 6 ? x : (x < 30 ? x-17 : x-35) ) g(x) = (x < 6 ? 1/0 : 6) set boxwidth 0.85 set style fill solid 0.8 border -1 set style data histograms set palette defined (0 "#ffff ff", 1 "#babaff") plot 'brokenhist_b.dat' w ima,\ 'brokenhist.dat' u (f($2)) t 'Red bars',\ '' u (f($3)) lc rgb "#00bb00" t 'Green bars', \ '' u 0:(f($2)):2 w labels center offset 0,0.5 t '',\ '' u ($0+0.25):(f($3)):3 w labels center offset 0,0.5 t '',\ '' u 0:(-1):xticlabel(1) w l t '', \ '' u ($0+0.12):(g($3)+0.12):(0.25):(0.25) w vectors lt -1 lc rgb blue lw 5 nohead t '', \ '' u ($0-0.12):(g($2)+0.12):(0.25):(0.25) w vectors lt -1 lc rgb blue lw 5 nohead t ''OK, so let us look at the code! The first couple of lines are required only, if you want to have some posh background. Likewise, you can drop the 'unset colorbox' line, when you have a white background. We set only the bottom axis, which means that we have to unset the ytics and set to xtics to nomirror. Then we have two helper functions. The definitions of these depend on where you want to have the break point in the histogram. In this particular case, I took 6, but it is arbitrary.
In the next step, we set the properties of the histogram, like the width of the columns, the fill style, and the data style. We also define a palette, but this is needed for the background only. For white background, you can skip this step. You can also skip the first plot, because that is nothing but our fancy background.
The actual plotting begins after this. We plot the two sets of columns, and also plot the data file with labels. The labels are placed at the top of each column (this is why we could do away with the yaxis.) We also 'plot' the axis labels, and finally, plot the two break points. Note that the plotting of the break points is automatic, once we have the definitions of the two helper functions. If you want to have a steeper cut, you could
'' u ($0+0.12):(g($3)+0.12):(0.25):(0.5) w vectors lt -1 lc rgb blue lw 5 nohead t ''e.g., which stretches the vectors in the vertical direction. Otherwise, we have finished the plot, there is nothing else to do.
I should point out here that, in order to have a seamless cut, we have to use a colour for the vectors that is identical to the background at that particular point. This implies that we could not have a gradient at y=6. The background colour is virtually constant at y=6 (c.f. the definition of 'brokenhist_b.dat'. While it would not be impossible to implement a cut over a gradient, I believe, it is probably not worth the trouble it involves.
Hi, I realize this is perhaps a bit outside of the scope of your blog, but I was wondering if it is possible to place restraints on parameters when fitting in gnuplot.
ReplyDeleteThanks for the excellent tips!
Chris
Hi Chris,
ReplyDeleteWell, this is not off-topic, this is just a new topic. Thanks for the idea. As for the answer, please, see my latest post. I hope you'll find it useful.
Cheers,
Zoltán
Thanks for the example. It seems the image of the plot is not viewable. And if the file "brokenhist_b.dat" is available, I can't see where from and would much appreciate a hint. Thanks, Dan
ReplyDelete