0

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

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”

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

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

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

4

2 回答 2

2

您必须将数据从宽格式转换为长格式,例如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)
于 2018-06-17T05:43:37.537 回答
1

我将您的数据整理成整洁的格式,然后使用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")
于 2018-06-17T05:33:59.697 回答