情节() | qplot(..., geom="boxplot",...) 不需要的因子排序 (R 3.1.2)
plot() | qplot(..., geom="boxplot",...) unwanted ordering of factors (R 3.1.2)
我有一个由两列组成的数据框,一列是因子列("C7":"C20"),另一列是数字列。当我尝试绘制数据框时,因素的顺序按字母顺序排列,即从 C10...C20、C7、C8、C9 开始。我正在尝试按顺序进行排序,即 C7 -> C20。
我尝试用因子函数对因子进行排序:
X2 <- factor(X1$column1, levels:c("C7", "C8", "C9", ... , "C20"))
编辑:{我发现上面的代码不正确。详见下方评论}。
但这会将整个数据框更改为因子 class,并且绘图函数无法识别箱线图的因子 -
例如"Error: ggplot2 doesn't know how to deal with data of class factor"
有什么想法吗?
这是一个可能的解决方案:首先绘制没有 x 轴的数据值,然后添加正确的标签
df = data.frame(fact = paste0("C",c(7:20)), num = runif(14))
plot(df$num, xaxt="n")
axis(1, at = 1:length(df$num), labels = df$fact)
然后你可以在plot
中更改type =
来更改绘图类型(点、线、步长等)
我想出了如何更改数据框中变量的 class,这解决了我的问题。我需要引用数据框中的变量来更改它的 class:
df$col1 <- factor(df$col1, levels= c("C7", "C8", "C9", "C10", ..., "C20"))
好的,所以您需要使用 gtools
包中的 mixedsort
才能做到这一点:
mixedsort
根据数字部分对字母数字字符串进行排序,即在这种情况下,这正是您所需要的。
示例数据
x <- factor( rep(c('c1','c2','c10','c11'),each=10))
y <- runif(40)
df <- data.frame(y,x)
boxplot(y ~ x, data=df)
如果绘制此数据,您会发现我遇到了与您相同的问题:
解决方案
但是如果您使用 mixedsort
对级别进行排序,那么问题就解决了:
library(gtools)
df <- data.frame(y,x)
#essentially this is the only line (below) that makes the difference. It just
#orders the factor's levels in the way you want
df$x <- factor(df$x, levels=mixedsort(levels(df$x)))
boxplot(y ~ x, data=df)
我有一个由两列组成的数据框,一列是因子列("C7":"C20"),另一列是数字列。当我尝试绘制数据框时,因素的顺序按字母顺序排列,即从 C10...C20、C7、C8、C9 开始。我正在尝试按顺序进行排序,即 C7 -> C20。
我尝试用因子函数对因子进行排序:
X2 <- factor(X1$column1, levels:c("C7", "C8", "C9", ... , "C20"))
编辑:{我发现上面的代码不正确。详见下方评论}。
但这会将整个数据框更改为因子 class,并且绘图函数无法识别箱线图的因子 - 例如"Error: ggplot2 doesn't know how to deal with data of class factor"
有什么想法吗?
这是一个可能的解决方案:首先绘制没有 x 轴的数据值,然后添加正确的标签
df = data.frame(fact = paste0("C",c(7:20)), num = runif(14))
plot(df$num, xaxt="n")
axis(1, at = 1:length(df$num), labels = df$fact)
然后你可以在plot
中更改type =
来更改绘图类型(点、线、步长等)
我想出了如何更改数据框中变量的 class,这解决了我的问题。我需要引用数据框中的变量来更改它的 class:
df$col1 <- factor(df$col1, levels= c("C7", "C8", "C9", "C10", ..., "C20"))
好的,所以您需要使用 gtools
包中的 mixedsort
才能做到这一点:
mixedsort
根据数字部分对字母数字字符串进行排序,即在这种情况下,这正是您所需要的。
示例数据
x <- factor( rep(c('c1','c2','c10','c11'),each=10))
y <- runif(40)
df <- data.frame(y,x)
boxplot(y ~ x, data=df)
如果绘制此数据,您会发现我遇到了与您相同的问题:
解决方案
但是如果您使用 mixedsort
对级别进行排序,那么问题就解决了:
library(gtools)
df <- data.frame(y,x)
#essentially this is the only line (below) that makes the difference. It just
#orders the factor's levels in the way you want
df$x <- factor(df$x, levels=mixedsort(levels(df$x)))
boxplot(y ~ x, data=df)