使用ggplot2生成带有偏移标签的颜色图例

3

我通常使用GrADS绘制地图,通常我使用的颜色图例在绘图中看起来像这样:

我想在R中使用ggplot2做同样的事情。如果只是简单地使用:

g <- g + scale_fill_brewer(palette="Greens", na.value="NA", name=legendtitle)
#g is the previously saved plot with some simple options, prepared with cut()

输出结果如下:

所以我想做两件事:
  1. 移动标签,使它们位于颜色之间,上面注明区间(注意:重命名标签不是问题,移动它们才是)
  2. 最后一个标签应该像箭头一样,表示最大值以上的条目(例如在示例中为10)以最深的颜色(在示例中为深绿色)指示。
编辑: 使用下面的答案帮助,我得到了这个: enter image description here 第一个问题几乎解决了,即使它看起来还不完美。我真的很想摆脱颜色之间的空白,有什么想法吗?第二部分......我完全没有思路。
我的代码片段使用: theme(legend.position="bottom", legend.key.width = unit(1, "cm"), legend.key.height = unit(0.3, "cm")) + guides(fill=guide_legend(label.position = "bottom", label.hjust = 1.2))

请勿编辑您的问题,使其成为一个新问题。这可能会使已经提供的答案无效化。 - Andrie
我真的不知道我该怎么做。对我来说,这个问题看起来和以前一样,只是在实现目标方面更具体(感谢编辑),即克隆使用GrADS生成的第一个图例。 - AF7
1
图例元素之间的间距由legend.margin主题元素控制。 - Brian Diggs
@Biran 如果我没记错的话,这是在图例周围添加的空白,而不是在单个图例元素之间。 - AF7
3个回答

4
这里有一些让你开始的东西。
思路是使用 cut() 创建切点,但以所需的方式指定标签。
通过将图例放在绘图底部,ggplot 自动将图例标签 "置于" 值之间。
library(ggplot2)

dat <- data.frame(x=0:100, y=runif(101, 0, 10), z=seq(0, 12, len=101))

dat$col <- cut(
  dat$z, 
  breaks=c(0, 2, 4, 6, 8, 10, Inf), 
  labels=c(2, 4, 6, 8, 10, "-->")
)

ggplot(dat, aes(x, y, col=col)) + 
  geom_point(size=10) + 
  scale_colour_brewer("", palette="Greens") +
  theme(legend.position="bottom")

enter image description here


好的建议,谢谢。我根据你的答案更新了我的问题。但是我对颜色图例还不满意。如果您有更多建议,将不胜感激。 - AF7

2

由于您没有提供最终要使用的几何图形,因此我稍微修改了Andrie的答案。我添加了一个矩形几何图形(例如geom_col),以填充完整的图例框。通过适当的alpha值(0:1)关闭条形图。

# data  
set.seed(1324)
dat <- data.frame(x=0:100, y=runif(101, 0, 10), z=seq(0, 12, len=101))
# add discrete values
dat$col <- cut(include.lowest = T,
  dat$z, 
  breaks=c(0, 2, 4, 6, 8, 10, Inf), 
  labels=c(2, 4, 6, 8, 10, "-->")
)
# the plot
ggplot(dat, aes(x,y,fill=col)) + 
  geom_point(aes(col=col),size=8, show.legend = F) +   
  geom_col(alpha=0)+
  scale_fill_brewer("", palette = "Greens")+
  scale_colour_brewer("", palette="Greens")+
  scale_alpha_discrete(range=c(0,1))+
  guides(fill = guide_legend(nrow=1, override.aes = list(alpha = 1), 
                                     label.position="bottom",
                                     label.hjust = .5)) +
  theme(legend.position="bottom",
        legend.key.width = unit(3, "cm"), 
        legend.key.height = unit(1, "cm"))

enter image description here


谢谢您的回答,但我不明白这比我在2014年11月编辑问题时更好在哪里。理想情况下,我们希望:a)在颜色框之间有标签(可以完成,但需要调整“hjust”值,并且它们永远不完美),以及b)颜色框之间没有间距。 - AF7

1
这个问题的第一部分可以用连续的颜色比例尺来解决。因此除了您的离散比例尺之外,只需添加一个连续的颜色比例尺(您可能需要重新标记它)。然后您可以将离散比例尺放在顶部或底部,这样就可以了。这是一个可复制的例子:
require(scales)
nlvls <- nlevels(diamonds$cut)
ggplot(diamonds, aes(x = price, fill = cut)) +
  geom_histogram(position = "dodge", binwidth = 1000) +
  scale_fill_brewer(palette="Greens", na.value="NA", guide='none') +
  theme(legend.position = 'bottom') +
  geom_line(aes(x=price, y=0, color=as.numeric(cut)), linetype=0) +
  scale_color_continuous(name = 'cont. scale',
                         low = brewer_pal(pal = "Greens")(nlvls)[1], 
                         high = brewer_pal(pal = "Greens")(nlvls)[nlvls])

输入图像描述 对于箭头,我完全不知道如何使用ggplot2实现。您可以使用grid来进行一些黑客操作,但这可能比它值得的麻烦多了。


在我的情况下,使用连续的颜色比例尺会令人困惑。这不仅仅是一个条形图,而是一个二维世界地图,因此我需要定义好级别,以便与其他地图轻松对比。 - AF7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接