将列名用作ggplot的x

时间:2018-06-02 20:56:31

标签: r ggplot2

我的数据集如下所示,其中有一个ID列为1或2,然后还有其他几个列标记了多个测量值。

ID      1        2     3    ...
1       0.3002   0.05  0.4
2       0.12     0.5   0.32
1       0.05     0.12  0.2
1       0.74     0.12  0.32

我正在尝试使用ggplot创建一个boxplot,其中x是非ID列名称,y是表中的度量,fill是ID。这是我当前的代码尝试,但这给了我一个错误,“美学必须是长度1或与数据相同”:

ggplot(df, aes(x=colnames(df), y=df[,-1], fill=ID)) + geom_boxplot()

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用tidyverse方法。 我在这个例子中使用iris数据集。 您可以使用geom_jitter()

按ID(ID)填充/颜色框图
require(tidyverse)

iris %>% 
  #Select only numeric variables 
  select_if(is.numeric) %>% 
  #to create index
  rownames_to_column("ID") %>% 
  mutate(ID = as.numeric(ID)) %>%
  #Making it tidy
  gather(vars, value, -ID) %>% 
  ggplot(aes(vars, value, color = ID, fill = ID)) + 
  geom_boxplot() +
  geom_jitter()

enter image description here

答案 1 :(得分:1)

您的数据:

df <- read.table(text = 
  "ID 1      2    3
  1  0.3002 0.05 0.4
  2  0.12   0.5  0.32
  1  0.05   0.12 0.2
  1  0.74   0.12 0.32", header = T)

如果我的理解是正确的,你想要做的是为列中的每个值绘制一个箱形图。

首先,您需要使用tidyr&#39; s gather将数据转换为长格式:

library(tidyr)
long_df <- df %>% gather(Key, Value, -ID)
#   ID Key  Value
#1   1   1 0.3002
#2   2   1 0.1200
#3   1   1 0.0500
#4   1   1 0.7400
#5   1   2 0.0500
#6   2   2 0.5000
#7   1   2 0.1200
# ...

然后你可以简单地绘图:

ggplot(long_df, aes(x = Key, y = Value)) + 
  geom_boxplot()

导致以下图表:

{{3}}

答案 2 :(得分:1)

其他答案中缺少的是您想要根据ID设置填充。你的样本没有包含足够的数据来真正显示不同的颜色 - 对于ID = 2只有一组观察 - 所以我只是创建了一些具有类似结构的随机数据来说明。

library(tidyverse)

set.seed(123)
df <- tibble(
  ID = rep(c(1, 2), 20),
  `1` = rnorm(40),
  `2` = rnorm(40, sd = 0.5),
  `3` = rnorm(40, sd = 1.2)
)

首先你需要这个长形格式,所以你有一个专栏(我称之为&#34;键&#34;,但你可以在gather中给它一个更具描述性的名称)可以映射到你的x美学。

df_long <- df %>%
  gather(key = key, value = value, -ID)

这种长形数据的格式如下:

head(df_long)
#> # A tibble: 6 x 3
#>      ID key     value
#>   <dbl> <chr>   <dbl>
#> 1     1 1     -0.560 
#> 2     2 1     -0.230 
#> 3     1 1      1.56  
#> 4     2 1      0.0705
#> 5     1 1      0.129 
#> 6     2 1      1.72

然后为每个ID填充箱图,使ID成为一个因素。您可以在数据集中执行此操作,或者您可以像我在此处一样,在aes内执行此操作。

ggplot(df_long, aes(x = key, y = value, fill = as.factor(ID))) +
  geom_boxplot()

reprex package(v0.2.0)创建于2018-06-03。