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

Jav*_*avi 2 r bar-chart ggplot2 geom-bar plotly

如果我不够清楚的话,第一次问这里如此原谅我.

到目前为止,我已经看到许多类似问题的回复,这些问题解释了如何通过数据框的某个字段对条形图进行排序; 但我一直无法找到如何根据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)
Run Code Online (Sandbox Code Playgroud)

然后我想通过它们的高度(=计数)可视化生成的条形图.请注意,我必须保留"City.Id"信息以显示在最终的图中.如何才能做到这一点?

Jim*_*ach 6

鉴于你已经在使用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
Run Code Online (Sandbox Code Playgroud)


thi*_*srg 5

一个可以使用reorder

df$City <- reorder(df$City,df$City.Id,length)
Run Code Online (Sandbox Code Playgroud)

然后用问题中的代码绘图。

在此处输入图片说明

  • 您可以在调用 ggplot 时即时执行此操作:`ggplot(df, aes(x=reorder(City, City.Id, length))) + geom_bar()`。 (4认同)