更改离散x比例的顺序

我正在使用离散x尺度的ggplot制作一个闪避的条形图,x轴现在按照字母顺序排列,但我需要重新排列它,以便按照y轴的值sorting(即最高的小节将定位在左侧)。

我尝试了顺序或sorting,但导致sorting的X轴,而不是分别为条。

我做错了什么?

尝试在x轴上手动设置因子的级别。 例如:

library(ggplot2) # Automatic levels ggplot(mtcars, aes(factor(cyl))) + geom_bar() 

自动确定因子水平的汽车数据集的ggplot

 # Manual levels cyl_table <- table(mtcars$cyl) cyl_levels <- names(cyl_table)[order(cyl_table)] mtcars$cyl2 <- factor(mtcars$cyl, levels = cyl_levels) # Just to be clear, the above line is no different than: # mtcars$cyl2 <- factor(mtcars$cyl, levels = c("6","4","8")) # You can manually set the levels in whatever order you please. ggplot(mtcars, aes(cyl2)) + geom_bar() 

汽车数据集的ggplot,手动重新排序

正如詹姆斯在他的回答中所指出的那样, reorder是重新sorting因素水平的惯用方式。

 mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x))) ggplot(mtcars, aes(cyl3)) + geom_bar() 

汽车数据集的ggplot使用重新排序功能重新排序

对我来说最好的方法是使用带有类别的向量,以便将scale_x_discrete作为参数limits 。 我认为这是非常简单和直接的解决scheme。

 ggplot(mtcars, aes(factor(cyl))) + geom_bar() + scale_x_discrete(limits=c(8,4,6)) 

在这里输入图像描述

您可以使用reorder

 qplot(reorder(factor(cyl),factor(cyl),length),data=mtcars,geom="bar") 

编辑:

要在左边有最高的酒吧,你必须使用一点点混乱:

 qplot(reorder(factor(cyl),factor(cyl),function(x) length(x)*-1), data=mtcars,geom="bar") 

我希望这也有负面的高度,但它不,所以它的作品!

哈德利一直在开发一个叫做forcats的软件包。 这个软件包使得任务变得更加简单。 当你想改变一个因子频率的x轴的顺序时,你可以利用fct_infreq() 。 在这篇文章中的mtcars例子中,你想按照每个级别的频率对cyl进行重新sorting。 出现最频繁的级别停留在左侧。 所有你需要的是fct_infreq()

 library(ggplot2) library(forcats) ggplot(mtcars, aes(fct_infreq(factor(cyl)))) + geom_bar() + labs(x = "cyl") 

如果你想fct_rev()方法,你可以使用fct_rev()fct_infreq()

 ggplot(mtcars, aes(fct_rev(fct_infreq(factor(cyl))))) + geom_bar() + labs(x = "cyl") 

在这里输入图像描述

我意识到这是旧的,但也许我创build的这个function是有用的在那里的人:

 order_axis<-function(data, axis, column) { # for interactivity with ggplot2 arguments <- as.list(match.call()) col <- eval(arguments$column, data) ax <- eval(arguments$axis, data) # evaluated factors a<-reorder(with(data, ax), with(data, col)) #new_data df<-cbind.data.frame(data) # define new var within(df, do.call("<-",list(paste0(as.character(arguments$axis),"_o"), a))) } 

现在,使用这个函数,你可以用ggplot2交互地绘图,就像这样:

 ggplot(order_axis(df, AXIS_X, COLUMN_Y), aes(x = AXIS_X_o, y = COLUMN_Y)) + geom_bar(stat = "identity") 

可以看出, order_axis函数创build了另一个数据order_axis其中一个新列的名称相同,但末尾带有一个_o 。 这个新的列按照升序排列,所以ggplot2按照这个顺序自动绘制。

这是有限的(只适用于字符或因子和列的数字组合和升序),但我仍然发现它非常有用的绘图在旅途中。