ggplot2:合并geom的图例
在ggplot2
图中,我将geom_line
和geom_point
与geom_bar
结合geom_line
,并且在将图例合并到一个盒子时遇到问题。
基本情节代码如下。 使用的数据进一步下降。
# Packages
library(ggplot2)
library(scales)
# Basic Plot
ggplot(data = df1, aes(x = Year, y = value, group = variable,
colour = variable, shape = variable)) +
geom_line() +
geom_point(size = 3) +
geom_bar(data = df2, aes(x = Year, y = value, fill = variable),
stat = "identity", alpha = 0.8) +
ylab("Current Account Transactions (Billion $)") +
xlab(NULL) +
theme_bw(14) +
scale_x_discrete(breaks = seq(1999, 2013, by = 2)) +
scale_y_continuous(labels = dollar, limits = c(-1, 4),
breaks = seq(-1, 4, by = .5)) +
geom_hline(yintercept = 0) +
theme(legend.key = element_blank(),
legend.background = element_rect(colour = 'black', fill = 'white'),
legend.position = "top", legend.title = element_blank()) +
guides(col = guide_legend(ncol = 1), fill = NULL, colour = NULL)
我的目标是将传说合并在一起。 出于某种原因,“经常账户余额”出现在顶部的图例中(我不明白为什么),而“出口”和“导入”图例混淆了黑色背景和缺少形状。
如果我在aes
之外进行fill
,我可以使用正确的形状和颜色显示“Imports”和“Exports”的图例,但没有黑色背景,但是我失去了“经常帐户余额”的fill
图例。 “
我以前使用过的一些scale_colour_manual
, scale_shape_manual
使用scale_colour_manual
, scale_shape_manual
和scale_fill_manual
(或者scale_alpha
)在这里似乎并不奏效。 让它工作会很好。 但请注意,就我所知,使用这个技巧,必须手动指定颜色,形状和填充,我并不想这么做,因为我对默认颜色/形状/填充非常满意。
我通常会做这样的事情,但它不起作用:
library(RColorBrewer)
cols <- colorRampPalette(brewer.pal(9, "Set1"))(3)
last_plot() + scale_colour_manual(name = "legend", values = cols) +
scale_shape_manual(name = "legend", values = c(0,2,1)) +
scale_fill_manual(name = "legend", values = "darkred")
在上面我没有指定标签,因为在我的问题中,我将处理大量数据,手动指定标签是不实际的。 我想ggplot2使用默认标签。 出于同样的原因,我想使用默认的颜色/形状/填充。
其他地方也报告过类似的困难,例如在这里为复杂的情节构建一个手册图例,但是我没有设法将解决方案应用于我的问题。
有任何想法吗?
# Data
df1 <- structure(list(Year = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 1L, 2L, 3L, 4L, 5L, 6L,
7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L), .Label = c("1999",
"2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007",
"2008", "2009", "2010", "2011", "2012", "2013"), class = "factor"),
variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Exports of goods and services",
"Imports of goods and services"), class = "factor"), value = c(1.304557,
1.471532, 1.345165, 1.31879, 1.409053, 1.642291, 1.895983,
2.222124, 2.569492, 2.751949, 2.285922, 2.630799, 2.987571,
3.08526, 3.178744, 1.600087, 1.882288, 1.740493, 1.776877,
1.930395, 2.276059, 2.641418, 3.028851, 3.288135, 3.43859,
2.666714, 3.074729, 3.446914, 3.546009, 3.578998)), .Names = c("Year",
"variable", "value"), row.names = c(NA, -30L), class = "data.frame")
df2 <- structure(list(Year = structure(1:15, .Label = c("1999", "2000 ",
"2001", "2002 ", "2003", "2004 ", "2005", "2006 ", "2007", "2008 ",
"2009", "2010 ", "2011", "2012 ", "2013"), class = "factor"),
variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L), .Label = "Balance on current account", class = "factor"),
value = c(-0.29553, -0.410756, -0.395328, -0.458087, -0.521342,
-0.633768, -0.745434, -0.806726, -0.718643, -0.686641, -0.380792,
-0.44393, -0.459344, -0.460749, -0.400254)), .Names = c("Year",
"variable", "value"), row.names = c(NA, -15L), class = "data.frame")
编辑
在发布我的问题并阅读斯科特的回答后,我尝试了另一种方法。 它在某些方面更接近理想的结果,但在其他方面更进一步。 这个想法是将数据帧合并成一个数据ggplot
,并在第一个ggplot
调用ggplot
颜色/形状/填充传递给aes
。 这个问题是我在传说中得到了一个不希望的“斜线”。 如果不移除所有颜色,我一直无法删除斜杠。 这种方法的另一个问题,我马上提到,我需要手动指定一些事情,而我想尽可能保持默认值。
df <- rbind(df1, df2)
ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable,
shape = variable, fill = variable)) +
geom_line(data = subset(df, variable %in% c("Exports of goods and services", "Imports of goods and services"))) +
geom_point(data = subset(df, variable %in% c("Exports of goods and services", "Imports of goods and services")), size = 3) +
geom_bar(data = subset(df, variable %in% c("Balance on current account")), aes(x = Year, y = value, fill = variable),
stat = "identity", alpha = 0.8)
cols <- c(NA, "darkgreen", "darkblue")
last_plot() + scale_colour_manual(name = "legend", values = cols) +
scale_shape_manual(name = "legend", values = c(32, 15, 17)) +
scale_fill_manual(name = "legend", values = c("orange", NA, NA)) +
ylab("Current Account Transactions (Billion $)") +
xlab(NULL) +
theme_bw(14) + scale_x_discrete(breaks = seq(1999, 2013, by = 2)) +
scale_y_continuous(labels = dollar, limits = c(-1, 4), breaks = seq(-1, 4, by = .5)) +
geom_hline(yintercept = 0) +
theme(legend.key = element_blank(), legend.background = element_rect(colour = 'black', fill = 'white'), legend.position = "top", legend.title = element_blank()) +
guides(col = guide_legend(ncol = 1))
添加+ guides(fill = guide_legend(override.aes = list(colour = NULL)))
删除了斜杠,但是+ guides(fill = guide_legend(override.aes = list(colour = NULL)))
也保持橙色填充。
为了消除出现在顶部的传说你可以移动“当前账户余额” group
, colour
和shape
美学走出父母的ggplot()
调用,并为geom_line()
和geom_point()
适当。 这可以对哪个美学适用于您的两个共享变量名称的数据集中的每一个提供具体的控制。
ggplot(data = df1, aes(x = Year, y = value)) +
geom_line(aes(group = variable, colour = variable)) +
geom_point(aes(shape = variable, colour = variable), size = 3) +
geom_bar(data = df2, aes(x = Year, y = value, fill = variable),
stat = "identity", position = 'identity', alpha = 0.8, guide = 'none') +
ylab("Current Account Transactions (Billion $)") +
xlab(NULL) +
theme_bw(14) +
scale_x_discrete(breaks = seq(1999, 2013, by = 2)) +
scale_y_continuous(labels = dollar, limits = c(-1, 4),
breaks = seq(-1, 4, by = .5)) +
geom_hline(yintercept = 0) +
guides(col = guide_legend(ncol = 1)) +
theme(legend.key = element_blank(),
legend.background = element_rect(colour = 'black', fill = 'white'),
legend.position = "top", legend.title = element_blank(),
legend.box.just = "left")
这个答案有一些缺点。 给一对夫妇命名:1)保留两个独立的图例,如果你决定不legend.background
(例如,没有像设置legend.background
那样),这可能是伪装的。 2)从顶部图例中删除df2变量意味着它不会消耗第一个默认颜色(如前所述,仅仅是巧合),所以现在“Balance ...”和“Exports ...”都显示为粉红色,因为填充图例回收默认色标。