如何为使用geom_jittered渲染的点添加文本以标记它们? geom_text不起作用,因为我不知道抖动点的坐标。你能捕捉到抖动点的位置,以便传递给geom_text吗?
我的实际用法是绘制一个带有geom_jitter的箱线图以显示数据分布,我想标记异常点或符合特定条件的点(例如,用于的值的下限为10%)为情节着色。)
一种解决方案是捕获抖动图的xy位置,稍后在另一层使用它,这可能吗?
从Joran的回答中,解决方案是使用基本包中的抖动函数计算抖动值,将它们添加到数据帧并将其与geom_point一起使用。对于过滤,他使用ddply来获得一个过滤列(一个逻辑向量),并用它来对geom_text中的数据进行子集化。
他要求提供最小的数据集。我刚修改了他的例子(标签列中的唯一标识符)
dat <- data.frame(x=rep(letters[1:3],times=100),y=runif(300),
lab=paste('id_',1:300,sep=''))
这是我的数据的joran示例的结果,并将ID的显示降低到最低的1%
这是对代码的修改,使其具有另一个变量的颜色,并显示该变量的一些值(每组最低1%):
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)))
答案 0 :(得分:8)
你的问题并不完全清楚;例如,你在某一点上提到了标记点,但也提到了着色点,所以我不确定你的意思,或者两者兼而有之。一个可重复的例子将非常有用。但是,在我使用一些猜测时,以下代码执行我认为您正在描述的内容:
#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))
答案 1 :(得分:1)
只是Joran精彩解决方案的补充: 当我尝试使用facet_wrap()在一个刻面图中使用时,我遇到了x轴定位问题。问题是,ggplot2在每个方面使用1作为x值。解决方案是创建一个抖动的1s矢量:
datJit$xj <- jitter(rep(1,length(dat$x)),amount=0.1)