使用 ggplot2 对条形图中的条形进行排序

Sorting bars in a bar chart with ggplot2

第一次在这里问,如有不清楚之处还请见谅

到目前为止,我已经看到很多类似问题的回复,它们解释了如何根据数据框的某个字段对条形图进行排序;但我一直无法找到如何通过 geom_bar 的默认统计数据 "count" 对它们进行排序(这显然不是数据框的字段。) 比如我运行这段代码:

library(ggplot2)

Name <- c( 'Juan','Michael','Andrea','Charles','Jonás','Juan','Donata','Flavia' )
City <- c('Madrid','New York','Madrid','Liverpool','Madrid','Buenos Aires','Rome','Liverpool')
City.Id <- c(1,2,1,3,1,4,5,3)
df = data.frame( Name,City,City.Id )

a <- ggplot( df,aes( x = City, text=paste("City.Id=",City.Id)) ) +
geom_bar()

ggplotly(a)

然后我想可视化按高度(=计数)排序的结果条。请注意,我必须保留 "City.Id" 信息以显示在最终图中。如何做到这一点?

可以使用 reorder :

df$City <- reorder(df$City,df$City.Id,length)

然后用题中的代码作图

鉴于您已经在使用 ggplot2,我建议您研究一下 tidyverse 还能提供什么。即用于处理因子的 forcats 包。

forcats 有一个很好的函数 fct_infreq(),它将(重新)设置一个因子的水平,使其按照它们的频率顺序排列。如果数据是一个尚未成为因子的字符向量(例如 City 在您的数据中),那么它将首先使其成为一个因子,然后将级别设置为按频率顺序排列。

试试这个代码:

# Load packages
library(ggplot2)
library(forcats)

# Create data
Name <- c( 'Juan','Michael','Andrea','Charles','Jonás','Juan','Donata','Flavia' )
City <- c('Madrid','New York','Madrid','Liverpool','Madrid','Buenos Aires','Rome','Liverpool')
City.Id <- c(1,2,1,3,1,4,5,3)
df = data.frame( Name,City,City.Id )

# Create plot
a <- ggplot(df, aes(x = fct_infreq(City), text=paste("City.Id=",City.Id)) ) +
  geom_bar()

a