r - 用两种不同的色标覆盖两个 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 的点具有两种不同的颜色渐变?
谢谢
解决方案
您可以先创建两个单独的图,然后为每个图获取基础计算数据并将它们组合起来:
# 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
推荐阅读
- flutter - 如何覆盖单个小部件的主题?
- php - 在不使用 sleep() 的情况下暂停 html/php 表单
- swift - 改变popover后面层的背景
- pandas - 包含特殊字符的 Pandas 数据帧
- babylonjs - 巴比伦 JS 3D 文件加载不起作用
- javascript - 删除子节点后反应 setState 导致奇怪的错误
- swift - 使用 FS 日历将日期保存到领域
- azure-blob-storage - Azure CDN Premium Verizon Rules Engine V4 URL Rewrite for Storage 静态网站子目录
- c - 在 C 中生成 HMAC SHA256
- javascript - 如果我定义大小,则 gif 周围的恼人边框