我有一个包含多个数据列表的嵌套列表。我可以在每个数据源上绘制自己的图形,但是我试图在单个图形中从每个数据源的顶部获得一条平滑线。这是使用mtcars数据集的代码示例。
library(dplyr)
library(tidyr)
library(purrr)
library(ggplot2)
by_cyl <- mtcars %>%
group_by(cyl, gear) %>%
nest() %>%
rename(cyl_data = data)
by_gear <- mtcars %>%
group_by(gear) %>%
nest() %>%
rename(gear_data = data
mtcars_nest <- left_join(by_cyl, by_gear, by = "gear")
mtcars_nest <- mtcars_nest %>%
mutate(
map(cyl_data, ~ ggplot(., aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(se = TRUE, color = 'blue')
)
) %>%
rename(plot_cyl = `map(...)`)
mtcars_nest <- mtcars_nest %>%
mutate(
map(gear_data, ~ ggplot(., aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(se = TRUE, color = 'red')
)
) %>%
rename(plot_gear = `map(...)`)
mtcars_nest$plot_cyl[1]
mtcars_nest$plot_gear[1]
#How to get these two plots on one figure?
是否有关于如何在单个图形上获取mtcars $ plot_cyl和mtcars $ plot_gear的想法?我真正需要的是在mtcars_nest标题中添加另一个gg列表,以便最终得到mtcars_nest中的cyl,gear,cyl_data,gear_data,plot_cyl,plot_gear和plot_cyl_gear这样的结构。
> mtcars_nest
# A tibble: 8 x 6
cyl gear cyl_data gear_data plot_cyl plot_gear
<dbl> <dbl> <list> <list> <list> <list>
1 6 4 <tibble [4 × 9]> <tibble [12 × 10]> <S3: gg> <S3: gg>
2 4 4 <tibble [8 × 9]> <tibble [12 × 10]> <S3: gg> <S3: gg>
3 6 3 <tibble [2 × 9]> <tibble [15 × 10]> <S3: gg> <S3: gg>
4 8 3 <tibble [12 × 9]> <tibble [15 × 10]> <S3: gg> <S3: gg>
5 4 3 <tibble [1 × 9]> <tibble [15 × 10]> <S3: gg> <S3: gg>
6 4 5 <tibble [2 × 9]> <tibble [5 × 10]> <S3: gg> <S3: gg>
7 8 5 <tibble [2 × 9]> <tibble [5 × 10]> <S3: gg> <S3: gg>
8 6 5 <tibble [1 × 9]> <tibble [5 × 10]> <S3: gg> <S3: gg>
我尝试添加:
mtcars_nest <- mtcars_nest %>%
mutate(
map(cyl_data, ~ ggplot(., aes(x = wt, y = mpg)) +
# geom_point() +
geom_smooth(se = TRUE, color = 'blue'),
gear_data, ~ ggplot(., aes(x = wt, y = mpg)) +
# geom_point() +
geom_smooth(se = TRUE, color = 'red')
)
) %>%
rename(plot_cyl_gear = `map(...)`)
但是,似乎只以蓝色绘制了cyl_data(映射函数中的第一个数据源。
答案 0 :(得分:1)
使用map2()
可以同时遍历两个不同的数据集。此功能仍在mutate()
中使用。 (实际上,如果需要,您可以在一次mutate()
调用中进行全部三组绘图,因为您可以随时命名新列。)
使用公式接口在.x
内创建图时,第一个数据集为map2()
,第二个数据集为.y
。在这种情况下,我在全局ggplot()
中定义了一个数据集,并在第二个geom_smooth()
调用中定义了另一个数据集,以在同一图上绘制来自不同数据集的两个独立的平滑。
mtcars_nest = mtcars_nest %>%
mutate(
plot_cyl_gear = map2(cyl_data, gear_data,
~ ggplot(.x, aes(x = wt, y = mpg)) +
geom_smooth(se = TRUE, color = 'blue') +
geom_smooth(data = .y, se = TRUE, color = 'red')
) )
mtcars_nest$plot_cyl_gear[1]