我的数据集如下所示,其中有一个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()
任何帮助都将不胜感激。
答案 0 :(得分:1)
如果我理解正确,您可以使用tidyverse
方法。
我在这个例子中使用iris
数据集。
您可以使用geom_jitter()
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()
答案 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。