通过绘图中的常量抖动突出显示某些点(ggplot2)

时间:2016-07-19 13:31:21

标签: r ggplot2

给出这样的数据:

dr <- data.frame(
  X = sample(c("yes","no"),10, replace=T),
  Y = rnorm(1000),
  highlight = sample(c(1,NA),1000,replace=T,prob=c(5,995))
)

我想创建两个图。首先,使用geom_jitter()来避免过度绘图的简单方法:

myseed=101
set.seed(myseed)
p <- ggplot(dr, aes(x=X,y=Y,colour=Y,na.rm=T)) +
  theme_bw() +
  geom_jitter(alpha=0.7,width=0.5,na.rm=T) +
  scale_colour_gradient("Y", low="#5edcff", high="#035280") +
  stat_summary(fun.y = "mean", fun.ymin = "mean", fun.ymax= "mean", size=0.3,width=0.33, geom = "crossbar")
plot(p)

Plot 1

然后在第二个图中,我想强调5个具体的数据点。我虽然可以使用set.seed以相同的方式使ggplot对点进行抖动,然后添加另一个只包含要突出显示的点的图层。不是这样:红点重新抖动,结果是它们出现在不同的位置。

set.seed(myseed)
pm <- p + geom_jitter(colour="red",data=filter(dr, highlight == 1),width=0.5,size=2) 
plot(pm)

Plot 2

我想要的是什么:让Plot 2与Plot 1完全相同,唯一的区别是5个点(在数据框中标识)以红色突出显示。

我想也许问题是我在一个单独的情节中添加突出显示的点。如果我尝试从一开始就映射“突出显示”因素怎么办?

set.seed(myseed)
p <- ggplot(dr, aes(x=X,y=Y,colour=Y,fill=highlight)) +
  theme_bw() +
  geom_jitter(alpha=0.7,width=0.5) +
  stat_summary(fun.y = "mean", fun.ymin = "mean", fun.ymax= "mean",     size=0.3,width=0.33, geom = "crossbar")
plot(p)

Plot 3

这似乎也不起作用。我可能忽略了一些微不足道的事情,或者从错误的脚开始,但我无法让它发挥作用。

P.S。我查看了thisthisthis之类的先前问题,但没有一个直接回答我的问题。

2 个答案:

答案 0 :(得分:1)

与分层两个抖动的解决方案相比,fill方法是正确的方向。但是,fill仅适用于形状21-25,因此您无法看到所需的结果。

包含所有积分的图表:

myseed=101
set.seed(myseed)
p <- ggplot(dr, aes(x=X,y=Y,colour=Y)) +
  theme_bw() +
  geom_jitter(alpha=0.7,width=0.5, size = 3) +
  scale_colour_gradient("Y", low="#5edcff", high="#035280") +
  stat_summary(fun.y = "mean", fun.ymin = "mean", fun.ymax= "mean", size=0.3,width=0.33, geom = "crossbar")
plot(p)

enter image description here

带突出显示点的图表:

请注意,我再次向aesthetics提供stat_summary,否则会为fill图层生成另一个摘要。

myseed=101
set.seed(myseed)
p <- ggplot(dr, aes(x=X,y=Y,colour=Y, fill = factor(highlight))) +
  theme_bw() +
  geom_jitter(width=0.5, shape = 21, size = 3) +
  scale_colour_gradient("Y", low="#5edcff", high="#035280") +
  scale_fill_manual(values=c("red"), guide = FALSE) +
  stat_summary(aes(x=X,y=Y,colour=Y), inherit.aes = FALSE,
               fun.y = "mean", fun.ymin = "mean", fun.ymax= "mean", size=0.3,width=0.33, geom = "crossbar")
plot(p)

enter image description here

我仍然认为更清洁的解决方案是手动编码颜色,但我没有尝试。也许有人会提供这个解决方案。

答案 1 :(得分:0)

如何单独绘制点数?基本上,在抖动后你将无法恢复定位,至少没有大的努力。所以改为使用

set.seed(333)
dr <- data.frame(
  X = sample(c("yes","no"),10, replace=T),
  Y = rnorm(1000),
  highlight = sample(c(1,NA),1000,replace=T,prob=c(5,995))
)
ind <- is.na(dr$highlight)

ggplot(dr, aes(x=X, y=Y, colour=Y)) +
  geom_jitter(data=dr[ind, ], alpha=0.7, width=0.5) +
  geom_jitter(data=dr[!ind, ], width=0.5, colour = "red", size=3) +
  stat_summary(fun.y = "mean", fun.ymin = "mean", fun.ymax= "mean", 
               size=0.3,width=0.33, geom = "crossbar") + 
  theme_bw()

enter image description here