【问题标题】:ggplot displaying expression in x axisggplot 在 x 轴上显示表达式
【发布时间】:2016-10-12 00:01:03
【问题描述】:

下面,我有绘制分组条形图的 R 代码。

group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')

mydata2 <- data.frame(mygroup = group_name, 
                      mysubgroup = factor(c("Yes", "No"), 
                                          levels = c("Yes", "No")), 
                      value = c(60,40,90,10,55,45,88,12))


ggplot(mydata2, aes(mygroup, value, fill = mysubgroup)) + 
  geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
  coord_flip() 

目前,情节如下所示。但是,我想在 x 轴上显示表达式,如下图所示。

我试过这个:

group_name = c(expression(A[1*x]),expression(A[1*x]),
               expression(A[2*x]),expression(A[2*x]),
               expression(A[3*x]),expression(A[3*x]),
               expression(A[4*x]),expression(A[4*x]))

但它给出了以下错误:

Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ""expression"" to a data.frame

如何解决?

【问题讨论】:

    标签: r ggplot2 expression bar-chart


    【解决方案1】:

    @baptiste 使用函数的建议很棒,尽管他的代码可能不完整,无法给出预期的结果。也可以直接使用scale_x_discrete(labels = parse(text=levels(mydata2$mygroup)))中的函数parse

    修改代码以生成情节:

    group_name = sprintf("A[%i*x]", rep(1:4,each=2))
    
    # alternatively, use gsub with your original vector
    # group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')
    # gsub("A_([0-9])x","A[\\1*x]", group_name)
    
    mydata2 <- data.frame(mygroup = group_name, 
                      mysubgroup = factor(c("Yes", "No"), 
                                          levels = c("Yes", "No")), 
                      value = c(60,40,90,10,55,45,88,12))
    
    ggplot(mydata2, aes(mygroup, value, fill = mysubgroup)) + 
      geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
      coord_flip() + 
      scale_x_discrete(labels = parse(text=levels(mydata2$mygroup)))
    

    【讨论】:

      【解决方案2】:

      这是一个工作示例 - 我将 group_name 更改为 4 个元素而不是 8 个元素,并手动将它们添加到 ggplot 表达式中。问题是表达式类型不能是data.frame 的列名。这避开了这个问题。

      library(ggplot2)
      group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')
      mydata2 <- data.frame(mygroup = group_name, 
                            mysubgroup = factor(c("Yes", "No"), 
                                                levels = c("Yes", "No")), 
                            value = c(60,40,90,10,55,45,88,12))
      
      group_name = c(expression(A[1*x]),
                     expression(A[2*x]),
                     expression(A[3*x]),
                     expression(A[4*x]))
      
      ggplot(mydata2, aes(mygroup, value, fill = mysubgroup)) + 
        geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
        coord_flip() +
        scale_x_discrete(labels=group_name)  # Adding the labels here 
      

      【讨论】:

      • 在我看来,一个人应该能够创建一个表达式向量,而不是必须明确地输入每个表达式。这是我能想到的最好的方法,但也许有更优雅的方法:scale_x_discrete(labels=sapply(paste0("A[", 1:4, "*x]"), function(i) parse(text=i)))
      【解决方案3】:

      labels可以是一个函数,

      group_name = sprintf("A[%i*x]", rep(1:4,each=2))
      
      # alternatively, use gsub with your original vector
      # group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')
      # gsub("A_([0-9])x","A[\\1*x]", group_name)
      
      mydata2 <- data.frame(mygroup = group_name, 
                            mysubgroup = factor(c("Yes", "No"), 
                                                levels = c("Yes", "No")), 
                            value = c(60,40,90,10,55,45,88,12))
      
      
      ggplot(mydata2, aes(mygroup, value, fill = mysubgroup)) + 
        geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
        coord_flip() + scale_x_discrete(labels = function(l) parse(text=l))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2016-06-11
        • 1970-01-01
        相关资源
        最近更新 更多