向符合条件的ggplot geom_jitter点添加文本 [英] adding text to ggplot geom_jitter points that match a condition

查看:339
本文介绍了向符合条件的ggplot geom_jitter点添加文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何将文本添加到使用geom_jittered呈现的点来标记它们? geom_text不起作用,因为我不知道抖动点的坐标。你能捕捉到抖动点的位置,所以我可以传递给geom_text吗?



我的实际用法是绘制一个箱形图,其上包含geom_jitter以显示数据分布并且我想标出离群点或符合某些条件的点(例如,用于彩色图的值的下限为10%)。

一种解决方案将捕获抖动情节的xy位置,并在稍后用于另一层,这是可能的吗?



[更新]



从Joran答案中,解决方案是使用基础包中的抖动函数计算抖动值,将它们添加到数据框中并使用geom_point。为了过滤,他使用ddply来创建一个过滤列(一个逻辑向量),并将其用于geom_text中的数据子集化。



他要求提供一个最小数据集。

  dat<  -  data.frame(x = rep(字母[1:3],次数= 100),y = runif(300),
lab = paste('id _',1:300,sep =''))

这是使用我的数据的joran示例的结果,并将id的显示降至最低1%



这是修改代码以使其他变量具有颜色并显示此变量的某些值(每组最低1%):

 #创建一些示例数据
dat < - data.frame(x = rep(letters [1:3],times = 100),y = runif(300 ),
lab = paste('id _',1:300,sep =''),quality = rnorm(300))

#创建数据副本和抖动版本的x变量
datJit< - dat
datJit $ xj< - 抖动(as.numeric(factor(dat $ x)))

#创建一个指示符变量,用于指出最低1%x
datJit中的
#obs < - ddply(datjit,。(x),fun = function(g){
g $ grp< -g $ y< =分位数(g $ y,0.01);
g $ top_q < - g $ qual <=分位数(g $ qual,0.01);
g})

#创建boxplot,叠加抖动点,
#标记最低1%点
ggplot(dat,aes(x = x,y = y))+
geom_boxplot()+
geom_point(data = datJit,aes(x = xj,color = quality))+
geom_text(data = subset(datJit,grp), aes(x = xj,label = lab))+
geom_text(data = subset(datJit,top_q),aes(x = xj,label = sprintf(%0.2f,quality)))

解决方案

您的问题并不完全清楚;例如,您在一点提及标记点,但也提及着色点,所以我不确定您是真正的意思,还是两者。一个可重复的例子会非常有帮助。但是,在我的部分中使用一些猜测,下面的代码会执行我认为您所描述的内容:

 #创建一些示例数据
dat < - data.frame(x = rep(letters [1:3],times = 100),y = runif(300),
lab = rep('label',300))

#创建数据的副本和x变量的抖动版本
datJit< - dat
datJit $ xj< - 抖动(as.numeric(factor( dat $ x)))

#创建一个指示变量,用于指定x
datJit< - ddply(datJit,)中最低10%的
#obs。 (x),fun = function(g){
g $ grp < - g $ y <=分位数(g $ y,0.1); g})

#创建a boxplot,覆盖抖动点和
#标记最低10%点
ggplot(dat,aes(x = x,y = y))+
geom_boxplot()+
geom_point(data = datJit,aes(x = xj))+
geom_text(data = subset(datJit,grp),aes(x = xj,label = lab))


How can I add text to points rendered with geom_jittered to label them? geom_text will not work because I don't know the coordinates of the jittered dots. Could you capture the position of the jittered points so I can pass to geom_text?

My practical usage would be to plot a boxplot with the geom_jitter over it to show the data distribution and I would like to label the outliers dots or the ones that match certain condition (for example the lower 10% for the values used for color the plots).

One solution would be to capture the xy positions of the jittered plots and use it later in another layer, is that possible?

[update]

From Joran answer, a solution would be to calculate the jittered values with the jitter function from the base package, add them to a data frame and use them with geom_point. For filtering he used ddply to have a filter column (a logic vector) and use it for subsetting the data in geom_text.

He asked for a minimal dataset. I just modified his example (a unique identifier in the label colum)

dat <- data.frame(x=rep(letters[1:3],times=100),y=runif(300),
                      lab=paste('id_',1:300,sep='')) 

This is the result of joran example with my data and lowering the display of ids to the lowest 1%

And this is a modification of the code to have colors by another variable and displaying some values of this variable (the lowest 1% for each group):

library("ggplot2")
#Create some example data
dat <- data.frame(x=rep(letters[1:3],times=100),y=runif(300),
                          lab=paste('id_',1:300,sep=''),quality= rnorm(300))

#Create a copy of the data and a jittered version of the x variable
datJit <- dat
datJit$xj <- jitter(as.numeric(factor(dat$x)))

#Create an indicator variable that picks out those
# obs that are in lowest 1% by x
datJit <- ddply(datJit,.(x),.fun=function(g){
               g$grp <- g$y <= quantile(g$y,0.01);
               g$top_q <- g$qual <= quantile(g$qual,0.01);
               g})

#Create a boxplot, overlay the jittered points and
# label the bottom 1% points
ggplot(dat,aes(x=x,y=y)) +
  geom_boxplot() +
  geom_point(data=datJit,aes(x=xj,colour=quality)) +
  geom_text(data=subset(datJit,grp),aes(x=xj,label=lab)) +
  geom_text(data=subset(datJit,top_q),aes(x=xj,label=sprintf("%0.2f",quality)))

解决方案

Your question isn't completely clear; for example, you mention labeling points at one point but also mention coloring points, so I'm not sure which you really mean, or perhaps both. A reproducible example would be very helpful. But using a little guesswork on my part, the following code does what I think you're describing:

#Create some example data
dat <- data.frame(x=rep(letters[1:3],times=100),y=runif(300),
        lab=rep('label',300))

#Create a copy of the data and a jittered version of the x variable
datJit <- dat
datJit$xj <- jitter(as.numeric(factor(dat$x)))

#Create an indicator variable that picks out those 
# obs that are in lowest 10% by x
datJit <- ddply(datJit,.(x),.fun=function(g){
             g$grp <- g$y <= quantile(g$y,0.1); g})

#Create a boxplot, overlay the jittered points and 
# label the bottom 10% points
ggplot(dat,aes(x=x,y=y)) + 
    geom_boxplot() + 
    geom_point(data=datJit,aes(x=xj)) + 
    geom_text(data=subset(datJit,grp),aes(x=xj,label=lab))        

这篇关于向符合条件的ggplot geom_jitter点添加文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆