【问题标题】:Ordered and Sorted ggplot Bar Graph有序和排序的ggplot条形图
【发布时间】:2015-01-29 23:39:55
【问题描述】:

我正在尝试从我的数据集中创建“治疗”和“日”之间交互的条形图。我希望“治疗”按以下顺序排序:“之前”、“期间”和“之后”,我还希望“第 1 天”和“第 2 天”“之前”、“期间”和“之后”在彼此,而不是将每个“天”组合在一起。这是我的数据集:

structure(list(Name = structure(c(9L, 9L, 5L, 5L, 14L, 14L, 15L, 
15L, 1L, 1L, 7L, 7L, 12L, 12L, 2L, 2L, 11L, 11L, 16L, 16L, 13L, 
13L, 6L, 6L, 8L, 8L, 3L, 3L, 4L, 4L, 10L, 10L, 9L, 9L, 5L, 5L, 
14L, 14L, 15L, 15L, 1L, 1L, 7L, 7L, 12L, 12L, 2L, 2L, 11L, 11L, 
16L, 16L, 13L, 13L, 6L, 6L, 8L, 8L, 3L, 3L, 4L, 4L, 10L, 10L, 
9L, 9L, 5L, 5L, 14L, 14L, 15L, 15L, 1L, 1L, 7L, 7L, 12L, 12L, 
2L, 2L, 11L, 11L, 16L, 16L, 13L, 13L, 6L, 6L, 8L, 8L, 3L, 3L, 
4L, 4L, 10L, 10L), .Label = c("DSGW", "DSOR", "DSYB", "GSWP", 
"LSGL", "LSLL", "OSLL", "PSYP", "PSYR", "RSBB", "RSBP", "RSYY", 
"WSGG", "WSPB", "WSRR", "WSRW"), class = "factor"), Day = c(1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), 
Treatment = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("After", 
"Before", "During"), class = "factor"), Behavior = c(3040L, 
3219L, 2378L, 3529L, 3135L, 3702L, 2868L, 3035L, 1614L, 833L, 
1255L, 1224L, 1569L, 1433L, 1567L, 1448L, 1197L, 1619L, 1543L, 
1309L, 1738L, 1378L, 1362L, 1603L, 1109L, 1073L, 570L, 822L, 
815L, 1166L, 0L, 835L, 3060L, 2815L, 2875L, 3394L, 3009L, 
3274L, 2350L, 2455L, 972L, 815L, 983L, 1033L, 1520L, 1477L, 
1461L, 1395L, 1242L, 1368L, 1637L, 1275L, 1646L, 1546L, 1064L, 
971L, 596L, 1461L, 1276L, 1272L, 872L, 1026L, 1249L, 592L, 
2277L, 3022L, 2997L, 3495L, 2591L, 3447L, 2479L, 2701L, 175L, 
452L, 1287L, 1355L, 1252L, 1501L, 1371L, 1147L, 1465L, 1003L, 
1510L, 0L, 1744L, 1026L, 959L, 898L, 1529L, 1092L, 417L, 
289L, 40L, 762L, 1495L, 896L)), .Names = c("Name", "Day", 
"Treatment", "Behavior"), class = "data.frame", row.names = c(NA, 
-96L))

这是我用来生成当前人物的脚本:

   ggplot(perch1, aes(x = interaction(Treatment,Day), y = Behavior, fill =  factor(Day)))

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    另一种方法是使用 facet wrap 在单独的面板中绘制每个处理。

    ggplot(df, aes(x = factor(Day), y = Behavior, fill = factor(Day))) + 
           geom_bar(stat = 'identity') + facet_wrap(~Treatment, nrow = 1) 
    

    这不会在 X 轴上标记您的交互,而是将其放在面板标题中。

    【讨论】:

    • 感谢您抽出宝贵时间提供替代解决方案。我认为这种方式更干净一些;但是,我确信有办法用第一个答案清理 x 轴,我只是对 ggplot 不太熟练。我会说这个解决方案本身并没有像我需要的那样对治疗进行排序,所以我添加了以下脚本来实现这一点: df$Treatment
    【解决方案2】:

    一种选择是在data.frame 中添加一个新列并手动指定级别的顺序,而不是乱用interaction

    library(ggplot2)
    ##
    df$Group <- factor(
      paste0(df$Day," : ",df$Treatment),
      paste0(rep(1:2,3)," : ",
             rep(c("Before","During","After"),each=2)))
    ##
    R> ggplot(
        df, 
        aes(x=Group, 
            y=Behavior, 
            fill=factor(Day)))+
        geom_bar(stat='identity')+
        scale_x_discrete(
          labels=paste0("Day ",levels(df$Group)))
    

    【讨论】:

    • 对于初学者来说,您的回答似乎已经对我需要的东西进行了分类,所以谢谢。但是,我不相信这是最好的方法,因为它会创建一个非常混乱的 x 轴(尽管我不是专家,所以如果这实际上是最好的方法,我深表歉意)。如果您能帮助跟进,我将不胜感激。如何用“之前”、“期间”和“之后”标记两个条形的组?我会考虑使用 scale_x_discrete,但如果不更改您的答案,我无法完全弄清楚?
    猜你喜欢
    • 2011-08-23
    • 2013-02-12
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2022-08-23
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多