R 按频率/值对离散x标度进行排序

R 按频率/值对离散x标度进行排序,r,ggplot2,r-faq,R,Ggplot2,R Faq,我正在使用带有离散x刻度的ggplot制作一个减淡条形图,x轴现在按字母顺序排列,但我需要重新排列,使其按y轴的值排序(即,最高的条形图将位于左侧) 我尝试了排序或排序,但结果是对x轴进行排序,而不是分别对条进行排序 我做错了什么?尝试手动设置x轴上的因子级别。例如: library(ggplot2) # Automatic levels ggplot(mtcars, aes(factor(cyl))) + geom_bar() 尝试手动设置x轴上的系数级别。例如: library(

我正在使用带有离散x刻度的ggplot制作一个减淡条形图,x轴现在按字母顺序排列,但我需要重新排列,使其按y轴的值排序(即,最高的条形图将位于左侧)

我尝试了排序或排序,但结果是对x轴进行排序,而不是分别对条进行排序


我做错了什么?

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

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


尝试手动设置x轴上的系数级别。例如:

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


您可以使用
重新排序

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")

我希望这也有负高度,但它没有,所以它的工作

您可以使用
重新排序

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")

我希望这也有负高度,但它没有,所以它的工作

对我来说,最好的方法是使用带有类别的向量,以便将
参数限制为
scale\x\u discrete
。我认为这是一个非常简单明了的解决方案

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

对我来说,最好的方法是按我需要的顺序使用带有类别的向量,因为
参数限制为
缩放x_离散
。我认为这是一个非常简单明了的解决方案

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

我意识到这很旧,但我创建的这个函数可能对其他人有用:

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)))
}
可以看出,
order\u axis
函数创建了另一个数据帧,其中新列的名称相同,但末尾有一个
\u o
。此新列的标高按升序排列,因此ggplot2会自动按该顺序打印


这有点有限(仅适用于字符或因子以及列的数字组合,并按升序排列),但我仍然发现它对于在移动中绘图非常有用

我意识到这很古老,但我创建的这个函数可能对其他人有用:

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)))
}
可以看出,
order\u axis
函数创建了另一个数据帧,其中新列的名称相同,但末尾有一个
\u o
。此新列的标高按升序排列,因此ggplot2会自动按该顺序打印


这有点有限(仅适用于字符或因子以及列的数字组合,并按升序排列),但我仍然发现它对于在移动中绘图非常有用

哈德利一直在开发一个名为
forcats
的软件包。这个软件包使任务变得容易多了。当您想通过因子的频率更改x轴的顺序时,可以利用
fct_informeq()
。在本帖中的
mtcars
示例中,您希望根据每个级别的频率对
cyl
的级别进行重新排序。最常出现的标高保持在左侧。您只需要
fct\u informeq()

如果您想换一种方式,可以使用
fct\u rev()
以及
fct\u informeq()


哈德利一直在开发一个名为
forcats
的软件包。这个软件包使任务变得容易多了。当您想通过因子的频率更改x轴的顺序时,可以利用
fct_informeq()
。在本帖中的
mtcars
示例中,您希望根据每个级别的频率对
cyl
的级别进行重新排序。最常出现的标高保持在左侧。您只需要
fct\u informeq()

如果您想换一种方式,可以使用
fct\u rev()
以及
fct\u informeq()

如果您事先知道要绘制的标高,那就太好了。如果您不这样做(例如,因为您不想绘制数据中不存在的级别),请考虑使用<代码>限制>代码>函数来指定顺序:

库(ggplot2)
如果您事先知道要绘制的级别,我的命令就非常好。如果您不这样做(例如,因为您不想绘制数据中不存在的级别),请考虑使用<代码>限制>代码>函数来指定顺序:

库(ggplot2)

my_order@HendyIrawan没有图例,除非您将其他维度(颜色、填充)也映射到同一个变量。我认为这是最好的答案。它控制x轴值的顺序,不变换或影响数据帧。使用
因子
重新排序
会改变数据的特征,尽管是在
ggplot()
调用中,因此对手头的问题所做的事情比需要做的要多。这应该是公认的答案!!为什么要为一行优雅的(预定义的)代码编写2到3行代码来让事情复杂化?这对我来说也可以用y值对x进行排序:
scale\ux\u discrete(limits=DT$x[order(-DT$y)])+
如果你想为所有可能的级别指定顺序,但不想让未使用的级别在绘图中结束,请检查。@HendyIrawan没有图例,除非其他维度(颜色、填充)也映射到同一个变量。我认为这是最好的答案。它控制x轴值的顺序,不变换或影响数据帧。使用
因子
重新排序
会改变数据的特征,尽管是在
ggplot()
调用中,因此对手头的问题所做的事情比需要做的要多。这应该是公认的答案!!为什么要为一行优雅的(预定义的)代码编写2到3行代码来让事情复杂化?这对我来说也可以用y值对x进行排序:
scale\ux\u discrete(limits=DT$x[order(-DT$y)])+
如果你想为所有可能的级别指定顺序,但不想让未使用的级别在绘图中结束,看看。我很震惊这个答案没有更多的u