gnuplot中的水平直方图

时间:2012-06-29 17:39:34

标签: gnuplot

我试图在gnuplot中绘制水平直方图。

这是我目前的垂直(通常类型)直方图:

width=0.5
hist(x,width)=width*floor(x/width)+width/2.0 
set boxwidth width*0.9
set style fill solid 0.5
plot "a" u (hist($2,width)):(1.0) smooth freq w boxes lc 3 notitle

现在我需要的是完全相同的结果,但顺时针旋转了90度。

我在下面尝试了这个,但结果真的不是我所期望的。

width=0.5
hist(x,width)=width*floor(x/width)+width/2.0 
set boxwidth width*0.9
set style fill solid 0.5
plot "a" u (1.0):(hist($2,width)) smooth freq w boxes lc 3 notitle

4 个答案:

答案 0 :(得分:2)

如果唯一关注位图输出,则在使用convert渲染直方图后,也可以使用ImageMagick套件的gnuplot命令。

convert -rotate 90 figure_in.png figure_out.png

在此之前,使用gnuplot指令轮播rotate内的所有标签。

提供了示例和更多详细信息here

答案 1 :(得分:1)

虽然gnuplot中没有对水平图的通用支持,但您可以使用 boxxyerrorbars 样式制作相当不错的水平条形图。它有一个6列输入(x,y,xlow,xhigh,ylow,yhigh)。您只需要事先自己计算酒吧的价值。

我刚刚做了这样的事情($ 2指'中心'):

  

使用'median'绘制'datafile.csv':'center':'min':'max':( $ 2-0.4):( $ 2 + 0.4)with boxxyerrorbars

如果你想要沿着y轴的类别文本标签,我们在这里(我从数据文件的第一列中取出它们):

  

使用'median'绘制'datafile.csv':'center':'min':'max':( $ 2-0.4):( $ 2 + 0.4):ytic(1)with boxxyerrorbars

答案 2 :(得分:1)

感谢。这有效。这是完成整个事情的一贯方式。 首先在另一个文件中打印表格格式的数据文件的常用输出,例如datatable.txt

reset    
binwidth=0.015    
bin(x,width)=width*floor(x/width) + binwidth/2.0    
set table    
set output 'datatable.txt'    
plot './datafile.txt' using (bin($1,binwidth)):(1.0) smooth freq w p    
unset table

set output "horizontalhist.png"    
pl './datatable.txt' u 2:1:(0.0):2:(($1)-(binwidth/2.0)):(($1)+(binwidth/2.0)) w boxxyerrorbars   

这应该给你水平直方图。

答案 3 :(得分:1)

虽然这个问题比较老了,基本已经回答了(但是,没有被接受),让我用插图来更新一下,仅供记录。

据我所知,在当前的 gnuplot (5.4.0) 中仍然没有专门的水平直方图样式,可能是因为您可以简单地使用 boxxyerror(如果您知道如何)来实现它,如已经在用户@pygrac 和@adhip agarwala 的答案以及@Christoph 链接的答案。 因此,没有必要创建垂直直方图并旋转它,因为绘图样式 boxxyerror 在 gnuplot 4.0 (2004) 或更早版本中已经存在。

由于 gnuplot 5.0.0 (2015) 数据块可用,因此不再需要将直方图数据 smooth freq 写入磁盘上的文件。

代码:

### horizontal histogram (gnuplot >=5.0.0)
reset session

# create some random test data
set table $Data
    set samples 2000
    plot '+' u 1:(invnorm(rand(0))+2) w table
    set samples 1000
    plot '+' u 1:(invnorm(rand(0))-2) w table
unset table

binwidth = 0.25
bin(x) = binwidth * floor(x/binwidth)

set table $Histo
    plot $Data u (bin($2)):(1) smooth freq
unset table

set style fill transparent solid 0.5

plot $Histo u (0):1:(0):2:($1-binwidth/2.):($1+binwidth/2.) w boxxy ti "Horizontal Histogram"
### end of code

结果:

enter image description here