R 按频率/值对离散x标度进行排序
我正在使用带有离散x刻度的ggplot制作一个减淡条形图,x轴现在按字母顺序排列,但我需要重新排列,使其按y轴的值排序(即,最高的条形图将位于左侧) 我尝试了排序或排序,但结果是对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轴上的因子级别。例如:
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