给出如下设置:
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
的情况下获得包含所有行的通用图例?
答案 0 :(得分:0)
我认为您最好将数据重塑为长格式,以便将a
,b
和c
堆叠在一个列中,并创建一个虚拟分组分面列。这样,您可以使用“自然的” 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="")
答案 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
)