Answers:
尝试在X轴上手动设置因子的水平。例如:
library(ggplot2)
# Automatic levels
ggplot(mtcars, aes(factor(cyl))) + geom_bar()
# 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()
正如詹姆斯在回答中指出的那样,这reorder
是重新排列因子水平的惯用方式。
mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x)))
ggplot(mtcars, aes(cyl3)) + geom_bar()
对我来说,最好的方法是使用带有类别的vector,以便将其作为的limits
参数scale_x_discrete
。我认为这是非常简单直接的解决方案。
ggplot(mtcars, aes(factor(cyl))) +
geom_bar() +
scale_x_discrete(limits=c(8,4,6))
factor
和reorder
更改数据的特征(尽管在ggplot()
调用中),对于眼前的问题,它所做的比其需要做的更多。
scale_x_discrete(limits = DT$x[order(-DT$y)])+
您可以使用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")
我希望它也有负高度,但事实并非如此,所以它可行!
Hadley一直在开发一个名为的软件包forcats
。该软件包使任务变得如此简单。fct_infreq()
当您想通过因子频率更改x轴的顺序时,可以利用。对于本文中的mtcars
示例,您想cyl
按每个级别的频率对级别进行重新排序。最常出现的级别停留在左侧。您所需要的就是fct_infreq()
。
library(ggplot2)
library(forcats)
ggplot(mtcars, aes(fct_infreq(factor(cyl)))) +
geom_bar() +
labs(x = "cyl")
如果您想反方向使用,可以fct_rev()
与一起使用fct_infreq()
。
ggplot(mtcars, aes(fct_rev(fct_infreq(factor(cyl))))) +
geom_bar() +
labs(x = "cyl")
我意识到这很旧,但是也许我创建的这个功能对那里的人有用:
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
函数创建了另一个数据框,该数据框的新列名为same,但_o
末尾有a 。此新列的级别按升序排列,因此ggplot2会自动按照该顺序进行绘制。
这在某种程度上是受限制的(仅适用于字符或因子以及列和升序的数字组合),但我仍然发现它对于随时随地进行绘制非常有用。
reorder
直接使用相比,我想我看不出有什么好处。ggplot(df, aes(x = reorder(AXIS_X, COLUMN_Y), y = COLUMN_Y)) + ...
简而言之,没有帮助程序功能,是否会做同样的事情?