【问题标题】:Creating a grouped bar plot in R在 R 中创建分组条形图
【发布时间】:2014-01-08 01:16:00
【问题描述】:

我在 R 中有一个数据框 df,看起来像这样:

        D     C     B     E     K     R
Rd      80    80    80    80    80    80
Sw      100   100   100   100   100   100
Sf      100   100   100   100   100   100

我正在尝试在条形图中绘制数据。我需要 y 轴的范围为 0-100,x 轴为类别名称。基本上,我需要它看起来像这样:

100 |               _ _ _ _ _ _    _ _ _ _ _ _
    |_ _ _ _ _ _   | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
 0  |_|_|_|_|_|_|__|_|_|_|_|_|_|__|_|_|_|_|_|_|_
     D C B E K R    D C B E K R    D C B E K R
         Rd             Sw            Sf

所有 D 的颜色相同,所有 C 的颜色相同,依此类推。

我不确定如何执行此操作,或者使用哪些库。

到目前为止,我有:

counts <- as.matrix(df$D, df$C, df$B, df$E, df$K, df$R)

barplot(counts, beside = TRUE, space = c(0, 0, 0, 0, 0, 0), xlab = "",
col = c("coral", "coral1", "coral2", "coral3", "coral4", "cornflowerblue"),
    names.arg = c("D", "C", "B", "E", "K", "R"))
mtext(side = 1, text = "x label", line = 7)

但它只显示如下内容:

100 |  _ _   _ _
    |_| | |_| | |
    | | | | | | |
    | | | | | | |
    | | | | | | |
 0  |_|_|_|_|_|_|_
     D C B E K R
       x label

我不知道为什么我只得到这个。

任何帮助将不胜感激。

【问题讨论】:

    标签: r plot bar-chart


    【解决方案1】:

    试试这个:

    df2 <- t(as.matrix(df))
    bp <- barplot(df2,beside=TRUE,col=1:6)
    mtext(rownames(df2),1,at=bp)
    

    如果您想编辑内容以旋转轴标签或准确定位组/条形标签,那么您可以执行以下代码之类的操作。更改 line= 参数以影响标签的垂直位置,并更改 barplot 调用上的 las=1 参数以根据需要旋转标签。

    df2 <- t(as.matrix(df))
    bp <- barplot(df2,beside=TRUE,col=1:6,axisnames=FALSE,las=1)
    mtext(rownames(df2),1,at=bp,line=0.6)
    mtext(colnames(df2),1,at=colMeans(bp),line=2)
    

    【讨论】:

    • 这样操作:df2 &lt;- t(as.matrix(df)) bp &lt;- barplot(df2, beside = TRUE, col = 1:6, names.arg = c("D", "C", "B", "E", "K", "R", "D", "C", "B", "E", "K", "R", "D", "C", "B", "E", "K", "R")) mtext(rownames(df2), 1, at = bp) 我只能显示字母,不能显示 Rd、Sw 和 Sf。有没有办法显示这些?
    • @user3043867 - 你是什么意思?你可以清楚地看到我的例子有两组标签!
    • 还有没有办法在条形图中显示实际值?
    【解决方案2】:
    set.seed(1)
    df <- data.frame(groups = rep(c("Rd", "Sw", "Sf"), each=6),
                     bars = rep(c("D", "C", "B", "E", "K", "R"), 3),
                     values = sample(1:100,18))
    library(ggplot2)
    ggplot(df, aes(x=bars, y=values, fill=bars)) + 
      geom_bar(stat="identity", position="dodge") + 
      facet_wrap(~groups, ncol=3)
    

    结果:见下图。

    或者,如果您从问题中获取数据框:

    df <- read.table(sep=" ", header=T, text="
    D C B E K R
    Rd 80 80 80 80 80 80
    Sw 100 100 100 100 100 100
    Sf 100 100 100 100 100 100")
    
    df$facet <- row.names(df)
    library(reshape2)
    df.long <- melt(df, "facet")
    ggplot(df.long, aes(x=variable, y=value, fill=variable)) + 
      geom_bar(stat="identity", position="dodge") + 
      facet_wrap(~facet, ncol=3)
    

    【讨论】:

    • reshape2 是解决此类问题的方法。理想情况下,每个数据点都应该在数据框中有自己的行(长格式)。这是通过 reshape2 包中的 melt 命令实现的。
    【解决方案3】:

    您似乎不希望使用 data.frame 中的列向量进行 as.matrix 调用 - 您很可能需要:例如 as.matrix(D):

    barplot(as.matrix(data.frame(rpois(10, 2), rpois(10, 1))), beside = T)
    

    基本上,我举一个简单的例子,假设你有:

    df = data.frame(x = c(1,2,3), y = c(2,3,4))
    

    你在做 as.matrix(df$x, df$y) - 这不是你想要的,你想做的:as.matrix(df),因此:

    barplot(as.matrix(df), beside = T)
    

    会给你你想要的。关键是看“as.matrix”做了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2016-11-19
      相关资源
      最近更新 更多