[英]Ordering of R geom_bar plot
我有一個與此類似的數據集(1000個ID,9個類):
ID Class Value
1 A 0.014
1 B 0.665
1 C 0.321
2 A 0.234
2 B 0.424
2 C 0.342
... ... ...
“ Value
列是(相對)豐度,即,一個人的所有類別的總和等於1。
我想在R中創建一個ggplot geom_bar
圖,其中x軸不是按ID排序,而是通過減少類的豐度來進行排序,類似於此:
在我們的示例中,假設Class B
是所有個人中最豐富的類,其次是Class C
,最后是Class A
,x軸的第一個橫條是Class B
最高的個人,第二個豎條是Class B
第二高的個人,等等。
這是我嘗試的:
ggplot(df, aes(x=ID, y=Value, fill=Class)) +
geom_bar(stat="identity") +
xlab("") +
ylab("Relative Abundance\n")
您可以在將結果傳遞到ggplot()
之前進行重新排序:
library(dplyr)
library(ggplot2)
# sum the abundance for each class, across all IDs, & sort the result
sort.class <- df %>%
count(Class, wt = Value) %>%
arrange(desc(n)) %>%
pull(Class)
# get ID order, sorted by each ID's abundance in the most abundant class
ID.order <- df %>%
filter(Class == sort.class[1]) %>%
arrange(desc(Value)) %>%
pull(ID)
# factor ID / Class in the desired order
df %>%
mutate(ID = factor(ID, levels = ID.order)) %>%
mutate(Class = factor(Class, levels = rev(sort.class))) %>%
ggplot(aes(x = ID, y = Value, fill = Class)) +
geom_col(width = 1) #geom_col is equivalent to geom_bar(stat = "identity")
樣本數據:
library(tidyr)
set.seed(1234)
df <- data.frame(
ID = seq(1, 100),
A = sample(seq(2, 3), 100, replace = TRUE),
B = sample(seq(5, 9), 100, replace = TRUE),
C = sample(seq(3, 7), 100, replace = TRUE),
D = sample(seq(1, 2), 100, replace = TRUE)
) %>%
gather(Class, Value, -ID) %>%
group_by(ID) %>%
mutate(Value = Value / sum(Value)) %>%
ungroup() %>%
arrange(ID, Class)
> df
# A tibble: 400 x 3
ID Class Value
<int> <chr> <dbl>
1 1 A 0.143
2 1 B 0.357
3 1 C 0.429
4 1 D 0.0714
5 2 A 0.176
6 2 B 0.412
7 2 C 0.294
8 2 D 0.118
9 3 A 0.2
10 3 B 0.4
# ... with 390 more rows
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.