我目前正在使用ggplot2 facet_grid
生成预测算法的比较图。有没有办法指定子图的顺序?在我的情况下,我有兴趣通过MSE按升序查看它们。我怎样才能做到这一点?阅读facet_grid
文档并没有任何响亮。
绘图代码如下所示:
ggplot(df_all, mapping=aes(x=t, y=value, color=label, shape=label)) +
geom_point() + ggtitle('Test vs. Predicted') + theme(legend.position='none') + facet_grid(. ~ group) +
geom_segment(data=df_error_all, aes(x=df_error_all$x,y=df_error_all$y,xend=df_error_all$xend,yend=df_error_all$yend), size=0.3) +
geom_segment(data=df_arrow_all, aes(x=df_arrow_all$x,y=df_arrow_all$y,xend=df_arrow_all$xend,yend=df_arrow_all$yend), size=0.3)
答案 0 :(得分:4)
正如@joran和其他人所提到的,facet_grid排序基于factor列的级别。
您可以使用relevel
更改订单。 (修改原始列或创建新列)
df_all[["newGroup"]] <- relevel(df_all[["group"]], "value1")
## OR:
df_all[["group"]] <- relevel(df_all[["group"]], "value1")
我的utils文件中有以下函数,一旦碰到relevel
,我认为这是多余的。但正如@DWin在下面的评论中指出的那样,relevel
不能使用多个级别作为ref
的值。
在这些情况下,setFactorOrder
可能会有用
setFactorOrder <- function(x, order=sort(levels(x))) {
# Returns a factor ordered by `order`.
# If order is missing, defaults to `levels(x)` if available, else to `sort(unique(x))`
# Useful for ggplot and elsewhere were ordering is based on the order of the levels
if (!is.factor(x)) {
warning("`x` is not a factor. Will coerce.")
levs <- sort(unique(x))
if (missing(order))
order <- levs
} else {
levs <- levels(x)
}
# any values in order, not in levels(x)
NotInx <- setdiff(order, levs)
if (length(NotInx)) {
warning ("Some values not in x:\n", paste(NotInx, collapse=", "))
}
# levels(x) not explicitly named in order
Remaining <- setdiff(levs, order)
order <- c(setdiff(order, NotInx), Remaining)
factor(x, level=order)
}
setFactorOrder
的结果,如:x <- setFactorOrder(x, c("value1", "value2"))
# or
df_all[["group"]] <- setFactorOrder(df_all[["group"]], c("Ketchup", "Catsup", "Mustard"))