【问题标题】:Reorder according variable of melted dataframe根据熔化数据帧的变量重新排序
【发布时间】:2016-10-13 11:58:42
【问题描述】:

我的数据如下:

DF=structure(list(experiment = c("BR", "CH", "EP", "IP", "JU", "MA", 
"SA", "ST", "SV", "VI"), duration = c(28L, 9L, 20L, 4L, 14L, 
30L, 26L, 23L, 17L, 6L), percentage_total_exp = c(47.2222222222222, 
51.063829787234, 52.3809523809524, 79.0322580645161, 48.6842105263158, 
72.7272727272727, 62.0689655172414, 34.469696969697, 61.1111111111111, 
34.8837209302326), nb_reaction = c(29, 29, 14, 11, 40, 11, 14, 
14, 23, 18)), .Names = c("experiment", "duration", "percentage_total_exp", 
"nb_reaction"), row.names = c(NA, -10L), class = "data.frame")

我融化了我的数据以便显示为以下 ggplot

meltR=melt(DF)
ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable)) + geom_bar(stat = "identity", position="dodge")

现在的问题是,我想要这个情节的 3 个版本。一个按变量排序:duration,第二个按变量排序:percentage_total_exp,最后一个按变量排序:nb_reaction

我不知道如何指定。我试过y = reorder(value, -duration),但实际上它没有识别持续时间。在这种情况下,融化是一个坏主意吗?如何做到这一点?

编辑 2:要添加的代码最少,因为我的 experiment 名称实际上很长

plots <- lapply(levels(meltR$variable), function(lev) {
  meltR$experiment <- factor(meltR$experiment, levels = meltR$experiment[order(meltR$value[meltR$variable == lev])])
  ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable)) + geom_bar(stat = "identity", position="dodge") + ggtitle(lev) + theme_bw() + theme(axis.text.x = element_text(size=10, angle=45, hjust=1, vjust=1, face="bold"))
    })
grid.arrange(grobs = plots)

非常感谢

【问题讨论】:

    标签: r ggplot2 melt


    【解决方案1】:

    duration 不是列名,而是您的示例中名为 variable 的列的因子级别。因此,它不是那样工作的。一种选择是遍历三个因子水平或variable,根据value 重新排序它们,然后绘制。以下是它的工作原理:

    library(ggplot2)
    library(reshape2)
    library(gridExtra)
    DF=structure(list(experiment = c("BR", "CH", "EP", "IP", "JU", "MA", 
    "SA", "ST", "SV", "VI"), duration = c(28L, 9L, 20L, 4L, 14L, 
    30L, 26L, 23L, 17L, 6L), percentage_total_exp = c(47.2222222222222, 
    51.063829787234, 52.3809523809524, 79.0322580645161, 48.6842105263158, 
    72.7272727272727, 62.0689655172414, 34.469696969697, 61.1111111111111, 
    34.8837209302326), nb_reaction = c(29, 29, 14, 11, 40, 11, 14, 
    14, 23, 18)), .Names = c("experiment", "duration", "percentage_total_exp", 
    "nb_reaction"), row.names = c(NA, -10L), class = "data.frame")
    meltR=melt(DF)
    plots <- lapply(levels(meltR$variable), function(lev) {
      meltR$experiment <- factor(meltR$experiment, levels = meltR$experiment[order(-meltR$value[meltR$variable == lev])])
      ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable)) + geom_bar(stat = "identity", position="dodge") + ggtitle(lev)
    })
    grid.arrange(grobs = plots)
    

    【讨论】:

    • 太好了!!多谢 :) !最后一点,它是否支持添加主题? (见我的编辑)。当我添加它时,我的情节中没有任何值:/
    • 加不加主题没有区别;例如plots &lt;- lapply(levels(meltR$variable), function(lev) { meltR$experiment &lt;- factor(meltR$experiment, levels = meltR$experiment[order(-meltR$value[meltR$variable == lev])]) ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable)) + geom_bar(stat = "identity", position="dodge") + ggtitle(lev) + theme_bw() + theme(axis.text.x = element_text(angle = 90)) }); grid.arrange(grobs = plots) 也可以。
    • 哦,我明白了,我没有条,因为轴标题太长所以没有条,现在一切正常,非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多