【问题标题】:ggplot geom_col: automatically defining y from data?ggplot geom_col:从数据中自动定义 y?
【发布时间】:2018-11-26 08:55:23
【问题描述】:

我有一个看起来像这样的数据框:

A           B           C
0,868385346 0,628248588 0,468926554
0,074626866 0,277966102 0,271186441
0,024423338 0,057627119 0,203389831
0,017639077 0,007909605 0,011299435
0,004070556 0,007909605 0,011299435
0,004070556 0,005649718 0,011299435
0,002713704 0,003389831 0,005649718
0,001356852 0,001129944 0,005649718
0,001356852 0,001129944 0,005649718
0,001356852 0,001129944 0,005649718
            0,001129944 
            0,001129944 
            0,001129944 
            0,001129944 
            0,001129944 
            0,001129944 
            0,001129944 

这些是A、B和C的组成比例(数字加1,最高的数字在顶部)

我想在 x 轴上制作一个带有 A、B、C 的条形图(或分面,但我稍后会看到),并且每个条形图显示实际数据(所以对于 A,十个条形图显示比例,第一个是 0.86,第二个是 0.07,以此类推),以便比较组合物中的不同分布。

ggplot 文档指出:“如果您希望条形的高度表示数据中的值,请改用 geom_col”,这正是我想要的。

我使用 na.omit 运行以下命令,因为不同的列有不同的行数

ggplot(na.omit(data)) + geom_col()

我收到以下错误: pmin(y, 0) 中的错误:找不到对象“y”

我看到我必须分配一个 y(在 geom_bar 文档中,因为 geom_col 似乎没有自己的文档)。我尝试了各种方法来获得从 0 到 1 的比例,例如 y=c(0:1),但似乎没有任何效果。

我仍然不明白如何分配 y 轴,而函数 geom_col 说它从数据中得出条形的高度...

我显然在这里遗漏了一些基本的东西,所以任何指针都将不胜感激。

【问题讨论】:

    标签: r ggplot2 yaxis geom-col


    【解决方案1】:

    您必须将数据从宽格式转换为长格式,例如我的示例中的dat2。您还需要创建一个ID 列。之后,您可以使用geom_col 绘制条形图。在下面的代码示例中,我还展示了如何在 y 轴上设置限制并使用facet_grid

    library(tidyverse)
    
    dat2 <- dat %>% 
      mutate(ID = 1:n()) %>%
      gather(Column, Value, -ID)
    
    ggplot(dat2, aes(x = ID, y = Value)) +
      geom_col() +
      scale_y_continuous(limits = c(0, 1)) +
      facet_grid(Column ~ .) +
      theme_bw()
    

    数据

    dat <- read.table(text = "A           B           C
    0.868385346 0.628248588 0.468926554
    0.074626866 0.277966102 0.271186441
    0.024423338 0.057627119 0.203389831
    0.017639077 0.007909605 0.011299435
    0.004070556 0.007909605 0.011299435
    0.004070556 0.005649718 0.011299435
    0.002713704 0.003389831 0.005649718
    0.001356852 0.001129944 0.005649718
    0.001356852 0.001129944 0.005649718
    0.001356852 0.001129944 0.005649718
    NA          0.001129944 NA 
    NA          0.001129944 NA
    NA          0.001129944 NA
    NA          0.001129944 NA
    NA          0.001129944 NA
    NA          0.001129944 NA
    NA          0.001129944 NA"
                      , header = TRUE)
    

    【讨论】:

      【解决方案2】:

      我把你的数据整理成整齐的格式,然后用geom_col()。我必须将y 轴转换为factor 变量,以便条形图显示值的实际标识。你也可以使用geom_bar(stat = "identity")

      # double check that these values are correct, I wrote this quickly
      A <- c(0.868385346
             ,0.07626866
             ,0.024423338
             ,0.017639077
             ,0.004070556
             ,0.004070556
             ,0.002713704
             ,0.001356852
             ,0.001356852
             ,0.001356852
             ,NA
             ,NA
             ,NA
             ,NA
             ,NA
             ,NA
             ,NA)
      
      
      B <- c(0.628248588
             ,0.277966102
             ,0.057627119
             ,0.007909605
             ,0.007909605
             ,0.005649718
             ,0.003389831
             ,0.001129944
             ,0.001129944
             ,0.001129944
             ,0.001129944
             ,0.001129944
             ,0.001129944
             ,0.001129944
             ,0.001129944
             ,0.001129944
             ,0.001129944)
      
      
      C <- c(0.468926554
             ,0.271186441
             ,0.203389831
             ,0.011299435
             ,0.011299435
             ,0.011299435
             ,0.005649718
             ,0.005649718
             ,0.005649718
             ,0.005649718
             ,NA
             ,NA
             ,NA
             ,NA
             ,NA
             ,NA
             ,NA)
      
      
      # combine all three vectors into a dataframe
      df_wide <- data.frame(A,B,C)
      
      # convert to tidy format
      df <- gather(df_wide, id, value) %>% na.omit()
      
      
      # create our plot
      ggplot(df, aes(x = as.factor(id), y = as.factor(value), fill = id)) + 
        geom_bar(position = "dodge", stat = "identity")
      

      【讨论】:

      • 你为什么把值变成因子?
      • 如果我们将此列保留为数字,geom_col() 将默认绘制每个组内的观察计数或它们的总和。将它们转换为因子变量告诉geom_col 以面值绘制它们。不过我更喜欢你的解决方案。
      • 这些数据似乎肯定有时间成分,因此为 x 轴创建顺序 ID 变量是一个聪明的想法。
      • 你得到了我的支持,但不知何故,我认为这不是 OP 想要的。
      • 我同意。你的图更直观,我学到了一些新东西!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多