在ggplot2中组合冗余图例项

时间:2018-03-09 03:34:44

标签: r ggplot2

这是我的数据:

# Data:
mydf <- data.frame(
  Species = rep(c("Ungulate","Ungulate","Elk","Elk","Rodent","Rodent","Deer","Deer"), 
                times = 3),
  Space = rep(c("W", "C", "E"), each = 8),
  Age = rep(c("Adult", "Juvenile"), times = 12), 
  value = c(0.03,0.17,0.02,0.23,0.33,0.00,0.05,0.12,0.04,0.28,0.09,0.23,0.17,0.00,0.13,
            0.17,0.02,0.14,0.01,0.23,0.29,0.00,0.06,0.13))

mydf$spaceage <- as.factor(paste(mydf$Space, mydf$Age))
mydf

myPalette <- c("#f4a582", "#b2182b", "#92c5de", "#2166ac", "#a6dba0", "#1b7837")

我的情节:

example <- ggplot(mydf, 
                  aes(x = factor(Space, levels = c("W", "C", "E")), 
                      y = value, 
                      fill = factor(spaceage))) +
  geom_bar(stat = 'identity', position = 'stack') + 
  facet_grid(~ Species) +
  scale_fill_manual(values = myPalette, name = "Age") + #legend
  labs(x="") +
  theme_bw()

example

返回: enter image description here

是否可以组合多余的图例项,因此组合了暗色调和浅色调,以产生类似的效果? (使用油漆无法获得非常均匀的尺寸):

enter image description here

我愿意接受其他想法,让这个传奇更加简洁。谢谢你的建议!

3 个答案:

答案 0 :(得分:4)

您可以将""作为图例标签指定给某些图例条目,以达到效果。

但是,我首先要提醒的是首先要小心非常小心手动填充比例,因为你要确保每个颜色都对应于正确的spaceage值,然后再模糊它标签

这是一个实现:

# ensure correct mapping between colour & label
names(myPalette) <- levels(mydf$spaceage)

ggplot(mydf, 
       aes(x = factor(Space, levels = c("W", "C", "E")), 
           y = value, 
           fill = factor(spaceage))) +

  # minor point, but geom_col() is equivalent to geom_bar(position = "identity"),
  # and position = "stack" is default in both cases.
  geom_col() + 

  facet_grid(~ Species) +

  scale_fill_manual(values = myPalette, name = "Age",

                    # ensures colour order follows x-axis order
                    breaks = c("W Adult", "W Juvenile", "C Adult", "C Juvenile", 
                               "E Adult", "E Juvenile"),

                    # comment out this line to verify that right colour
                    # is mapped to the right label
                    labels = c("", "", "", "", "Adult", "Juvenile"),

                    # specify 2 rows for legends
                    guide = guide_legend(nrow = 2, byrow = FALSE)) +

  labs(x = "") +
  theme_bw() 

plot

答案 1 :(得分:2)

创建图例,实际上是ggplot2。

library(ggplot2)
ds_palette <- tibble::tibble(
  fill          = c("#a6dba0", "#1b7837", "#f4a582", "#b2182b", "#92c5de", "#2166ac"),
  x             = c(2, 1, 2, 1, 2, 1),
  y             = c(3, 3, 2, 2, 1, 1),
  text          = c("W", "W", "C", "C", "E", "E"),
  text_color    = c("black", "white", "black", "white", "black", "white")
)

legend_inset <- ggplot(ds_palette, aes(x=x, y=y, fill=fill)) +
  geom_tile() +
  geom_text(aes(label=text, color=text_color)) +
  annotate("text", x=1, y=3.6, label="Juvenile", vjust=0) +
  annotate("text", x=2, y=3.6, label="Adult", vjust=0) +
  scale_color_identity() +
  scale_fill_identity() +
  coord_cartesian(ylim=c(0.5, 4), expand = F) +
  theme_void() +
  labs(x="")

然后把它们放在一起。 vpList中的对象定义了分区区域的比例。

grid.newpage()
plot_width <- .8
tree <- vpTree(
  viewport(w=1, h=1, name="A"),
  vpList(
    viewport(x=0, y=0 , w=  plot_width, h=1  , just=c("left", "bottom"), name="bar_graph"),
    viewport(x=1, y=.5, w=1-plot_width, h=0.3, just=c("right", "top")  , name="legend")
  )
)
pushViewport(tree)

print(example     , vp = "bar_graph")
print(legend_inset, vp = "legend")

enter image description here

我旋转了你的2x3传奇,所以这些词会更节省空间。

答案 2 :(得分:1)

您可以添加标签并更改图例的位置,如下面的代码所示。

  example<-ggplot(mydf, aes(x = factor(Space, levels=c("W", "C", "E")), y = value, fill = factor(spaceage))) +
  geom_bar(stat = 'identity', position = 'stack') + facet_grid(~ Species) +
  scale_fill_manual(values = myPalette,name = "Age",labels=c("Adult","Juvenile","Adult","Juvenile","Adult","Juvenile")) + #legend
  labs(x="") +
  theme(legend.position = "top") 

example

结果如下所示。 enter image description here