我正在绘制一个研究区域内最多三种可选物种丰度的叶绿素。这个玩具代码的行为符合预期,几乎达到了我想要的效果:
library(dplyr)
library(ggplot2)
square <- expand.grid(X=0:10, Y=0:10)
sq2 <- square[rep(row.names(square), 2),] %>%
arrange(X,Y) %>%
mutate(SPEC = rep(c('red','blue'),len=n())) %>%
mutate(POP = ifelse(SPEC %in% 'red', X, Y)) %>%
group_by(X,Y) %>%
mutate(CLR = rgb(X/10,0,Y/10)) %>% ungroup()
ggplot(sq2, aes(x=X, y=Y, fill=CLR)) + geom_tile() +
scale_fill_identity("Species", guide="legend",
labels=c('red','blue'), breaks=c('#FF0000','#0000FF'))
Run Code Online (Sandbox Code Playgroud)
产生这个:
修改后的版本正确绘制了真实地图,适当混合 RGB 以显示每个地图单元的物种比例。但考虑到这种混合,真实数据不一定包括 中列出的具体值breaks,在这种情况下,该物种的图例中不会出现任何条目。如果将示例的最后一行更改为
labels=c('red','blue','green'), breaks=c('#FF0000','#0000FF','#00FF00'))
Run Code Online (Sandbox Code Playgroud)
您会得到与所示相同的图例,仅显示“红色”和“蓝色”,因为其中没有绿色。搜索每个最大值(物种)的数据并将其分配给图例是可能的,但不会为仅以低比例出现的物种提供良好的图例键。图例需要显示存在的实体的概念,而不是它们被证明的存在——图例中的三种颜色,即使只检测到一种物种。
我认为这个scale_fill_manual()或override.aes论证可能对我有帮助,但我无法使任何组合发挥作用。
编辑:
第四集——新的死胡同
(感谢 @r2evans 修复了我遗漏的包。)我想我也许可以通过将另一列突变到处理管道中的 df 中来欺骗图例,spCLR该管道被称为代表每个代码的颜色(“#FF0000”,例如)条目的物种(冗余信息,但很好)。现在我的真实版本中的绘图调用如下:
df %>% [everything] %>%
ggplot(aes(x = X, y = Y, …Run Code Online (Sandbox Code Playgroud)