[英]Add geom_bar with own data frame to an existing ggplot2
這個“handmalde”圖說明了我想用 ggplot2 創建的內容
我想要 plot 個時間范圍(從start
到end
)和特定時間點( point
)分別來自 geom_linerange 和 geom_point。 這很好用。 但除此之外,我想在相同的 plot 條上顯示,指示特定年份之前發布的文章數量(數據框m
)。 文章數量需要它們自己翻轉的 x 軸來指示文章數量)。 我怎樣才能添加這些信息?
d <- data.frame(name=c("Frank", "Thomas", "Mike", "Ronny"),
start=c(2010, 2013, 2014, 2017),
end=c(2012, 2017, 2017, 2019),
point=c(2014, 2017, 2018, 2020))
m <- data.frame(y=c(2010, 2011, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020),
n=c(1, 3, 4, 10, 20, 25, 30, 37, 42, 50))
ggplot(d, aes(x=name, y=point, ymin=start, ymax=end)) +
geom_linerange(size=2, color="#ff546a") +
geom_point(size=2, color="#127999") +
coord_flip() +
theme_bw() + # white background
scale_y_continuous("", limits=c(2000, 2020), breaks=seq(2000, 2020, 5), labels=seq(2000, 2020, 5)) +
xlab("")
您可以嘗試 1. cowplot 解決方案
p1 <- ggplot(d, aes(x=name, y=point, ymin=start, ymax=end)) +
geom_linerange(size=2, color="#ff546a") +
geom_point(size=2, color="#127999") +
coord_flip() +
theme_bw() + # white background
scale_y_continuous("", limits=c(2000, 2020), breaks=seq(2000, 2020, 5), labels=seq(2000, 2020, 5)) +
xlab("")
p2 <- ggplot(m, aes(x=y, y=n)) +
geom_col(alpha=0.1) +
theme_void() +
scale_y_continuous(position = "right") +
scale_x_continuous("", limits=c(2000, 2020), breaks=seq(2000, 2020, 5), labels=seq(2000, 2020, 5)) +
theme(
panel.grid.major = element_blank(),
axis.line.x = element_blank(),
# axis.text.x = element_blank(),
axis.title.x = element_blank(),
axis.ticks = element_blank(),
axis.ticks.length = grid::unit(0, "pt"),
axis.text.y = element_text(color = "black"),
axis.text.x = element_text(color = "black"),
axis.title.y = element_text(color = "black")
)
p2
aligned_plots <- cowplot::align_plots(p1, p2, align="hv", axis="tblr")
cowplot::ggdraw(aligned_plots[[1]]) + cowplot::draw_plot(aligned_plots[[2]])
最后你必須取消注釋這一行
# axis.text.x = element_blank(),
並刪除這個:
axis.text.x = element_text(color = "black")
我這樣保留它是為了表明 x 軸顯示具有相同縮放比例的正確數據。
或更一般的方式 (2.) 通過將所有數據包含到一個數據幀中並添加第二個軸。
library(tidyverse)
left_join(m, d, by= c("y" = "start")) %>%
mutate(n_name= as.numeric(factor(name)),
n_name = n_name*max(n)/max(n_name, na.rm = T)) %>%
{ ggplot(.) +
geom_col(aes(y, n)) +
geom_point(data = . %>% filter(!is.na(name)),
aes(x=point, y=n_name),
size=2, color="#127999") +
geom_linerange(data = . %>% filter(!is.na(name)),
aes(x=point, y=n_name, xmin=y, xmax=end),
size=2, color="#ff546a") +
scale_x_continuous("", limits=c(2000, 2020), breaks=seq(2000, 2020, 5), labels=seq(2000, 2020, 5)) +
scale_y_continuous("", breaks = .$n_name[!is.na(.$n_name)],
labels = .$name[!is.na(.$n_name)],
sec.axis = sec_axis(~ .))}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.