在ggplot条形图R中按特定年份排序变量
Ordering a variable by a specific year in ggplot bar chart R
我有一个关于使用 ggplot 创建的条形图的特定值排序的问题。
我的数据“df”如下:
city X2020 X2021
1 Stuttgart 2.9 3.1
2 Munich 2.3 2.4
3 Berlin 2.2 2.3
4 Hamburg 3.8 4.0
5 Dresden 3.3 3.0
6 Dortmund 2.5 2.6
7 Paderborn 1.7 1.8
8 Essen 2.6 2.6
9 Heidelberg 3.0 3.2
10 Karlsruhe 2.5 2.4
11 Kiel 2.6 2.7
12 Ravensburg 3.3 2.7
我想要下面这种条形图,但城市应该只按 2021 的值排序!我按照建议在 ggplot 中尝试了“重新排序”,但这不适合。有些城市的顺序很奇怪,我不明白 R 在这里做什么。我的代码如下:
df_melt <- melt(df, id = "city")
ggplot(df_melt, aes(value, reorder(city, -value), fill = variable)) +
geom_bar(stat="identity", position = "dodge")
str(df_melt)
'data.frame': 24 obs. of 3 variables:
$ city : chr "Stuttgart" "Munich" "Berlin" "Hamburg" ...
$ variable: Factor w/ 2 levels "X2020","X2021": 1 1 1 1 1 1 1 1 1 1 ...
$ value : num 2.9 2.3 2.2 3.8 3.3 2.5 1.7 2.6 3 2.5 ...
https://i.stack.imgur.com/rJQMV.png
我认为这变得混乱,因为在变量“值”中有 2020 和 2021 的值,R 可能取两者的平均值(我不知道!)。但是我不知道要进一步处理这个问题。我希望有人能帮助我解决我的问题。
谢谢!
您可以尝试使用 arrange
对您的 df 进行排序,然后使用 fct_inorder
来确保城市级别符合您的要求。
library(tidyverse)
df <- read_table(" city X2020 X2021
1 Stuttgart 2.9 3.1
2 Munich 2.3 2.4
3 Berlin 2.2 2.3
4 Hamburg 3.8 4.0
5 Dresden 3.3 3.0
6 Dortmund 2.5 2.6
7 Paderborn 1.7 1.8
8 Essen 2.6 2.6
9 Heidelberg 3.0 3.2
10 Karlsruhe 2.5 2.4
11 Kiel 2.6 2.7
12 Ravensburg 3.3 2.7 ")
#> Warning: Missing column names filled in: 'X1' [1]
df %>%
select(-X1) %>%
pivot_longer(-city) %>%
arrange(desc(name), -value) %>%
mutate(
city = fct_inorder(city)
) %>%
ggplot(aes(city, value, fill = name)) +
geom_col(position = "dodge")
由 reprex package (v1.0.0)
于 2021 年 7 月 13 日创建
我只是想补充一下之前的答案,您也可以使用此图并使用 coord_flip()
来获得您正在寻找的最终结果。
我有一个关于使用 ggplot 创建的条形图的特定值排序的问题。
我的数据“df”如下:
city X2020 X2021
1 Stuttgart 2.9 3.1
2 Munich 2.3 2.4
3 Berlin 2.2 2.3
4 Hamburg 3.8 4.0
5 Dresden 3.3 3.0
6 Dortmund 2.5 2.6
7 Paderborn 1.7 1.8
8 Essen 2.6 2.6
9 Heidelberg 3.0 3.2
10 Karlsruhe 2.5 2.4
11 Kiel 2.6 2.7
12 Ravensburg 3.3 2.7
我想要下面这种条形图,但城市应该只按 2021 的值排序!我按照建议在 ggplot 中尝试了“重新排序”,但这不适合。有些城市的顺序很奇怪,我不明白 R 在这里做什么。我的代码如下:
df_melt <- melt(df, id = "city")
ggplot(df_melt, aes(value, reorder(city, -value), fill = variable)) +
geom_bar(stat="identity", position = "dodge")
str(df_melt)
'data.frame': 24 obs. of 3 variables:
$ city : chr "Stuttgart" "Munich" "Berlin" "Hamburg" ...
$ variable: Factor w/ 2 levels "X2020","X2021": 1 1 1 1 1 1 1 1 1 1 ...
$ value : num 2.9 2.3 2.2 3.8 3.3 2.5 1.7 2.6 3 2.5 ...
https://i.stack.imgur.com/rJQMV.png
我认为这变得混乱,因为在变量“值”中有 2020 和 2021 的值,R 可能取两者的平均值(我不知道!)。但是我不知道要进一步处理这个问题。我希望有人能帮助我解决我的问题。
谢谢!
您可以尝试使用 arrange
对您的 df 进行排序,然后使用 fct_inorder
来确保城市级别符合您的要求。
library(tidyverse)
df <- read_table(" city X2020 X2021
1 Stuttgart 2.9 3.1
2 Munich 2.3 2.4
3 Berlin 2.2 2.3
4 Hamburg 3.8 4.0
5 Dresden 3.3 3.0
6 Dortmund 2.5 2.6
7 Paderborn 1.7 1.8
8 Essen 2.6 2.6
9 Heidelberg 3.0 3.2
10 Karlsruhe 2.5 2.4
11 Kiel 2.6 2.7
12 Ravensburg 3.3 2.7 ")
#> Warning: Missing column names filled in: 'X1' [1]
df %>%
select(-X1) %>%
pivot_longer(-city) %>%
arrange(desc(name), -value) %>%
mutate(
city = fct_inorder(city)
) %>%
ggplot(aes(city, value, fill = name)) +
geom_col(position = "dodge")
由 reprex package (v1.0.0)
于 2021 年 7 月 13 日创建我只是想补充一下之前的答案,您也可以使用此图并使用 coord_flip()
来获得您正在寻找的最终结果。