【问题标题】:Plot two barplot in R在 R 中绘制两个条形图
【发布时间】:2021-09-18 06:55:43
【问题描述】:
 data <- as.matrix(data.frame("A" = c(18,7),
                                "B+" = c(3,2),
                                "B" = c(3,3),
                                "C+" = c(6,0),
                                "C" = c(7,0),
                                "D" = c(0,4),
                                "E" = c(5,23)))
    
    
    barplot (data,
            col = c("red","blue"),
            beside = TRUE,
            xlab = "Grade",
            ylab = "Frequency")
    
    
    legend("topleft",
           c("IFC6503-A","IFC6510"),
           fill = c("red","blue"),
           inset = c(.01,0)
    )

我将两个条形图一起绘制,条形图包含等级,来自两个不同的数据,等级是 A B+ B C+ C D E ,但结果 B+ 和 C+ 没有出现,只出现 B. 和 C. ,是我的代码是错误的,或者你们能纠正我的代码吗?

【问题讨论】:

    标签: r bar-chart


    【解决方案1】:

    不要在列名中使用特殊字符 +,正如 Bernhard 已经指出的那样: 这是一种您可以手动重新标记绘图的 x 轴的方法:

    1. 在您的矩阵中提供足够的列名:请参阅此处 whuber 的评论:https://stats.stackexchange.com/questions/163280/naming-convention-for-column-names

    2. 在 barplot 中使用 xaxt = "n" 删除 x 个标签

    3. 使用axis手动插入x个标签:

    data <- as.matrix(data.frame("A" = c(18,7),
                                 "Bplus" = c(3,2),
                                 "B" = c(3,3),
                                 "Cplus" = c(6,0),
                                 "C" = c(7,0),
                                 "D" = c(0,4),
                                 "E" = c(5,23)))
    
    
    barplot (data,
             col = c("red","blue"),
             beside = TRUE,
             xlab = "Grade",
             ylab = "Frequency",
             xaxt = "n")
             
    axis(1, at = seq(2, 20, 3), labels = c("A", "B+", "B", "C+", "C", "D", "E"))
    
    
    legend("topleft",
           c("IFC6503-A","IFC6510"),
           fill = c("red","blue"),
           inset = c(.01,0)
    )
    

    【讨论】:

    • labels=gsub('plus', '+', colnames(data)) 以避免拼写错误。
    【解决方案2】:

    data 中的列名没有B+C+

    您可以在加载文件后像这样重命名列:

    colnames(data)[2] <-'B+'
    colnames(data)[4] <-'C+'
    

    现在用相同的代码绘图

    barplot (data,
             col = c("red","blue"),
             beside = TRUE,
             xlab = "Grade",
             ylab = "Frequency")
    
    
    legend("topleft",
           c("IFC6503-A","IFC6510"),
           fill = c("red","blue"),
           inset = c(.01,0)
    )
    
    

    【讨论】:

    • +1 很好的绘图解决方案,但总体而言,使用带有 + 或空格或 ... 的列名不是一个好主意。
    【解决方案3】:

    tidyverse 方法

    library(tidyverse)
    
    data %>% 
      pivot_longer(cols = everything()) %>% 
      group_by(name) %>% 
      mutate(
        name = str_replace(name,"\\.","+"),
        grp = row_number(),
        grp = if_else(grp == 1,"IFC6503-A","IFC6510")
        ) %>% 
      ggplot(aes(x = name, y = value,fill = grp))+
      geom_col(position = position_dodge())+
      scale_fill_manual(values = c("IFC6503-A" = "red","IFC6510" = "blue"))+
      labs(
        x = "Grade",
        y = "Frequency"
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多