按两个因素排列

arrange by two factors

我一整天都在尝试通过一个名为 "score" 的数值来排列两个名为 "type" 和 "name" 的因子水平,并按类别类型绘制(颜色由类型)按分数排序。我还试图将名为 "ALL" 的组置于顶部,以便它与 "type" 中的其他 3 个类别分开。到目前为止,我的尝试都非常失败,我不明白为什么我什至无法正确重新排序。非常感谢任何帮助。

这是我的数据:

df = structure(list(score = c(12, 12.2, 12.5, 12.3, 12.2, 12.4, 12.5, 12.7, 12.1, 12.8, 12.4, 12.3, 12.2, 12.6, 12.8, 12.1, 12.5), range1 = c(0.003356, 1.20497, -0.128138, -42.6093, -41.1975, -44.706, -20, -46.4245, -0.543379, 2.09828, -20, -20, -44.2262, -46.6559, -20, -20, 2.37709), point = c(1.56805, 2.11176, 0.1502, -22.6093, -21.1975, -24.706, -0.491829, -26.4245, 2.49973, 2.94457, 0.0443572, 0.0208999, -24.2262, -26.6559, 2.69408, 3.22951, 3.33255), range2 = c(2.3767, 2.73239, 0.430373, 4.34247, 4.96875, 3.78027, 1.91331, 4.07937, 3.54538, 3.5491, 1.87162, 2.41067, 5.26578, 4.50965, 4.55967, 5.05772, 3.97742), type = structure(c(1L, 1L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("ALL", "A", "B", "C"), class = "factor"), name = structure(c(13L, 14L, 15L, 1L, 4L, 5L, 6L, 8L, 12L, 17L, 2L, 3L, 7L, 9L, 10L, 11L, 16L), .Label = c("B_vision1", "C_vision2", "C_vision3", "B_vision4", "B_vision5", "A_vision2", "C_vision4", "B_vision6", "C_vision6", "C_vision5", "C_vision1", "B_vision7", "B_ALL", "C_ALL", "A", "C_vision7", "B_vision3"), class = "factor")), .Names = c("score", "range1", "point", "range2", "type", "name"), row.names = c(NA, -17L), class = "data.frame")

我已经尝试了所有这些选项:

df$name2 = reorder(df$name, -df$score)
# df$name <- reorder(df$name, -df$score)
df <- transform(df, category2 = factor(paste(name, type)))
df <- transform(df, category2 = reorder(category2, score))

#library(plyr)
#df = arrange(df,type, name)

ggplot(df, aes(x=name, y=point, ymin=range1, ymax=range2, colour=type)) +
    geom_pointrange() +
    coord_flip()

ggplot(df, aes(x=category2, y=point, ymin=range1, ymax=range2, colour=type)) +
    geom_pointrange() +
    coord_flip()

我正在尝试获得类似于 this question 上的分组森林图的内容,但每个组由 names 定义并由 score 重新排序。

我想我已经正确地解释了你想做的事情,但我可能理解错了。

姓名(和分数)可以按分数排序列表排序,如

ordered.names  <- as.character(df$name)[order(df$score)]
ordered.scores <- as.character(df$score)[order(df$score)]

Re-ordering 名称级别(带有注释的分数)是

df$name <- factor(df$name, levels=ordered.names, labels=paste(ordered.names, "(", ordered.scores, ")"))

ggplot绘制这些:

library(ggplot)
ggplot(df, aes(x=name, y=point, ymin=range1, ymax=range2, group=type, color=type)) + 
  geom_pointrange() + 
  theme(axis.text.x=element_text(angle=90, hjust=0))

产生

如果你也想按类型分割,你可以对情节进行分面

ggplot(df, aes(x=name, y=point, ymin=range1, ymax=range2, group=type, color=type)) + 
  geom_pointrange() + 
  theme(axis.text.x=element_text(angle=90, hjust=0)) + 
  facet_wrap(~type, ncol=4, scale="free_x")