mac - gnuplot虚线




使用gnuplot的直方图? (6)

我知道如何在gnuplot中创建直方图(只需使用“with boxes”),如果我的.dat文件已经有合适的分类数据。 有没有一种方法来获取数字列表,并让gnuplot根据用户提供的范围和容器大小提供直方图?


你想绘制一个这样的图吗? 是? 然后你可以看看我的博客文章: http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html : http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html

代码中的关键代码:

n=100 #number of intervals
max=3. #max value
min=-3. #min value
width=(max-min)/n #interval width
#function used to map a value to the intervals
hist(x,width)=width*floor(x/width)+width/2.0
set boxwidth width*0.9
set style fill solid 0.5 # fill style

#count and plot
plot "data.dat" u (hist($1,width)):(1.0) smooth freq w boxes lc rgb"green" notitle

像往常一样,Gnuplot是绘制甜美外观图的绝佳工具,可以执行各种计算。 然而 ,它打算绘制数据而不是用作计算器,通常使用外部程序(例如八度)来执行更复杂的计算,将这些数据保存在文件中,然后使用Gnuplot生成图表。 对于上述问题,使用[freq,bins]=hist(data)检查“hist”函数是Octave,然后在Gnuplot中使用

set style histogram rowstacked gap 0
set style fill solid 0.5 border lt -1
plot "./data.dat" smooth freq with boxes

我们不需要使用递归方法,它可能会很慢。 我的解决方案是使用用户定义的函数rint ins intd int int或floor。

rint(x)=(x-int(x)>0.9999)?int(x)+1:int(x)

该函数给出rint(0.0003/0.0001)=3 ,而int(0.0003/0.0001)=floor(0.0003/0.0001)=2

为什么? 请看看Perl的int函数和填充零


我发现这个讨论非常有用,但我遇到了一些“四舍五入”的问题。

更确切地说,使用0.05的binwidth,我注意到,用上面介绍的技术,读取0.1和0.15的数据点落入同一个bin。 这种(明显不想要的行为)很可能是由于“地板”功能。

以下是我尝试规避这一点的小小贡献。

bin(x,width,n)=x<=n*width? width*(n-1) + 0.5*binwidth:bin(x,width,n+1)
binwidth = 0.05
set boxwidth binwidth
plot "data.dat" u (bin($1,binwidth,1)):(1.0) smooth freq with boxes

这种递归方法适用于x> = 0; 人们可以用更多的条件语句来概括它,以获得更一般的东西。


我对Born2Smile的非常有用的答案有一些更正/补充:

  1. 空箱导致相邻箱的箱子错误地伸入其空间; 避免使用set boxwidth binwidth
  2. 在Born2Smile的版本中,垃圾箱呈现为居中的下限。 严格地说,他们应该从下界延伸到上界。 这可以通过修改bin函数来纠正: bin(x,width)=width*floor(x/width) + binwidth/2.0

是的,它的快速简单虽然非常隐蔽:

binwidth=5
bin(x,width)=width*floor(x/width)

plot 'datafile' using (bin($1,binwidth)):(1.0) smooth freq with boxes

查看help smooth freq看看为什么上面做直方图

处理范围只需设置xrange变量。