首页 > 解决方案 > 如何在 ggplot geom_point 中实现轴条目的方面特定排序?

问题描述

我考虑以下类型的geom_point情节。我需要为每个垂直面根据它们的大小s对条目进行排序。下图中所需的顺序是A、C、B、D 和B、A、C(或 B、C、A)。困难在于,虽然我可以通过重新排列 factor 的级别来指定一般顺序,但我不知道如何为每个方面更改此顺序。mvs1s2m

set.seed(1)
m1 = c('A','B','C','D')
m2 = c('A','B','C')
s = c(rep('s1',4),rep('s2',3))
d = data.frame(m = factor(c(m1,m2)), s=factor(s), v=sample(1:10, replace=T,7))

library(ggplot2)
ggplot(d, aes(x=m, y=v)) + geom_point(size=2) + coord_flip() + 
  facet_grid( s~. , scales='free', space='free')

在此处输入图像描述

标签: rggplot2facet

解决方案


一种选择是确实使用您所描述的因子级别,但使用一个前缀来分隔不同方面的级别。稍后,您可以使用labelsscale 的参数来删除前缀。下面的例子:

set.seed(1)
m1 = c('1A','1B','1C','1D')
m2 = c('2A','2B','2C')
s = c(rep('s1',4),rep('s2',3))
d = data.frame(m = c(m1,m2), 
               s=factor(s), 
               v=sample(1:10, replace=T,7),
               stringsAsFactors = FALSE)
d$m <- factor(d$m, levels = c("1A", "1C", "1B", "1D", "2B", "2A", "2C"))

library(ggplot2)
ggplot(d, aes(x=m, y=v)) + 
  geom_point(size=2) + 
  coord_flip() + 
  facet_grid( s~. , scales='free', space='free') +
  scale_x_discrete(
    labels = function(x){substr(x, 2, nchar(x))}
  )


推荐阅读