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

时间:2014-11-07 13:23:08

标签: r ggplot2

我通常使用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)以最暗的颜色(示例中为深绿色)表示。
  3. 编辑: 在下面的答案的帮助下,我来到这里: enter image description here

    我的问题的第1部分几乎已经解决了,即使它看起来并不完美。我真的想摆脱颜色之间的空白,任何想法?第2部分......我完全不知道。

    我的代码段使用:
    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))

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

由于你没有提供你想要使用的geom,我稍微修改了Andrie的答案。我添加了一个矩形geom(例如geom_col)来填充完整的图例框。使用合适的0:1 alpha值关闭条形。

# 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

答案 2 :(得分:0)

问题的第一部分可以用连续色标来解决。因此,除了您的离散比例,只需添加一个连续的色标(您可能需要重新标记它)。然后你可以将离散比例放在顶部或底部,你应该设置。这是一个可重复的例子:

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])

enter image description here 对于箭头,我完全不知道如何使用ggplot2执行此操作。你可以和grid一起破解某些东西,但它可能比它的价值更麻烦。