在带有ggplot2的ggarrange中使用common.legend时缺少图例项

时间:2019-06-13 19:32:46

标签: r ggplot2 ggpubr

给出如下设置:

require(ggplot2)
require(ggpubr)

size = 20
s = 0.2
d = seq(0,2*pi, length.out=size)
df = data.frame(
  d=d + runif(size)*s,
  a=sin(d) + runif(size)*s,
  b=sin(d-10) + runif(size)*s,
  c=cos(2*d) + runif(size)*s
)

当尝试用ggarrange绘制线时

ggarrange(
  (
    ggplot(df, aes(x=d, palette="Set1"))
    + geom_smooth(aes(y=a, color="A"), se=FALSE)
    + scale_color_manual(values=c("#999999"))
  ),
  (
    ggplot(df, aes(x=d, palette="Set2"))
    + geom_smooth(aes(y=b, color="B"), se=FALSE)
    + geom_smooth(aes(y=c, color="C"), se=FALSE)
  ),
  common.legend=TRUE
)

公共图例仅显示第一个ggplot参数的项目,在本例中为A行。如何在不重新格式化数据框并使用facet的情况下获得包含所有行的通用图例?

ggarrange line plots

2 个答案:

答案 0 :(得分:0)

我认为您最好将数据重塑为长格式,以便将abc堆叠在一个列中,并创建一个虚拟分组分面列。这样,您可以使用“自然的” ggplot2方法,将单个列映射到colour以获得所需的图例。这也减少了代码量,避免了多图布局的麻烦。

library(tidyverse)

# Starting data
size = 20
s = 0.2
d = seq(0,2*pi, length.out=size)
set.seed(2)
df = data.frame(
  d=d + runif(size)*s,
  a=sin(d) + runif(size)*s,
  b=sin(d-10) + runif(size)*s,
  c=cos(2*d) + runif(size)*s
)

# Reshape to long format and add dummy grouping column
df = df %>% 
  gather(key, value, -d) %>% 
  mutate(group = key != "a")

ggplot(df, aes(x=d, y=value, colour=key)) +
  geom_smooth(se=FALSE) +
  facet_grid(. ~ group) +
  theme(strip.background=element_blank(),
        strip.text=element_blank(),
        legend.position="top") +
  scale_colour_manual(values=c("grey40", hcl(c(15,195),100,65))) +
  labs(colour="")

enter image description here

答案 1 :(得分:0)

您可以通过在第一张图中的limits中定义scale_color_manual()以及为每个值设置一个值来做到这一点。

例如,您可以添加

 scale_color_manual(limits = c("A", "B", "C"),
                             values = c("#999999",hcl(c(15, 195), 100, 65)))

到示例的第一幅图。

ggarrange(
    (
        ggplot(df, aes(x=d, palette="Set1"))
        + geom_smooth(aes(y=a, color="A"), se=FALSE)
        + scale_color_manual(limits = c("A", "B", "C"),
                             values = c("#999999",hcl(c(15, 195), 100, 65)))
    ),
    (
        ggplot(df, aes(x=d, palette="Set2"))
        + geom_smooth(aes(y=b, color="B"), se=FALSE)
        + geom_smooth(aes(y=c, color="C"), se=FALSE)
    ),
    common.legend=TRUE
)

enter image description here