我试图绘制一个火山图(点图),其中某个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的点数(而不是显示颜色栏),我希望线下的点是黑色的。
有人能帮我吗?
谢谢!
发布于 2020-05-05 16:05:33
需要注意的一点是: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“(我认为是"Graphics对象”的缩写)。我将使用tableGrob从gridExtra库转换表。然后将该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])
)

虽然不是您的数据,但上面的示例应该为您提供足够的信息,以便了解这些信息如何应用于您自己的数据。
https://stackoverflow.com/questions/61615727
复制相似问题