用线条覆盖堆叠的 ggplot2 条形图的每个条形图
Overlay Each Bar of Stacked ggplot2 Barchart with Line
我有一个堆叠的 ggplot2 条形图,如下所示:
# Example data
data <- data.frame(level = rep(1:3, 3),
values = c(20, 30, 25, 15, 10, 5, 18, 20, 30),
group = as.factor(rep(LETTERS[1:3], each = 3)))
# Draw plot without lines
library("ggplot2")
my_plot <- ggplot(data, aes(x = level, y = values, fill = group)) +
geom_bar(stat = "identity") +
scale_fill_manual(breaks = c("A", "B", "C"),
values = c("forestgreen", "darkgoldenrod1", "brown2"))
my_plot
现在,我想用一定高度的蓝线覆盖此条形图的每个条形。蓝线也应该在图的图例中表示。
这些行的数据如下所示:
# Data for lines
data_line <- data.frame(level = 1:3,
values = c(25, 40, 10),
group = as.factor("D"))
输出应如下所示(在 paint 中绘制的图像):
问题:如何将这些数据添加为叠加线?
一个选项使用geom_segment
my_plot +
geom_segment(data = data_line,
aes(x = level - 0.45,
xend = level + 0.45,
y = values,
yend = values,
col = "D"), # 'fake' a legend
size = 2,
inherit.aes = FALSE) +
scale_color_manual(name = NULL,
values = c(D = "#007fff")) +
guides(fill = guide_legend(order = 1),
color = guide_legend(order = 2)) +
theme(legend.margin = margin(t = -1, b = -15)) # trial and error
我有一个堆叠的 ggplot2 条形图,如下所示:
# Example data
data <- data.frame(level = rep(1:3, 3),
values = c(20, 30, 25, 15, 10, 5, 18, 20, 30),
group = as.factor(rep(LETTERS[1:3], each = 3)))
# Draw plot without lines
library("ggplot2")
my_plot <- ggplot(data, aes(x = level, y = values, fill = group)) +
geom_bar(stat = "identity") +
scale_fill_manual(breaks = c("A", "B", "C"),
values = c("forestgreen", "darkgoldenrod1", "brown2"))
my_plot
现在,我想用一定高度的蓝线覆盖此条形图的每个条形。蓝线也应该在图的图例中表示。
这些行的数据如下所示:
# Data for lines
data_line <- data.frame(level = 1:3,
values = c(25, 40, 10),
group = as.factor("D"))
输出应如下所示(在 paint 中绘制的图像):
问题:如何将这些数据添加为叠加线?
一个选项使用geom_segment
my_plot +
geom_segment(data = data_line,
aes(x = level - 0.45,
xend = level + 0.45,
y = values,
yend = values,
col = "D"), # 'fake' a legend
size = 2,
inherit.aes = FALSE) +
scale_color_manual(name = NULL,
values = c(D = "#007fff")) +
guides(fill = guide_legend(order = 1),
color = guide_legend(order = 2)) +
theme(legend.margin = margin(t = -1, b = -15)) # trial and error