簡體   English   中英

在 R 中覆蓋來自不同數據幀的兩個圖

[英]Overlay two plots from different dataframes in R

我想覆蓋來自不同數據源的兩個 ggplots。 我不認為left_join會起作用,因為數據幀有兩種不同的長度,並且可能會改變底層圖。[也許?]

library(tidyverse)
set.seed(123)
player_df <- tibble(name = rep(c("A","B","C","D"), each = 10, times = 1),
                    pos = rep(c("DEF","DEF","MID","MID"), each = 10, times = 1),
                    load = c(rnorm(10, mean = 200, sd = 100),
                             rnorm(10, mean = 300, sd = 50),
                             rnorm(10, mean = 400, sd = 100),
                             rnorm(10, mean = 500, sd = 50)))

p1 <- player_df %>% 
  ggplot(aes(x = load, y = name)) +
  geom_point()


pos_df <- tibble(pos = rep(c("DEF","MID"), each = 30, times = 1),
                 load = (c(rnorm(30, mean = 250, sd = 100),
                           rnorm(30, mean = 350, sd = 100))))

p2 <- pos_df %>% 
  ggplot(aes(x = load, y = pos)) +
  geom_boxplot()

p1
p2

# add p2 to every p1 player plot by pos

我希望p1有相應的p2 - by pos - 出現在它后面。 所以...將匹配的p2箱線圖添加到每個p1散點圖。

p1 玩家劇情

p2 位置箱線圖

嘗試將兩個圖相互疊加是不可取的。 geom已經由圖層組成,因此通常只是將一個幾何圖形疊加在另一個幾何圖形上的情況。 如果(如您的情況)其中一個軸具有不同的標簽,這可能會很困難。 但是,只需做一些工作,就可以整理您的數據,使其全部位於單個 plot 上。 在您的情況下,您可以執行以下操作:

levs <- c("A", "DEF", "B", "C", "MID", "D")

ggplot(within(pos_df, pos <- factor(pos, levs)), aes(x = load, y = pos)) +
  geom_boxplot(width = 2.3) +
  geom_point(data = within(player_df, pos <- factor(name, levs))) +
  scale_y_discrete(limits = c("A", "DEF", "B", " ", "C", "MID", "D"))

在此處輸入圖像描述

稍微研究一下 ggplot 並一點一點地重新設計一個箱線圖。

# manually calculate stats that are used in boxplots
pos_df_summary <- pos_df %>%
  group_by(pos, .drop = FALSE) %>% 
  summarise(min = fivenum(load)[1],
            Q1 = fivenum(load)[2],
            median = fivenum(load)[3],
            Q3 = fivenum(load)[4],
            max = fivenum(load)[5]
            )
# add the boxplot data to each player
joined_df <- player_df %>% 
  left_join(., pos_df_summary, by = "pos") %>% 
  distinct(name, .keep_all = TRUE)

# plot
ggplot(data = NULL, aes(group = name)) +
  # create the line from min to max
  geom_segment(data = joined_df, aes(y = name, yend = name, x=min, xend=max), color="black") +
  #create the box with median line
  geom_crossbar(data = joined_df, 
                aes(y = name, xmin = Q1, xmax = Q3, x = median, fill = "NA"),
                color = "black",
                fatten = 1) +
  scale_fill_manual(values = "white") +
  # add the points from the player_df
  geom_point(data = player_df, 
             aes(x = load, y = name, group=name),
             color = "red",
             show.legend=FALSE) +
  theme(legend.position = "none")

最終情節結合到數據框

這里可能有一些無關的代碼,因為我是從其他資源中拼湊出來的。 具體來說,我不確定ggplot()調用中的aes(group = name)究竟做了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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