用ggplot2对条形图进行排序

问题描述:

如果我不够清楚,第一次在这里问这么原谅我。用ggplot2对条形图进行排序

到目前为止,我已经看到很多对类似问题的回复,它们解释了如何通过数据框的某个字段对条进行排序;但我一直没能找到如何将它们通过geom_bar的默认统计“数”排序 例如,运行此代码(这显然不是数据帧的领域。):

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) 

然后我想要显示按高度(= count)排序的结果条。请注意,我必须保留“City.Id”信息以显示在最终的图中。如何才能做到这一点?

既然你已经使用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 

人们可以使用reorder

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

,然后在问题的代码的关系。

enter image description here

+3

为此,您可以在飞行中,呼叫内ggplot:'ggplot(DF,AES(X =重新排序(市,City.Id,长度)))+ geom_bar()'。 – eipi10

+0

@thisisrg我尝试过使用该行,但是df保持不变 – Javi

+0

我添加了该图。你忘了'长度'? – thisisrg