簡體   English   中英

ggplot2:在多面箱線圖中繪制連接每組觀察值的線

[英]ggplot2: draw lines connecting observations in each group in faceted boxplot

我有以下數據框:

set.seed(20210714)
dd <- data.frame(Method = rep(c("A", "B", "C"), each = 60), Pattern = as.factor(rep(c("X", "Y", "Z"), times = 30)), X1 = runif(180), Complexity = rep(c("High", "Low"), times = 90), nsim = rep(rep(1:10, times = 9), each = 2))

我想為每種方法、三種模式以及每種復雜性獲得 X1 的箱線圖。 我使用以下情節:

ggplot(dd, aes(x = Pattern, y = X1, fill = Method)) +
    facet_grid(~Complexity) + 
    geom_boxplot() +
    theme(legend.position = 'bottom',
          axis.text.x = element_text(angle = 45, hjust = 1)) +
    guides(fill = guide_legend(nrow=1))

這給了我附圖:

在此處輸入圖片說明

極好。 但是,方法 A、B 和 C 的每個觀察結果都位於“X”內的同一數據集(帶有指標 nsim)上(“Y”內的情況相同,“Z”內的情況相同),我想將這些觀察結果聯系起來(X1 的值)在三種模式中的每一種中的三種方法之間(但不要鏈接這三種模式,因為那將毫無意義)。

具體來說,我想要一個如下圖(用手繪線想象連接不同的模擬 IDS 在這里):

在此處輸入圖片說明

因此,我嘗試了以下操作,但是,我讓每個 x 的箱線圖不再聚集在一起(並且 x 軸現在也搞砸了)。

library(ggplot2)


ggplot(dd, aes(x = interaction(Method,Pattern), y = X1, fill = Method)) +
      geom_boxplot(aes(fill = Method), position = "identity")  +
    geom_line(aes(x = interaction(Method,Pattern), y = X1,
                group=interaction(Pattern,nsim)), 
            size = 0.15, alpha = 0.5, colour = I("#525252"))  +
  facet_grid(~Complexity) + 
    theme_light()  +
    theme(legend.position = 'bottom')  +
    guides(fill = guide_legend(nrow=1)) +
      geom_line(aes(x = interaction(Method,Pattern), 
                group=interaction(Pattern,nsim)), 
            size = 0.35, alpha = 0.5, colour = I("#525252"))  + 
    geom_point(aes(x = interaction(Method,Pattern), 
                group=interaction(Pattern,nsim)), 
               size = 0.35, alpha = 0.5, colour = I("#525252"))  +
    scale_x_discrete(labels = c("","X", "", "", "Y", "", "", "Z","")) + xlab("Pattern")

這給出了以下內容:

在此處輸入圖片說明

但是 Pattern 的每個設置的箱線圖被分開(我希望它們聚集在一起)並且 x 軸也被弄亂了(我有一些不雅的修復)。 所以,我需要解決的最重要的事情仍然是每個模式內箱線圖之間的空間(我希望它更小),而不是不同模式的箱線圖之間的空間。

我該如何解決? 非常感謝您的建議。

這是你要找的嗎?

在此處輸入圖片說明

ggplot(dd, aes(x = Pattern, y = X1, fill = Method)) +
  geom_line(aes(group=interaction(Method,nsim)), 
            position = position_dodge(width = 0.8),
            size = 0.1, alpha = 0.5, colour = I("#525252"))  + 
  facet_grid(~Complexity) + 
  geom_boxplot() +
  theme(legend.position = 'bottom',
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  guides(fill = guide_legend(nrow=1)) +
  theme_light()

我不確定是否有更好的方法來執行此操作,但我執行了以下操作:

set.seed(20210714)
dd <- data.frame(Method = rep(c("A", "B", "C"), each = 60), Pattern = rep(c("X", "Y", "Z"), times = 30), X1 = runif(180), Complexity = rep(c("High", "Low"), times = 90), nsim = rep(rep(1:10, times = 9), each = 2))

library(ggplot2)

# create dummy dataframe.
dummy.df <- dd
dummy.df[nrow(dd) + 1:2,"Pattern"] <- unique(dd$Pattern)[-3]
dummy.df[nrow(dd) + 1:2,"Method"] <- "ZZZ"
dummy.df[nrow(dd) + 1:2,"Complexity"] <- c("High","Low")

dummy.df$dummy <- interaction(dummy.df$Method,dummy.df$Pattern)             


ggplot(dummy.df, aes(x = dummy, y = X1, fill = Method)) +
      geom_boxplot(aes(fill = Method)) + 
    geom_line(aes(x = dummy, y = X1,
                group=interaction(Pattern,nsim)), 
            size = 0.15, alpha = 0.5, colour = I("#525252"))  +
  facet_grid(~Complexity) + 
    theme_light()  +
    theme(legend.position = 'bottom')  +
    guides(fill = guide_legend(nrow=1)) +
      geom_line(aes(x = dummy, 
                group=interaction(Pattern,nsim)), 
            size = 0.35, alpha = 0.5, colour = I("#525252"))  + 
    geom_point(aes(x = dummy, 
                group=interaction(Pattern,nsim)), 
               size = 0.35, alpha = 0.5, colour = I("#525252"))  +
   scale_x_discrete(labels = c("","X", "", "", "", "Y", "", "", "", "Z","","")) +
    xlab("Pattern") +
    scale_fill_brewer(breaks=c("A", "B", "C"), type="qual", palette="Dark2")

產生以下結果:

在此處輸入圖片說明

我希望箱線圖彼此更接近,如果有人有任何想法,我希望就如何做到這一點提供一些建議。 也許下一步將把它寫成一個通用函數。

暫無
暫無

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

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