对于示例数据框:
df <- structure(list(year = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L), letter_group = c("A", "A", "A", "B", "B", "B", "C",
"C", "C", "C", "A", "A", "A", "B", "B", "B", "C", "C", "C", "C",
"A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C",
"A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "C"), value = c(2L,
3L, 4L, 5L, 6L, 6L, 7L, 8L, 5L, 6L, 7L, 3L, 4L, 5L, 6L, 4L, 5L,
6L, 2L, 3L, 4L, 4L, 5L, 6L, 7L, 8L, 5L, 3L, 2L, 4L, 5L, 6L, 4L,
3L, 4L, 5L, 6L, 7L, 1L, 2L, 4L, 5L, 6L, 4L)), .Names = c("year",
"letter_group", "value"), row.names = c(NA, -44L), class = c("tbl_df",
"tbl", "data.frame"), spec = structure(list(cols = structure(list(
year = structure(list(), class = c("collector_integer", "collector"
)), letter_group = structure(list(), class = c("collector_character",
"collector")), value = structure(list(), class = c("collector_integer",
"collector"))), .Names = c("year", "letter_group", "value"
)), default = structure(list(), class = c("collector_guess",
"collector"))), .Names = c("cols", "default"), class = "col_spec"))
我正在尝试创建一个箱形图,其中包括x轴上的年份-以及按年份分组的“字母组” ...
即A,B,C表示第一年,然后是一个小空间,然后A,B C表示第二年,依此类推。……
我有以下内容:
library(ggplot2)
p1 <- ggplot(df, aes(year, value))
p1 + geom_boxplot(aes(group=letter_group))
但这仅产生3个箱形图。
有人可以帮我吗?
答案 0 :(得分:3)
@nouse解决方案(这是最佳解决方案)的替代方法是使用构面。但是,刻面的好处之一是,您还可以在x轴上获得字母组标签。
# Load library
library(ggplot2)
# Define data frame
df <- structure(list(year = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L), letter_group = c("A", "A", "A", "B", "B", "B", "C",
"C", "C", "C", "A", "A", "A", "B", "B", "B", "C", "C", "C", "C",
"A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C",
"A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "C"),
value = c(2L, 3L, 4L, 5L, 6L, 6L, 7L, 8L, 5L, 6L, 7L, 3L, 4L, 5L, 6L, 4L, 5L,
6L, 2L, 3L, 4L, 4L, 5L, 6L, 7L, 8L, 5L, 3L, 2L, 4L, 5L, 6L, 4L,
3L, 4L, 5L, 6L, 7L, 1L, 2L, 4L, 5L, 6L, 4L)),
.Names = c("year", "letter_group", "value"),
row.names = c(NA, -44L),
class = c("tbl_df","tbl", "data.frame"),
spec = structure(list(cols = structure(list( ear = structure(list(), class = c("collector_integer", "collector")),
letter_group = structure(list(), class = c("collector_character", "collector")),
value = structure(list(), class = c("collector_integer", "collector"))),
.Names = c("year", "letter_group", "value")),
default = structure(list(), class = c("collector_guess", "collector"))),
.Names = c("cols", "default"), class = "col_spec"))
# Plot results
g <- ggplot(df)
g <- g + geom_boxplot(aes(letter_group, value))
g <- g + facet_grid(. ~ year, switch = "x")
g <- g + theme(strip.placement = "outside",
strip.background = element_blank(),
panel.background = element_rect(fill = "white"),
panel.grid.major = element_line(colour = alpha("gray50", 0.25), linetype = "dashed"))
g <- g + ylab("Value") + xlab("Year & Letter Group")
print(g)
由reprex package(v0.2.1)于2019-05-23创建
答案 1 :(得分:1)
您的问题已得到基本解答here。
您的数据框不包含因子,因此您首先需要将分组变量转化为因子。然后,根据上面给出的链接,有两个选项。通过合并两个原始因子来构建新因子(如z-cool的答案所示)-但这不会在x轴上的因子水平之间创建所需的空间-否则您需要将其中一个因子分配给{ {1}}或fill
。就您而言,解决问题的最快方法是
col
如果不想给绘图着色,则可以根据之前在ggplot(df, aes(as.factor(year), value, fill=as.factor(letter_group))) + geom_boxplot()
中的选择,用scale_fill_manual
或scale_color_manual
进行更改:
aes
答案 2 :(得分:-1)
这应该有效
library(tidyverse)
df %>%
mutate(year_group = paste(year, letter_group)) %>%
ggplot(aes(year_group, value)) +
geom_boxplot()