簡體   English   中英

如何使用 ggplot2 疊加排序點的 plot 箱線圖

[英]How to plot boxplots superimposed with sorted points using ggplot2

使用 ggplot2,我可以 plot 用點疊加箱線圖。 但是這些點位於一條垂直線上。

library(ggplot2)

example_data <- data.frame(cohort = c("ACC", "ACC", "ACC", "ACC", "ACC", "ACC", "ACC", "ACC", "ACC", "ACC", "CHOL", "CHOL", "CHOL", "CHOL", "CHOL", "CHOL", "CHOL", "CHOL", "CHOL", "CHOL", "DLBC", "DLBC", "DLBC", "DLBC", "DLBC", "DLBC", "DLBC", "DLBC", "DLBC", "DLBC"), 
                           sample = c("A5LI", "A5JQ", "A5JP", "A5LE", "A5LG", "A5JV", "A5JD", "A5J8", "A5K8", "A5L3", "AA33", "AA30", "AA2T", "A95A", "AAZT", "A8I3", "AAV9", "A8Y4", "A8Y8", "AA31", "AAAT", "A9U4", "A7Q1", "A7DS", "A9TV", "A4D5", "A9TY", "A7CX", "A9TW", "A86F"), 
                           count = c(50, 5, 65, 22, 18, 25, 27, 86, 24, 20, 48, 96, 60, 27, 81, 34, 43, 58, 31, 77, 160, 31, 157, 104, 84, 53, 153, 111, 278, 105))


ggplot(example_data, aes(cohort, count)) + 
  geom_boxplot(aes(color = cohort)) + 
  geom_point(aes(color = cohort)) +
  scale_y_log10() +
  labs(x = NULL) +
  theme(axis.line.x = element_blank(), axis.ticks.x = element_blank(), 
        axis.text.x = element_text(angle = 45, vjust = 0.5, hjust = 0.5), legend.position = 'none')

我怎樣才能像 plot 那樣根據它們的 y 值(example_data 中的“計數”大小)對點重新排序?

陰謀

如果您查看示例 plot 您展示了您想要的 output 並考慮尺度,基本上有兩個不同的層:

  1. 總體:x 軸作為某個類別(“DKFZ”、“Sanger”、“SMuFin”...),y 軸是用於箱線圖的某個值。

  2. 在每個箱線圖中:x 軸是其他一些連續值,y 軸與箱線圖中的 y 軸相同。

這意味着每個箱線圖的 x 軸與整體上用於 plot 的 x 軸不同。 你有點想要一個“輔助x軸”。 所有關於這是否是個好主意的評論,我可以在ggplot2中向您展示如何做到這一點的方法。

輔助 x 軸不是ggplot2的內置功能; 但是,由於您想要的軸之一是分類/離散的( example_data$cohort )而另一個軸是連續的( example_data$count ),我們可以通過一些巧妙的構面格式來模擬兩個 x 軸的這種效果。

總體思路是,我們根據cohort將您的 plot 分成多個方面,然后在每個 plot 中,我們顯示整個箱線圖(按cohort分組)和 Z32FA6E1B78A9D4028953E60564A 上的每個方面的箱線圖。 這意味着我們的 x 軸值和 y 軸值一樣count - 我假設在您的真實數據中軸值不會相同,但它適用於示例目的。 然后,我們可以使用一些關於構面標簽的theme元素和選項(在ggplot2中稱為strip.text元素)來模擬相同的外觀。 我也切換到默認使用theme_classic() ,否則你必須處理在最終plot中沒有意義的x網格線。 如果您想要垂直線,則必須根據您的數據手動或以編程方式放置它們。

通常,面是分開的,但我通過panel.spacing.x將它們推到一起。

並排比較這些圖很有用,因此請注意,我在這里使用cowplot::plot_grid()來排列舊圖和新圖以進行演示。

一個非常重要的注意事項是我將outlier.shape = NA添加到geom_boxplot()的調用中。 這很重要,因為默認情況下,任何異常值都將通過geom_boxplot()命令顯示為點,並且它們將位於“不正確的”x position 中。 由於我們已經為所有這些點處理了所需的 position,因此有必要像這樣刪除它們。

p <- # your code you shared + labs(title="Old Plot")

p1 <- 
ggplot(example_data, aes(count, count)) +
  geom_boxplot(aes(color=cohort), outlier.shape = NA) +
  geom_point(aes(color=cohort)) +
  facet_wrap(~cohort, scales='free_x', strip.position = 'bottom') +
  scale_y_log10() +
  labs(title='New Plot', x=NULL) +
  theme_classic() +
  theme(
    panel.spacing.x = unit(0,'pt'),
    axis.text.x = element_blank(),
    strip.placement = 'outside',
    strip.background = element_blank(),
    axis.ticks.x = element_blank()
  )

library(cowplot)
plot_grid(p, p1)

在此處輸入圖像描述

暫無
暫無

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

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