簡體   English   中英

如何更改 ggplot2 中條形圖的順序(類別)? 翻轉我的傳說?

[英]How can I change the order (categories) of my bar charts in ggplot2? and flip my legend?

這是我的數據的樣子

print(genderbyage)
                Var1   Var2 Freq
1     70 and Greater Female    4
2  BETWEEN 12 AND 17 Female    1
3  BETWEEN 18 AND 23 Female    8
4  BETWEEN 24 AND 44 Female   53
5  BETWEEN 45 AND 54 Female   33
6  BETWEEN 55 AND 69 Female   28
7   BETWEEN 6 AND 11 Female    6
8        Less than 5 Female    6
9     70 and Greater   Male    4
10 BETWEEN 12 AND 17   Male    3
11 BETWEEN 18 AND 23   Male   10
12 BETWEEN 24 AND 44   Male  109
13 BETWEEN 45 AND 54   Male   56
14 BETWEEN 55 AND 69   Male   85
15  BETWEEN 6 AND 11   Male    2
16       Less than 5   Male    6

這是我的 ggplot2 代碼和 output

ggplot(data = genderbyage, 
       mapping = aes(x = Var1, y = ifelse(Var2 == "Male", yes = -Freq, no = Freq), 
                     fill = Var2)) +
  geom_col(col = "black") +
  coord_flip() +
  scale_y_continuous(labels = abs, limits = max(genderbyage$Freq) * c(-1,1),
                     breaks = seq(-150,150,by = 25)) +
  labs(y = "Population") + 
  labs(title="Age Distribution by Male & Female Genders",
       x="Age Range", 
       y="Individuals Counted",
       fill = "Gender") + 
  scale_fill_brewer(palette = "Set1")

在此處輸入圖像描述

問題是我需要條形圖按順序排列。 所以例如我需要,

  1. 小於 5
  2. 6 到 11 歲之間
  3. 12 歲和 17 歲之間
  4. 18 至 23 歲之間
  5. 24 至 44 歲之間
  6. 45 至 54 歲之間
  7. 55 至 69 歲之間
  8. 70 歲及以上

我怎樣才能重新排列我的欄以按該順序排列?

另外,我該如何修復我的圖例,以便女性位於底部。

變量按照其因子的順序在ggplot中繪制。 您可以像這樣手動設置它們:

ggplot(data = genderbyage, 
       mapping = aes(x = factor(Var1,
                                levels = rev(c("Less than 5",
                                               "BETWEEN 6 AND 11",
                                               "BETWEEN 12 AND 17",
                                               "BETWEEN 18 AND 23",
                                               "BETWEEN 24 AND 44",
                                               "BETWEEN 45 AND 54",
                                               "BETWEEN 55 AND 69",
                                               "70 and Greater"))) ,
                     y = ifelse(Var2 == "Male", yes = -Freq, no = Freq), 
                     fill = factor(Var2, levels = c("Male",
                                                    "Female")))) +
  geom_col(col = "black") +
  coord_flip() +
  scale_y_continuous(labels = abs, limits = max(genderbyage$Freq) * c(-1,1),
                     breaks = seq(-150,150,by = 25)) +
  labs(y = "Population") + 
  labs(title="Age Distribution by Male & Female Genders",
       x="Age Range", 
       y="Individuals Counted",
       fill = "Gender") + 
  scale_fill_brewer(palette = "Set1")

在此處輸入圖像描述

問題是因子變量的水平默認按字母數字順序排列。 所以你需要重新排序級別。 一種方法是使用forcats::fct_relevel()

library(dplyr)
library(ggplot2)
library(forcats)

genderbyage %>% 
  mutate(Var2 = fct_relevel(Var2, "Male", "Female"),
         Var1 = fct_relevel(Var1, "Less than 5", "BETWEEN 6 AND 11", "BETWEEN 12 AND 17", "BETWEEN 18 AND 23", 
                                  "BETWEEN 24 AND 44", "BETWEEN 45 AND 54", "BETWEEN 55 AND 69" ,"70 and Greater")) %>% 
  ggplot(mapping = aes(x = Var1, y = ifelse(Var2 == "Male", yes = -Freq, no = Freq), 
                       fill = Var2)) +
  geom_col(col = "black") +
  coord_flip() +
  scale_y_continuous(labels = abs, limits = max(genderbyage$Freq) * c(-1,1),
                     breaks = seq(-150,150,by = 25)) +
  labs(y = "Population") + 
  labs(title="Age Distribution by Male & Female Genders",
       x="Age Range", 
       y="Individuals Counted",
       fill = "Gender") + 
  scale_fill_brewer(palette = "Set1")

在此處輸入圖像描述

暫無
暫無

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

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