在工作中,我有一组浮点值,我为它们排序和计算CDF,并在gnuplot中绘制。我想画一条线来显示CDF的80%和90%的阈值在哪里,也就是说,一条来自左边的线@0.8y标记,接触到图形,然后下降到任何可能的值。这是为了帮助引导观众的眼睛。
数据是自动生成的,我做了多个图,所以我不想每次都手工制作这些线。
在0.8和0.9 y值点绘制一个横跨整个图的水平箭头是很简单的,但是我不知道如何确定应该在哪里绘制垂直线。这里是一个q/ are绘图箭头:Gnuplot: Vertical lines at specific positions,但位置是先验的。
以下是一些示例数据(我的工作机器无法访问互联网,因此很难共享)
X Y
5.0 | 0.143
8.0 | 0.288
16.0 | 0.429
25.0 | 0.714
39.0 | 0.857
47.0 | 1.000
有什么想法吗?
发布于 2012-01-27 01:35:13
这是我的观点(使用百分位数排名),它只假设有一系列单变量的度量(您的专栏标题为X
)。您可能想要稍微调整它,以使用预先计算的累积频率,但这并不是真的很难。
# generate some artificial data
reset
set sample 200
set table 'rnd.dat'
plot invnorm(rand(0))
unset table
# display the CDF
unset key
set yrange [0:1]
perc80=system("cat rnd.dat | sed '1,4d' | awk '{print $2}' | sort -n | \
awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.8-0.5)]}'")
set arrow from perc80,0 to perc80,0.8 nohead lt 2 lw 2
set arrow from graph(0,0),0.8 to perc80,0.8 nohead lt 2 lw 2
plot 'rnd.dat' using 2:(1./200.) smooth cumulative
这将产生以下输出:
当然,您可以添加任意多个百分位数的值;您只需定义一个新变量,例如perc90
,并请求另外两个arrow
命令,然后替换所有出现的0.8
(啊...魔术数字的joy!)所需的值(在本例中为0.9)。
关于上述代码的一些解释:
table
生成的标题(前四行);(我们可以要求awk从第5行开始,但让我们继续。)
trunc(rank(x))/length(x)
这样的函数来获得百分位数排名。)如果您想尝试一下R,您可以安全地将这一长串sed/awk命令替换为对R的调用,例如
Rscript -e 'x=read.table("~/rnd.dat")[,2]; sort(x)[trunc(length(x)*.8)]'
假设rnd.dat
在您的主目录中。
Sidenote:,如果你可以没有gnuplot,这里有一些R命令来做这种图形(即使不使用quantile
函数):
x <- rnorm(200)
xs <- sort(x)
xf <- (1:length(xs))/length(xs)
plot(xs, xf, xlab="X", ylab="Cumulative frequency")
## quick outline of the 80th percentile rank
perc80 <- xs[trunc(length(x)*.8)]
abline(h=.8, v=perc80)
## alternative solution
plot(ecdf(x))
segments(par("usr")[1], .8, perc80, .8)
segments(perc80, par("usr")[3], perc80, .8)
https://stackoverflow.com/questions/8985687
复制相似问题