给出这样的数据:
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)
然后在第二个图中,我想强调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 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)
这似乎也不起作用。我可能忽略了一些微不足道的事情,或者从错误的脚开始,但我无法让它发挥作用。
答案 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)
带突出显示点的图表:
请注意,我再次向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)
我仍然认为更清洁的解决方案是手动编码颜色,但我没有尝试。也许有人会提供这个解决方案。
答案 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()