我正在整个研究区域内绘制多达三个可选物种丰度的一种氯叶绿素。此玩具代码的行为符合预期,并且几乎满足我的要求:
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'))
产生这个:
修改后的版本会正确绘制真实地图,并适当地混合RGB以显示每个地图单位的物种比例。但是,考虑到混合,实际数据不一定包括中列出的特定值breaks
,在这种情况下,该物种的图例中不会出现任何条目。如果将示例的最后一行更改为
labels=c('red','blue','green'), breaks=c('#FF0000','#0000FF','#00FF00'))
您将获得与所示相同的图例,仅显示“红色”和“蓝色”,因为其中没有绿色。可以搜索每个max(Species)的数据并将其分配给图例,但是对于仅以低比例出现的物种而言,这并不是很好的图例关键字。对于图例来说,需要的是显示存在实体的概念,而不是它们经证实的存在-即使只检测到一种物种,图例中也要显示三种颜色。
我会认为scale_fill_manual()
或override.aes
参数可能会帮助我在这里,但我一直没能做出任何组合的工作。
编辑:
第四集-一个新的死胡同
(感谢@ r2evans解决了我遗漏的软件包问题。)我认为我可以通过在处理管道中将另一列突变为df来欺骗传说,spCLR
以代表每种颜色的颜色(例如,“#FF0000”)条目的种类(冗余信息,但可以)。现在在我的真实版本中进行绘图调用:
df %>% [everything] %>%
ggplot(aes(x = X, y = Y, height = WIDTH, width = WIDTH, fill = CLR)) +
geom_tile() +
scale_fill_identity("Species", guide="legend",
labels=spCODE, breaks=spCLR)
但这会产生错误:Error in check_breaks_labels(breaks, labels) : object 'spCLR' not found
。这似乎很奇怪,因为[重新编辑-我看到标签和中断都不希望看到df $任何东西。无论如何。]spCLR
确实在经过管道修改的df中,并且提供给ggplot函数的所有值spCODE
是原始df中唯一存在的值-因此,如果存在某种范围问题,我就不会理解。
我认为(正确吗?)有某种方法可以使这一功能奏效[?],但仍无法使图例在玩具示例中显示“红色”,“蓝色”和“绿色”,这就是我的原始作品这个问题真的是关于-因为其中仍然没有实际的绿色数据。因此,重申一下,是否有任何方法可以迫使ggplot2图例显示您要谈论的内容,而不仅仅是显示数据中存在的内容?
我后来才发现,我的问题几乎与此重复。那里接受的答案(来自@joran)对此不起作用,但是第二个答案(来自@Axeman)起作用。所以我要走的路是最后一行应该是
labels=c('red','blue','green'), limits=c('#FF0000','#0000FF','#00FF00'))
limits()
而不是调用breaks()
,现在我的示例和真实版本可以按需工作。
我不得不说我花了很多时间在ggplot2引用中进行挖掘,而从未怀疑过limit()是breaks()的正确替代品-在该参考页中明确提到了,而limit()没有出现。?limits()页面是非常没有信息的,我找不到任何能说明两者之间区别的内容:何时而不是那样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句