gnuplot:使用对数轴作为直方图

gnuplot:使用对数轴作为直方图,gnuplot,histogram,Gnuplot,Histogram,我有一个创建直方图的数据文件 数据文件为: -0.1 0 0 JANE 1 1 1 BILL 2 2 1 BILL 1 3 1 BILL 6 4 0 JANE 35 5 0 JANE 9 6 1 BILL 4 7 1 BILL 24 8 1 BILL 28 9 1 BILL 9 10 0 JANE 16 11 1 BILL 4 12 0 JANE 45 13 1 BILL 我的gnuplot脚本是: file='test

我有一个创建直方图的数据文件

数据文件为:

-0.1  0  0  JANE
1  1  1  BILL
2  2  1  BILL
1  3  1  BILL
6  4  0  JANE
35 5  0  JANE
9  6  1  BILL
4  7  1  BILL
24 8  1  BILL
28 9  1  BILL
9  10  0  JANE
16 11  1  BILL
4  12  0  JANE
45 13  1  BILL
我的gnuplot脚本是:

file='test.txt'
binwidth=10
bin(x,width)=width*floor(x/width)
set boxwidth 1

plot file using (bin($1,binwidth)):(1.0) smooth freq with boxes, \
file using (1+(bin($2,binwidth))):(1.0) smooth freq with boxes
我想用对数标度y来绘制这些数据。但是,有些0值(因为某些存储箱为空)无法由
set logscale y
处理。我得到错误
警告:y范围为空[1:1],调整为[0.99:1.01]

根据gnuplot的帮助,“频率选项使数据在x中单调;具有相同x值的点被具有求和y值的单个点替换。”


如何获取由带方框的平滑频率计算的y值总和的log10()?

至少可以做两件事。一种是使用0和1之间的线性轴,然后使用对数轴,如本文所述。另一种方法是先绘制到
表格
,然后设置对数刻度,忽略具有零值的点

使用正常的线性轴和代码(加上
设置Y范围[0:11]
),您的数据看起来:

现在,让我们打印到表格,然后设置对数比例,然后忽略零值进行打印:

file='test.txt'
binwidth=10
bin(x,width)=width*floor(x/width)

set table "data"

plot file using (bin($1,binwidth)):(1.0) smooth freq, \
file using (1+(bin($2,binwidth))):(1.0) smooth freq

unset table

set boxwidth 1
set logscale y
set yrange [0.1:11]

plot "data" index 0 using ($1):($2 == 0 ? 1/0 : $2) with boxes lc 1, \
"data" index 1 using ($1):($2 == 0 ? 1/0 : $2) with boxes lc 2


set table
有时会在绘图中生成一些不需要的点,在x=0时可以看到这些点。为了摆脱它们,您可以使用
而不是
“data”

下次请添加一个示例数据文件,这样我们就可以测试您的代码,而不必自己生成数据。谢谢。添加了数据文件。用您的数据更新了答案。键入“帮助表”了解字母的含义。我认为在打印到表之前需要设置范围以消除它们,但不是100%确定。为什么会生成不需要的(即“u”型)数据点?似乎打印超出范围是“o”型的原因。也许我应该把它作为一个关于未定义类型的单独问题。这些问题问得更清楚。