ggplot2 - 如何添加一个图例来计算 ggplot2 中高于或低于某个值的点?火山图

标签 ggplot2 colors gradient legend

我正在尝试制作火山图(点图),其中特定 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") 

哪个(用我的数据)产生这个图:

enter image description here

但我希望图例分别计算 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

enter image description here

添加结果表

为了在绘图中显示表格,我们将不得不使用“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
  )

enter image description here

您可以对数据使用类似的方法。

使用文本注释的替代方法

使用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])
    )

enter image description here

虽然不是您的数据,但上面的示例应该为您提供足够的信息,以了解如何将这些数据应用于您自己的数据。

关于ggplot2 - 如何添加一个图例来计算 ggplot2 中高于或低于某个值的点?火山图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61615727/

相关文章:

java - 改变Java中文本的颜色

ios - 如何在 Xcode 中定义配色方案

css3 moz-linear-gradient 不工作

CSS3 将 -webkit-gradient 转换为标准

r - ggplot2饼图标签中的意外行为

r - 更改 ggplot2 barplot 中闪避条的顺序

r - 如何使用 ggplot2 + directlabels 为标签使用自定义名称

java - 如何从 int 转换为 byte,然后使用位移运算符

r - 给定十六进制颜色代码向量,将特定颜色分配给 geom_tile 单元格

background - 如何在CSS中应用渐变色?