首页 > 解决方案 > 用两种不同的色标覆盖两个 geom_bin2d 图

问题描述

我找不到如何为传递给 geom_bin2d 的两个不同数据集正确指定两个色阶。

下面的代码不起作用,第一个“scale_fill_gradient”调用被忽略,在抛出以下错误消息后只使用最后一个(白色到蓝色):

“填充”的比例已经存在。为“填充”添加另一个比例,它将替换现有比例。

这里有一个最小的代码可以使用:

require(ggplot2)
dfA <- data.frame(x=rnorm(50000, mean=5),  y=rnorm(50000, mean=5))
dfB <- data.frame(x=rnorm(30000, mean=25), y=rnorm(30000, mean=25))

ggplot() + theme_bw() + 
  geom_bin2d(data=dfA, aes(x=x, y=y), bins=100) +
  scale_fill_gradient(low="white", high="red") + 
  geom_bin2d(data=dfB, aes(x=x, y=y), bins=100) + 
  scale_fill_gradient(low="white", high="blue")

这是结果图:

在此处输入图像描述

有没有办法指定两种不同的颜色比例,以便来自 dfA 和来自 dfB 的点具有两种不同的颜色渐变?

谢谢

标签: rggplot2colors

解决方案


您可以先创建两个单独的图,然后为每个图获取基础计算数据并将它们组合起来:

# create separate plots
p1 <- ggplot() + theme_bw() +
  geom_bin2d(data=dfA, aes(x=x, y=y), bins=100) +
  scale_fill_gradient(low="white", high="red")

p2 <- ggplot() + theme_bw() +
  geom_bin2d(data=dfB, aes(x=x, y=y), bins=100) + 
  scale_fill_gradient(low="white", high="blue")

# combined plot using layer_data() to extract data
# from each plot above, & scale_identity to use the
# already calculated fill values
p.combined <- ggplot(data = layer_data(p1),
       aes(x = x, y = y, fill = fill)) +
  geom_tile() +
  geom_tile(data = layer_data(p2)) +
  scale_fill_identity() +
  theme_bw()

# optional: add legends to the combined plot
library(cowplot)
plot_grid(p.combined,
          plot_grid(get_legend(p2),
                    get_legend(p1),
                    ncol = 1),
          nrow = 1,
          rel_widths = c(1, 0.1)) # optimal relative widths may change, depending on plot dimensions

阴谋


推荐阅读