如何在ggplot分面直方图中为每个分面设置binwidth为x变量极差/20?
解决每个分面直方图自定义binwidth的问题
你原来的代码问题出在binwidth用了整个数据集的value极差,而非每个分面对应变量的单独极差。要实现每个分面用对应变量的极差除以20作为binwidth,得先按变量分组计算好每个的binwidth,再分别绘图拼接,具体步骤如下:
- 加载所需工具包,转换数据格式并计算每个变量的binwidth:
library(tidyverse) library(patchwork) # 用于拼接多个子图 # 将iris转换为长格式 irislong <- pivot_longer(iris, cols = -Species) # 按变量分组,计算每个变量的极差除以20作为专属binwidth binwidth_df <- irislong %>% group_by(name) %>% summarise(binwidth = (max(value) - min(value)) / 20)
- 循环生成每个变量的直方图,再拼接成分面样式:
# 遍历每个变量,生成对应直方图 plot_list <- map(unique(irislong$name), function(var_name) { # 取出当前变量对应的binwidth current_bw <- binwidth_df$binwidth[binwidth_df$name == var_name] irislong %>% filter(name == var_name) %>% ggplot(aes(x = value)) + geom_histogram(binwidth = current_bw, colour = "black", fill = "white") + labs(x = var_name, y = "频数") + theme_bw() }) # 拼接成2行2列的分面布局 wrap_plots(plot_list, ncol = 2)
这样每个分面的直方图就会使用对应变量自身的极差除以20作为binwidth了。
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

