我正在嘗試在 ggplot 中繪制資料,我希望它們基于另一列以特定順序出現。我在幾種型別的圖表(geom_bar、棒棒糖圖或餅圖)上嘗試了這個,但同樣的問題不斷出現,所以我想我不明白。
我想繪制列Taxa但按列的順序Order。據我了解,它需要factor是已經存在的情況,并且資料框已經按列排序,Order但輸出仍按列的字母順序排列Taxa。
# A tibble: 23 x 4
Order Family Taxa Number
<fct> <fct> <fct> <dbl>
1 Diptere Athericidae Atherix sp. 58
2 Diptere Blephariceridae Blepharicera sp. 10
3 Diptere Blephariceridae Liponeura sp. 23
4 Diptere Chironomidae Chironominae Chironomini 28
5 Diptere Chironomidae Chironominae Tanytarsini 126
6 Diptere Chironomidae Orthocladiinae l.s 184
7 Diptere Empididae Clinocerinae 12
8 Diptere Empididae Hemerodromiinae 13
9 Diptere Limoniidae Dicranota sp. 16
10 Diptere Limoniidae Hexatoma sp. 15

這是我的代碼和dput我的資料:
ggplot(mydata %>%
arrange(Order, .by_group = T),
aes(x = Taxa, y = Number))
geom_segment(aes(x = Taxa, xend = Taxa, y = 0, yend = Number), color = "grey")
geom_point(size = 3, color = "darkorange")
coord_flip()
structure(list(Order = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 7L, 7L, 7L, 7L, 7L, 7L ), .Label = c("Amphipode", "Coleoptere", "Diptere", "Ephemeroptere", "Plecoptere", "Pulmonata", "Trichoptere"), class = "factor"), Family = structure(c(3L, 5L, 5L, 7L, 7L, 7L, 11L, 11L, 24L, 24L, 33L, 4L, 4L, 4L, 12L, 17L, 17L, 15L, 19L, 19L, 29L, 31L, 31L), .Label = c("Ancylidae", "Anthomyidae", "Athericidae", "Baetidae", "Blephariceridae", "Caenidae", "Chironomidae", "Chloroperlidae", "Dytiscidae", "Elmidae", "Empididae", "Ephemerellidae", "Gammaridae", "Glossomatidae", "Glossosomatidae", "Haliplidae", "Heptageniidae", "Hydraenidae", "Hydropsychidae", "Hydroptilidae", "Leuctridae", "Limnephilidae", "Limniphilidae", "Limoniidae", "Lymnaeidae", "Nemouridae", "Perlidae", "Perlodidae", "Psychomyidae", "Psychomyiidae", "Rhyacophilidae", "Sericostomatidae", "Simuliidae", "Tabanidae", "Tipulidae"), class = "factor"), Taxa = structure(c(3L, 9L, 58L, 13L, 15L, 62L, 19L, 39L, 21L, 42L, 89L, 4L, 5L, 6L, 87L, 29L, 77L, 37L, 23L, 46L, 72L, 51L, 80L), .Label = c("Ancylus fluviatilus", "Antocha sp.", "Atherix sp.", "Baetis alpinus", "Baetis scambus", "Baetis sp.", "Baetis sp. juv", "Baetis vernus", "Blepharicera sp.", "Blephariceridae juv", "Blephariceridae nymphe", "Caenis sp.", "Chironominae Chironomini", "Chironominae Tanypodinae", "Chironominae Tanytarsini", "Chloroperla sp.", "Chloroperlidae", "Chloroperlidae non id", "Clinocerinae", "Clinocerinae nymphe", "Dicranota sp.", "Dinocras sp.", "Diplectrona felix", "Diptere non id", "Diptere nymphe", "Dytiscidae", "Dytiscidae non id juv", "Ecdyonorus sp.", "Ecdyonurus sp.", "Elmis sp.", "Elmis sp. juv", "Epeorus sp.", "Ephemeroptere non id", "Esolus sp.", "Galba truncatula", "Gammarus sp.", "Glossosoma sp.", "Haliplus sp. juv", "Hemerodromiinae", "Hemerodromiinae nymphe", "Heptageniidae non id", "Hexatoma sp.", "Hydracarien", "Hydraena sp.", "Hydroglyphus sp. juv", "Hydropsyche sp.", "Hydropsyche sp. juv", "Hydroptila sp.", "Hydroptilidae non id", "Hyporhyacophila", "Hyporhyacophila sp.", "Leuctra sp.", "Leuctra sp. juv", "Limnephilidae", "Limniphilidae", "Limnophora sp.", "Limoniidae non id", "Liponeura sp.", "Nematode", "Nemura sp.", "Oligochete", "Orthocladiinae l.s", "Pararhyacophila sp.", "Perla maxima", "Perla sp.", "Perlidae non id juv", "Perlodes sp.", "Perlodes sp. juv", "Perlodidae non id juv", "Plecoptere non id", "Protonemura sp.", "Psychomyia pusilla", "Psychomyia sp.", "Psychomyia sp. juv", "Radix", "Rhithrogena semicolorata", "Rhithrogena sp.", "Rhithrogena sp. juv", "Rhyacophila", "Rhyacophila ss", "Rhyacophilidae", "Riolus sp.", "Riolus sp. juv", "Rithrogena sp.", "Scleropracta sp.", "Sericostoma sp.", "Serratella ignita", "Serratella ignita juv", "Simuliidae", "Simuliidae juv", "Simuliidae nymphe", "Siphonoperla sp.", "Tabanidae", "Tipulidae", "Trichoptere non id", "Yola sp. juv" ), class = "factor"), Number = c(58, 10, 23, 28, 126, 184, 12, 13, 16, 15, 302, 309, 4, 108, 140, 36, 148, 28, 38, 386, 7, 5, 26)), row.names = c(NA, -23L), class = c("tbl_df", "tbl", "data.frame"))
對于這個新問題,我感到很抱歉,因為我認為已經回答了很多帖子,但我無法弄清楚為什么它不能處理我的資料,因為它是因素并在資料框中排序。
uj5u.com熱心網友回復:
資料框的順序實際上并不重要——重要的是因子水平的順序。您可以使用以下命令根據另一個變數訂購因子水平forcats::fct_reorder():
library(tidyverse)
# use as.integer to order by underlying factor codes
mydata %>%
mutate(Taxa = fct_reorder(Taxa, as.integer(Order))) %>%
ggplot(aes(x = Taxa, y = Number))
geom_segment(aes(x = Taxa, xend = Taxa, y = 0, yend = Number), color = "grey")
geom_point(size = 3, color = "darkorange")
coord_flip()
或者,您可以通過以下方式分面Order:
ggplot(mydata, aes(x = Taxa, y = Number))
geom_segment(aes(x = Taxa, xend = Taxa, y = 0, yend = Number), color = "grey")
geom_point(size = 3, color = "darkorange")
coord_flip()
facet_grid(Order ~ ., scales = "free_y", space = "free_y", switch = "y")
theme(strip.placement = "outside")
uj5u.com熱心網友回復:
如果要使因子顯示在資料中,請使用級別重構變數為unique(your_column),這將使用它們在資料集中出現的級別。
您的積分以相反的順序排列,只需使用scale_x_discrete(limits=rev)以使其顯示正確:
mydata %>%
mutate(Taxa = factor(Taxa, levels = unique(Taxa))) %>%
ggplot(aes(x = Taxa, y = Number))
geom_segment(aes(x = Taxa, xend = Taxa, y = 0, yend = Number), color = "grey")
geom_point(size = 3, color = "darkorange")
coord_flip()
scale_x_discrete(limits=rev)

更詳盡的解釋:
因子是一個類并包含級別。ggplot根據水平的順序對圖中的因子變數進行排序(因此不根據它們在資料中出現的順序)。如果您對資料集進行排序,級別的順序將保持不變,即,您必須明確地重新排序級別才能做到這一點。因此,對級別進行重新排序的一種方法是使用factor并顯式設定. 這可能有點麻煩,但這是處理因素的最干凈的方法。levelsunique
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/436084.html
