我正在尝试制作火山图(点图),其中特定 y 值以上的点根据其 x 值以从红色到绿色的渐变颜色着色,并添加一个图例来指定以下点的数量:高于这些值。
我有一个与此类似的代码:
set.seed(123)
x <- runif(600, -3, 3)
y <- runif(600, 0, 0.6)
df<- as.data.frame(cbind(x,y))
df %>% ggplot(aes(x, -log10(y), color=x)) +
geom_point()+
geom_hline(yintercept=1.3, color="darkgrey")+
scale_fill_gradient(low="red",high="green", aesthetics = "color")
哪个(用我的数据)产生这个图:
但我希望图例分别计算 y>1.3 & x>0 和 y>1.3 & x<0 的点数(不显示颜色条),并且我希望线下方的点为黑色的。
有人可以帮助我吗?
谢谢!!!
最佳答案
需要注意的一点:ggplot
中的图例只是为了解释如何呈现美学而设置的。为了让图例显示结果或数据(例如信息统计),您必须使用与 ggplot2 内置方法不同的方法。
话虽如此,这里是一个使用钻石数据集子集的示例。
数据设置
请注意,我使用的是钻石数据集的示例,因为我很懒,不想等待 50000 多个数据点渲染。 :/
set.seed(12345)
di <- diamonds[sample(1:nrow(diamonds), 5000),]
我将设置绘图以表示 x 轴上的深度和 y 轴上的价格。我们将总结高深度(>平均深度)和低深度(<平均深度)的观测值数量,并且所有价格都> 6000。稍后我们将使用此表。
di.summary <- as.data.frame(
di %>% dplyr::filter(price > 6000) %>%
group_by(depth > mean(di$depth)) %>% tally()
)
chartTable <- cbind(c('Low\nDepth', 'High\nDepth'), di.summary[,2])
基本绘图:Geom_point 颜色设置
这说明了可用于图表仅更改某些点的颜色的方法。在本例中,我希望只对价格高于 6000 的点进行着色,所有其他点都表示为灰点。最简单的方法是进行两个 geom_point
调用并让它们使用不同的数据集。一个将应用颜色美感(在 aes()
内),另一个将在 aes()
函数外部指定灰色。
p <- ggplot(di, aes(depth, price)) +
geom_point(data=di[which(di$price > 6000),], aes(color=depth), size=1) +
geom_point(data=di[which(di$price <= 6000),], color='gray80', size=1) +
geom_hline(yintercept=6000) +
geom_vline(xintercept=mean(di$depth), linetype=2) +
scale_color_gradient(high='red', low='green')
p
添加结果表
为了在绘图中显示表格,我们将不得不使用“grob”(我相信是“图形对象”的缩写)。我将使用 gridExtra
库中的 tableGrob
转换表格。然后,您将该 grob 对象传递给 annotation_custom()
,并指定图表中的位置。
还有一点是,我们计划将表格放在绘图区域之外的右下角(图例下方)。为此,我们需要通过在右侧添加绘图边距来为表格腾出空间。我们还需要关闭剪切,以便注释可以在绘图区域之外表示。
library(gridExtra)
p +
coord_cartesian(clip='off') +
theme(
plot.margin = margin(0,40,0,0)
) +
annotation_custom(
grob=tableGrob(chartTable, theme=ttheme_default(base_size = 9)),
xmin=74.5, xmax=76, ymin=0, ymax=5000
)
您可以对数据使用类似的方法。
使用文本注释的替代方法
使用tableGrob
的另一种方法可能是仅通过文本注释来表示点的计数。我将在这里展示一个示例:
p +
annotate(
geom='label',
x=min(di$depth), y=0.8*max(di$price),
hjust=0,
label=paste0('n=',di.summary[1,2])
) +
annotate(
geom='label',
x=max(di$depth), y=0.8*max(di$price),
hjust=1,
label=paste0('n=',di.summary[2,2])
)
虽然不是您的数据,但上面的示例应该为您提供足够的信息,以了解如何将这些数据应用于您自己的数据。
关于ggplot2 - 如何添加一个图例来计算 ggplot2 中高于或低于某个值的点?火山图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61615727/