[英]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 並考慮尺度,基本上有兩個不同的層:
總體:x 軸作為某個類別(“DKFZ”、“Sanger”、“SMuFin”...),y 軸是用於箱線圖的某個值。
在每個箱線圖中: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.