首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在gnuplot生成的cdf上绘制参考线?

如何在gnuplot生成的cdf上绘制参考线?
EN

Stack Overflow用户
提问于 2012-01-24 19:01:15
回答 2查看 5.1K关注 0票数 3

在工作中,我有一组浮点值,我为它们排序和计算CDF,并在gnuplot中绘制。我想画一条线来显示CDF的80%和90%的阈值在哪里,也就是说,一条来自左边的线@0.8y标记,接触到图形,然后下降到任何可能的值。这是为了帮助引导观众的眼睛。

数据是自动生成的,我做了多个图,所以我不想每次都手工制作这些线。

在0.8和0.9 y值点绘制一个横跨整个图的水平箭头是很简单的,但是我不知道如何确定应该在哪里绘制垂直线。这里是一个q/ are绘图箭头:Gnuplot: Vertical lines at specific positions,但位置是先验的。

以下是一些示例数据(我的工作机器无法访问互联网,因此很难共享)

代码语言:javascript
运行
复制
  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

有什么想法吗?

EN

Stack Overflow用户

回答已采纳

发布于 2012-01-27 01:35:13

这是我的观点(使用百分位数排名),它只假设有一系列单变量的度量(您的专栏标题为X)。您可能想要稍微调整它,以使用预先计算的累积频率,但这并不是真的很难。

代码语言:javascript
运行
复制
# 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)。

关于上述代码的一些解释:

  1. I生成了一个保存在磁盘上的人工数据集。
  2. 第80个百分位数是使用awk计算的,但在此之前,我们需要
    1. 删除由table生成的标题(前四行);(我们可以要求awk从第5行开始,但让我们继续。)
    2. 只保留第二列;<代码>H215<代码>H116对awk进行排序

  1. 计算第80个百分位数的awk命令需要截断,这是按照建议的here执行的。(在R中,我只需使用像trunc(rank(x))/length(x)这样的函数来获得百分位数排名。)

如果您想尝试一下R,您可以安全地将这一长串sed/awk命令替换为对R的调用,例如

代码语言:javascript
运行
复制
Rscript -e 'x=read.table("~/rnd.dat")[,2]; sort(x)[trunc(length(x)*.8)]'

假设rnd.dat在您的主目录中。

Sidenote:,如果你可以没有gnuplot,这里有一些R命令来做这种图形(即使不使用quantile函数):

代码语言:javascript
运行
复制
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)

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8985687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档