如何在map函数中为ggtitle添加split生成的列表名称
问题解决方法
你当前代码的问题在于:
- 使用
map遍历split后的列表时,只拿到了子数据框q,names(q)取的是子数据框的列名,而非split后每个子列表的名称(也就是cyl的分组值:4、6、8)。 - 另外
sprintf的写法有误,缺少占位符%s来插入分组名称。
需要修改两个关键部分:
1. 替换遍历函数为imap
purrr包的imap函数可以同时获取列表的元素和对应的名称,比map更适合这种带名称列表的遍历场景。
2. 修正ggtitle的sprintf逻辑
用imap传递过来的列表名称作为标题的变量部分,同时给sprintf添加占位符。
修改后的完整代码
plot_list2 = split(mtcars, mtcars$cyl) %>% imap(function(data, cyl_group) { ggplot(data, aes(x= mpg)) + geom_histogram(aes(y=..density..), color="darkblue", fill="lightblue")+ geom_density(alpha=.2, fill="#FF6666") + theme_classic()+ ggtitle(sprintf('Distribution for %s cylinders', cyl_group)) })
关键细节说明
imap的回调函数里,第一个参数data是split后的每个子数据框,第二个参数cyl_group就是该子列表对应的名称(即cyl的分组值)。sprintf('Distribution for %s cylinders', cyl_group)中,%s会被cyl_group的实际值替换,生成类似Distribution for 4 cylinders的标题。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

