使用 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
第一次在这里问,如有不清楚之处还请见谅
到目前为止,我已经看到很多类似问题的回复,它们解释了如何根据数据框的某个字段对条形图进行排序;但我一直无法找到如何通过 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