如何将单个scale_color*的不同方面映射到ggplot2中的不同变量?

Gre*_*ory 4 r ggplot2

我想同时可视化空间数据中预测的平均值和误差(方差)。一种可能的方法是将平均值映射到色调,将误差映射到饱和度或亮度。尽管我在地图中执行此操作,但我将在此处提供一个改编自 ggplot2 文档的更简单的最小工作示例。

library(ggplot2)
library(RColorBrewer)
dsub <- subset(diamonds, x > 5 & x < 6 & y > 5 & y < 6)
dsub$var <- dsub$x
dsub$diff <-  with(dsub, sqrt(abs(x-y))* sign(x-y))
d <- qplot(x, y, data=dsub, colour=diff)
d + scale_color_gradientn(colours=brewer.pal(7,"YlOrRd"))
Run Code Online (Sandbox Code Playgroud)

一个变量映射到颜色

我希望看到的不是所附的图,而是将色带的亮度或饱和度映射到数据中的变量“var”的版本。理想情况下,这样的图应包含二维图例。

mmk*_*mmk 5

对我有用的一个解决方案是使用几个图层来表示数据(在本例中,我或多或少地使用色调和明度作为两种美学,但可以通过将黑色层切换为白色来用饱和度代替明度),然后生成自定义 2D 图例。因此,使用您提供的数据:

# main plot
main <- ggplot(dsub) +
  geom_tile(aes(x, y, fill=diff)) +
  scale_fill_gradient(high="red", low="blue") +
  geom_tile(aes(x, y, alpha=var)) +
  theme(legend.position="none")

# 2d legend
diff <- range(dsub$diff)
var <- range(dsub$var)
legdata <- expand.grid(diff=seq(diff[1], diff[2], (diff[2]-diff[1])/20),
                   var=seq(var[1], var[2], (var[2]-var[1])/20))
legend <- ggplot(legdata) +
  geom_tile(aes(diff, var, fill=diff)) +
  scale_fill_gradient(high="red", low="blue") +
  geom_tile(aes(diff, var, alpha=var)) +
  scale_x_continuous(expand=c(0,0)) +
  scale_y_continuous(expand=c(0,0)) +
  theme(panel.background=element_blank(), panel.grid=element_blank(),
        legend.position="none") +
  coord_fixed() +
  labs(title="legend")

# combine plot and legend
library(gridExtra)
plt <- arrangeGrob(main, legend, nrow=1, widths=c(3, 1))
print(plt)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述