没有mutiplot的断轴

时间:2014-01-03 15:22:19

标签: gnuplot

我想在Y上绘制带有断轴的直方图。已经解释了一个很好的教程herehere但它们并不符合我的需要。数据点是

"Method"   "Year1"   "Year2"
   M1        12        -40
   M2        5         40

此数据点的代码段

set ylabel "The Profit (%)"
set style data histogram
set style histogram cluster gap 1

# Draw a horizontal line at Y=0    
set arrow 1 from -1,0 to 2,0 nohead

plot 'test_data.txt' using 2:xtic(1) ti col lc rgb "black", '' u 3 ti col lc rgb "grey"

输出看起来像

enter image description here

正如您所看到的,灰色条纹处于极值。我想要的是将yrange从 - 限制为+20并在第二个条上放置一个~~符号(将其旋转90度)并放置标签-40和+40。像这个图这样的东西

enter image description here

怎么可能?

1 个答案:

答案 0 :(得分:1)

你可以做到,但这很乏味:

  1. 裁剪直方图的using语句中的y值
  2. 当值高于或低于给定限制时,使用labels绘图样式绘制标签。
  3. 绘制矢量,显示这些框被截断。
  4. 以下脚本有效:

    set ylabel "The Profit (%)"
    set style histogram cluster gap 1
    set boxwidth 0.9 relative
    
    # Draw a horizontal line at Y=0    
    set xzeroaxis lt -1
    ulim = 15
    llim = -15
    set yrange[-20:20]
    
    sc = 0.333
    
    set style fill solid noborder
    
    plot 'test_data.txt' using ($2 > ulim ? ulim : ($2 < llim ? llim : $2)):xtic(1) ti col lc rgb "black" with histogram, \
         '' u ($3 > ulim ? ulim : ($3 < llim ? llim : $3))  ti col lc rgb "grey" with histogram,\
         for [c=2:3] '' u ($0-1+(c-2.5)*sc):(column(c) > ulim ? ulim : 1/0):(sprintf('+%d', ulim)) with labels offset 0, char 1.5 notitle,\
         for [c=2:3] '' u ($0-1+(c-2.5)*sc):(column(c) < llim ? llim : 1/0):(sprintf('%d', llim)) with labels offset 0, char -1.5 notitle,\
         for [c=2:3] for [ofs=0:1] '' u ($0-1+(c-2.5)*sc - 0.03 + ofs*0.02):\
                                        (column(c) > ulim ? ulim - 1 : (column(c) < llim ? llim - 1 : 1/0)):(0.04):(2) with vectors lc rgb 'black' nohead notitle
    

    并在4.6.3中给出以下结果:

    enter image description here

    解释所有事情涉及太多,所以这里有一些重要的评论:

    • 直方图框从0开始放置,并给出自定义标签。这对于在using语句中放置标签和向量($0-1)非常重要。

    • 系数sc = 0.333来自xtick(year1,year2和gap 1)的三列。

    • 该方法适用于第2列和第3列

    • 该脚本提供了一些警告,因为某些图是空的(第2列的值没有超出限制,因此相应的标签和矢量图不包含任何点)。

    • 我认为用曲线表示破碎的盒子是不切实际的。

    • 如果你的盒子有边框,它们也会出现在破碎的盒子顶部,这可能违反直觉。

    • 使用set xzeroaxisy=0绘制一条线,或使用graph坐标(set arrow from graph 0,first 0 to graph 1, first 0 nohead)绘制一条线。