代码之家  ›  专栏  ›  技术社区  ›  Brandon Bertelsen

ggplot2排序绘图第二部分

  •  1
  • Brandon Bertelsen  · 技术社区  · 14 年前

    我有一个融化的数据框,dput(x),如下:

    ## dput(x)    
    x <- structure(list(variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
    2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
    4L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), 
    value = structure(c(1L, 
    2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 
    6L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("Never Heard of", 
    "Heard of but Not at all Familiar", 
    "Somewhat Familiar", "Familiar", "Very Familiar", "Extremely Familiar"
    ), class = "factor"), freq = c(10L, 24L, 32L, 90L, 97L, 69L, 
    15L, 57L, 79L, 94L, 58L, 19L, 11L, 17L, 34L, 81L, 94L, 85L, 4L, 
    28L, 59L, 114L, 82L, 35L)), .Names = c("variable", "value", "freq"
    ), row.names = c(NA, -24L), class = "data.frame")
    

    看起来是这样的(对于那些不需要测试集的人):

       variable                            value freq
    1         a                   Never Heard of   10
    2         a Heard of but Not at all Familiar   24
    3         a                Somewhat Familiar   32
    4         a                         Familiar   90
    5         a                    Very Familiar   97
    6         a               Extremely Familiar   69
    7         b                   Never Heard of   15
    8         b Heard of but Not at all Familiar   57
    9         b                Somewhat Familiar   79
    10        b                         Familiar   94
    11        b                    Very Familiar   58
    12        b               Extremely Familiar   19
    13        c                   Never Heard of   11
    14        c Heard of but Not at all Familiar   17
    15        c                Somewhat Familiar   34
    16        c                         Familiar   81
    17        c                    Very Familiar   94
    18        c               Extremely Familiar   85
    19        d                   Never Heard of    4
    20        d Heard of but Not at all Familiar   28
    21        d                Somewhat Familiar   59
    22        d                         Familiar  114
    23        d                    Very Familiar   82
    24        d               Extremely Familiar   35
    

    ggplot(x, aes(variable, freq, fill = value)) + 
    geom_bar(position = "fill") + 
    coord_flip() + 
    scale_y_continuous("", formatter="percent")
    

    我想做的是排序a,b,c,d由最高到最低的“频率”的“非常熟悉”

    ?relevel ?reorder 没有提供任何关于这个用法的建设性例子。

    谢谢你的帮助。

    贝布

    2 回复  |  直到 14 年前
        1
  •  1
  •   Greg Snow    14 年前

    有一种方法:

    tmpfun <- function(i) {
        tmp <- x[i,]
        -tmp[ tmp$value=='Extremely Familiar', 'freq' ]
    }
    
    x$variable <- reorder( x$variable, 1:nrow(x), tmpfun )
    
        2
  •  3
  •   rcs    14 年前

    tmp <- subset(x, value=="Extremely Familiar")
    x$variable <- factor(x$variable, levels=levels(x$variable)[order(-tmp$freq)])