我的数据文件是一组已排序的单列:
1
1
2
2
2
3
...
999
1000
1000
我能够使用命令(假设文件中有10000行)成功绘制CDF:
plot "file" using 1:(1/10000.) smooth cumulative title "CDF"
我还可以通过以下方式绘制x轴的对数:
set logscale x
我的问题是如何使用Gnuplot进行CCDF绘图?
另外,带有log-log scale(设置logscale xy)的CDF不能给我任何输出。如果我想要 log-log CCDF绘图?
,该怎么办?非常感谢!
答案 0 :(得分:0)
我找到了解决此问题的方法,因为我不认为你只能使用gnuplot绘制CCDF。
简单地说,我只是使用bash解析我的数据来创建一个数据集,其中累积数据是显式的;然后gnuplot可以简单地绘制新的数据集。例如,假设您的文件包含要累积的(数值)值,我会在bash环境中执行:
cat data | sort -n | uniq --count | awk 'BEGIN{sum=0}{print $2,$1,sum; sum=sum+$1}' > parsed.dat'
此命令读取数据集(cat data
),使用其值(sort -n
)对数值数据进行排序,计算每个样本(uniq --count
)的出现次数并创建新数据集,计算每个数据值的累积和(awk命令)。
这个新数据集包含3列:第一列(gnuplot中的$ 1)包含数据集的唯一值,$ 2包含值的出现次数,第三列表示累积总和。
最后,在gnuplot中,你可以这样做:
stats "parsed.dat" using 3;
plot "parsed.dat" using 1:($3/STATS_max) with lines title "CDF",\
"" using 1:(1-$3/STATS_max) with lines title "CCDF",\
"" using 1:($2/STATS_max) with boxes title "PDF"
gnuplot的stats命令分析第三列(具有累积和的列)并将值存储到某些变量中。 STATS_max是此列的最大值(因此它是最终累积总和)。现在,您拥有了不仅可以绘制CDF,还可以绘制CCDF(1-CDF)以及PDF(或标准化直方图,用于离散值)所需的所有数据。