R 如何标记由ggplot2组成的分位数-分位数图的点?

R 如何标记由ggplot2组成的分位数-分位数图的点?,r,ggplot2,R,Ggplot2,我正在从下面提供的工作示例中名为df的数据帧中,使用名为x的变量构建分位数-分位数图。我想用我的df数据集的name变量来标记这些点 在ggplot2中,是否有可能不借助痛苦的解决方案(手工对理论分布进行编码,然后将其与经验分布进行对比) 编辑:幸亏有一位用户发布了答案,然后删除了他的答案。见下面阿伦回答后的评论。多亏了Didzis用ggbuild巧妙地解决了这个问题 # MWE df <- structure(list(name = structure(c(1L, 2L, 3L, 4L,

我正在从下面提供的工作示例中名为
df
的数据帧中,使用名为
x
的变量构建分位数-分位数图。我想用我的
df
数据集的
name
变量来标记这些点

在ggplot2中,是否有可能不借助痛苦的解决方案(手工对理论分布进行编码,然后将其与经验分布进行对比)

编辑:幸亏有一位用户发布了答案,然后删除了他的答案。见下面阿伦回答后的评论。多亏了Didzis用
ggbuild
巧妙地解决了这个问题

# MWE
df <- structure(list(name = structure(c(1L, 2L, 3L, 4L, 5L, 7L, 9L, 
10L, 6L, 12L, 13L, 14L, 15L, 16L, 17L, 19L, 18L, 20L, 21L, 22L, 
8L, 23L, 11L, 24L), .Label = c("AUS", "AUT", "BEL", "CAN", "CYP", 
"DEU", "DNK", "ESP", "FIN", "FRA", "GBR", "GRC", "IRL", "ITA", 
"JPN", "MLT", "NLD", "NOR", "NZL", "PRT", "SVK", "SVN", "SWE", 
"USA"), class = "factor"), x = c(-0.739390016757746, 0.358177826874146, 
1.10474523846099, -0.250589535389937, -0.423112615445571, -0.862144579740376, 
0.823039669834058, 0.079521521937704, 1.08173649722493, -2.03962942823921, 
1.05571087029737, 0.187147291278723, -0.144770773941437, 0.957990771847331, 
-0.0546549555439176, -2.70142550075757, -0.391588386498849, -0.23855544527369, 
-0.242781575907386, -0.176765072121165, 0.105155860923456, 2.69031085872414, 
-0.158320176671995, -0.564560815972446)), .Names = c("name", 
"x"), row.names = c(NA, -24L), class = "data.frame")

library(ggplot2)
qplot(sample = x, data = df) + geom_abline(linetype = "dotted") + theme_bw()

# ... using names instead of points would allow to spot the outliers
#MWE

df这些点太近了。我会这样做:

df <- df[with(df, order(x)), ]
df$t <- quantile(rnorm(1000), seq(0, 100, length.out = nrow(df))/100)

p <- ggplot(data = df, aes(x=t, y=x)) + geom_point(aes(colour=df$name))

df您可以将原始QQ绘图保存为对象(使用函数
ggplot()
stat\u QQ()
代替
qplot()

现在,您可以向hew数据框中添加观测值的名称。重要的是使用
order()
,因为新数据框中的数据已排序

df.new$name<-df$name[order(df$x)]

@Arun在上面的评论中有一个很好的解决方案,但它适用于R4.0.3:

ggplot(data=df,aes(sample=x))+geom\u qq()+geom\u text\u排斥(label=df$name[order(df$x)],stat=“qq”)+stat\u qq\u line()

基本相同,添加了
stat\u qq\u line()
[order(df$x)]
作为
标签的一部分。如果您不包括
order
功能,那么您的标签将完全无序,并且会产生误导


希望这能为其他人节省几个小时的生命。

(+1)出色地使用了
ggplot\u build()
。一个问题:我在哪里可以读到关于
ggplot2
这样的低级控制,有什么想法吗???@Arun我不知道在哪里可以找到信息-我通过查看其他问题了解到了这一点。好吧,很好。我会继续寻找你的答案的!:)这应该可以了,谢谢!与另一个答案一样,它涉及到为绘图创建额外的数据集,但我想我不能指望有更好的技巧。+1漂亮的彩虹颜色:)我认为您的第二个绘图的代码丢失了?谢谢您的建议。我想到了最后一个解决方案,但不想为绘图创建额外的
rnorm
数据。@Fr.,是的,我不记得是谁,但有人发布了直接解决方案,但不幸地删除了它。这就是解决方案:
ggplot(df,aes(sample=x))+geom_text(label=df$name,stat=“qq”)+geom_abline(linetype=“dottered”)
…没错,这很有效,这就是我一开始想要的技巧!我将把“已回答”标签切换到这一个,表示您的评论。@FR。您可以将此作为答案写下来,并将其标记为这样,以便此答案不会丢失。有人发布了比Didzis更直接的解决方案,并将其删除。它类似于
ggplot(df,aes(sample=x))+geom\u text(label=df$name,stat=“qq”)+geom\u abline(linetype=“dottered”)
。如果你感兴趣的话。
g<-ggplot(df, aes(sample = x)) + stat_qq()
df.new<-ggplot_build(g)$data[[1]]
head(df.new)
           x          y     sample theoretical PANEL group
1 -2.0368341 -2.7014255 -2.7014255  -2.0368341     1     1
2 -1.5341205 -2.0396294 -2.0396294  -1.5341205     1     1
3 -1.2581616 -0.8621446 -0.8621446  -1.2581616     1     1
4 -1.0544725 -0.7393900 -0.7393900  -1.0544725     1     1
5 -0.8871466 -0.5645608 -0.5645608  -0.8871466     1     1
6 -0.7415940 -0.4231126 -0.4231126  -0.7415940     1     1
df.new$name<-df$name[order(df$x)]
ggplot(df.new,aes(theoretical,sample,label=name))+geom_text()+ 
  geom_abline(linetype = "dotted") + theme_bw()