barplot的多个传说填写ggplot

时间:2017-06-23 15:48:08

标签: r ggplot2 bar-chart

我想为不同的数据分组创建一个带有三个不同图例的堆叠条形图。

例如,给定以下数据帧:

Year <- as.factor(c(rep(1, 10), rep(2, 10), rep(3,10), rep(4,10), rep(5,10), rep(6,10)))
Category <- as.factor(c(rep("a", 15), rep("b", 10), rep("c", 10), rep("d",10), rep("e", 10), rep("f", 5)))
Region <- as.factor(c(rep("region1", 25), rep("region2", 20), rep("region3",15)))
data <- data.frame(Year, Category, Region)

我想用年绘制每个类别计数的堆积条形图。

ggplot() + geom_bar(data=data,aes(x=Year, fill=Category)) 

然而,我不希望有一个类别的传奇(如上所述),我希望有三个传说,按类别按类别子集(即标题为&#34;区域1和#34的图例;将显示类别&#34; a&# 34;和&#34; b&#34 ;;标题为&#34; region2&#34;的图例将显示类别&#34; c&#34;和&#34; d&#34 ;;以及标题为&#的图例34; region3&#34;将显示类别&#34; e&#34;和&#34; f&#34;。

我试过引用这两个主题: Legends for multiple fills in ggplotR: Custom Legend for Multiple Layer ggplot。 但是,我没有运气将它们应用到一个条形图。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

这样的事情:

ggplot() + geom_bar(data=data,aes(x=Year, fill=Category, color=Region)) + scale_fill_brewer(palette="Greens") + scale_color_manual(values = c("red", "black", "grey"))

使用scale_color_manual进行自定义。您可以从http://colorbrewer2.org/#type=sequential&scheme=BuGn&n=3

中获得灵感

答案 1 :(得分:0)

你有时可以通过将图层映射到其他美学,然后使用override.aes使基于这些美学的图例看起来像你想要的那样,以“硬”的方式做这种事情。它不漂亮。

以下是一个示例,其中fill图例被抑制,并通过colorsizealpha为三个“区域”子集创建了图例。< / p>

首先,获取6种颜色的 ggplot2 颜色,如here所示。

gg_color_hue = function(n) {
    hues = seq(15, 375, length = n + 1)
    hcl(h = hues, l = 65, c = 100)[1:n]
}

cols = gg_color_hue(6)

包含三个无关的geom_point图层,仅用于将三个图例添加到图中;通过将size设置为0或color设置为NA,可以抑制实际点数。

然后是guide_legend中的混乱工作,其中每个图例都会更改为根据上面的cols显示正确的颜色。更改图例名称并设置图例顺序。

ggplot(data = data, aes(x = Year) ) +
    geom_bar( aes(fill = Category), show.legend = FALSE ) +
    geom_point(data = subset(data, Category %in% c("a", "b") ),
               aes(color = Category), stat = "count", size = 0) +
    geom_point(data = subset(data, Category %in% c("c", "d") ),
               aes(size = Category), stat = "count", color = NA) +
    geom_point(data = subset(data, Category %in% c("e", "f") ),
               aes(alpha = Category), stat = "count", size = 0) +
    guides(color = guide_legend(title = "Region 1", order = 1, 
                                override.aes = list(shape = 15, size = 5, color = cols[1:2]) ),
           size = guide_legend(title = "Region 2", order = 2, 
                                override.aes = list(shape = 15, size = 5, color = cols[3:4]) ),
           alpha = guide_legend(title = "Region 3", order = 3, 
                                override.aes = list(shape = 15, size = 5, color = cols[5:6], alpha = 1) ) ) +
    theme(legend.key = element_rect(fill = "white") )

enter image description here