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

3

这是我第一次在这里提问,如果我表达不够清楚请见谅。

到目前为止,我看到了许多关于如何按数据框的某个字段排序条形图的类似问题的答案;但我一直没有找到如何按照 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”信息以在最终图中显示。如何实现?

2个回答

6
考虑到您已经在使用 ggplot2 ,我建议您进一步了解 tidyverse 所能提供的其他工具,尤其是 forcats 包用于处理因子。

forcats 拥有一个非常好用的函数 fct_infreq(),可以将因子的水平值(re)设置为按其频率排序。如果数据是一个字符向量而不是因子(例如您的数据中的 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

5

可以使用reorder

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

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

输入图像描述


4
你可以在ggplot函数的调用中实时进行此操作:ggplot(df, aes(x=reorder(City, City.Id, length))) + geom_bar() - eipi10
@thisisrg 我尝试使用那行代码,但是数据框仍然保持不变。 - Javi
我已添加了图表。你忘记了“长度”吗? - thisisrg
可能是我做对了,因为我再试了一次就成功了。谢谢! - Javi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接