用两个不同的色标覆盖两个geom_bin2d图

时间:2018-10-17 15:51:51

标签: r ggplot2 colors

我找不到如何为传递给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")

这是结果图:

enter image description here

是否有一种方法可以指定两个不同的色阶,以使来自dfA的点和来自dfB的点具有两个不同的颜色渐变?

谢谢

2 个答案:

答案 0 :(得分:1)

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

# 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

plot

答案 1 :(得分:0)

好吧,我发现我可以通过将optionslimits = c(min,max)传递给@ Z.Lin答案中的scale_fill_gradient函数来解决我的问题。