首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ggplot2中添加计算某个值以上或以下点数的图例?火山地块

如何在ggplot2中添加计算某个值以上或以下点数的图例?火山地块
EN

Stack Overflow用户
提问于 2020-05-05 14:39:42
回答 1查看 453关注 0票数 2

我试图绘制一个火山图(点图),其中某个y值以上的点根据其x值以从红色到绿色的渐变着色,并添加一个图例,指定高于这些值的点数。

我有一个类似于这个的代码:

代码语言:javascript
运行
复制
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的点数(而不是显示颜色栏),我希望线下的点是黑色的。

有人能帮我吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-05 16:05:33

需要注意的一点是:ggplot中的传说只是为了解释美学是如何表达的。为了让图例显示结果或数据(例如您的信息的记录),您必须使用与ggplot2内置的方法不同的方法。

这么说吧,下面是一个使用钻石数据集子集的例子。

数据设置

注意,我使用钻石数据集的示例,因为我很懒,不想等待数据的50000+点呈现。:/

代码语言:javascript
运行
复制
set.seed(12345)
di <- diamonds[sample(1:nrow(diamonds), 5000),]

我将设置图来表示x轴上的深度和y轴上的价格。我们将总结高深度(>平均深度)和低深度(<平均深度)的观测量,它们的价格都在6000以上。我们稍后再用这张桌子。

代码语言:javascript
运行
复制
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()函数之外指定一种灰色。

代码语言:javascript
运行
复制
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“(我认为是"Graphics对象”的缩写)。我将使用tableGrobgridExtra库转换表。然后将该grob对象传递给annotation_custom(),并指定图表中的位置。

还有一点是,我们计划把桌子放在右下角的地块外(图例下方)。为了做到这一点,我们需要为表留出空间,在右边添加一个区域边距。我们还需要关闭裁剪,以便注释可以在绘图区域之外表示。

代码语言:javascript
运行
复制
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的另一种方法可以是通过文本注释来表示点数的计数。我将在这里展示一个例子:

代码语言:javascript
运行
复制
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])
    )

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61615727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档