簡體   English   中英

將帶有自己數據框的 geom_bar 添加到現有的 ggplot2

[英]Add geom_bar with own data frame to an existing ggplot2

這個“handmalde”圖說明了我想用 ggplot2 創建的內容

我想要 plot 個時間范圍(從startend )和特定時間點( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM