`R`/`ggplot2`:组合单个“geom_histogram”图层时的异常

csbfibhn  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(111)

我正在努力使用R/ggplot2来复制this演示的各个方面。
对于第一个点(绘制不同的bin计数),我已经很好地管理了,但是当对第二个点(不同的最大值)复制这种方法时,它奇怪地失败了,我不知道为什么。
下面是我在上面的文章**2.**中指出的缺乏鲁棒性的原因:

library(dplyr)
library(ggplot2)
library(magrittr)
requireNamespace("kmed")

# Define the new maxima to be used
maxima <- c(197, 202, 213, 224)

# Replicate the UCI heart data set
m_df <- bind_rows(
  replicate(length(maxima), kmed::heart, simplify = FALSE)) %>%
  dplyr::mutate(
    sm  = rep(maxima, each = nrow(kmed::heart)),
    fsm = paste("Maximum Edited to:", rep(maxima, each = nrow(kmed::heart))))

# Modify the maxima
m_df[which(m_df$thalach == max(m_df$thalach)), "thalach"] <- maxima

# Generate individual geom_histogram layers, forcing identical number of bins
m_lp_hist <- plyr::llply(maxima, function(b) {
  geom_histogram(
    data    = m_df %>% filter(sm == b),
    mapping = aes(x = thalach),
    bins    = 20)
  })

# Combine the layers
m_p_hist <- Reduce("+", m_lp_hist, init = ggplot2::ggplot())
m_p_hist +
  ggplot2::facet_wrap(. ~ fsm, scales = "free_y") +
  ggplot2::theme_bw() +
  ggplot2::labs(x = "Maximum Heart Rate Achieved", y = "Count")

当评估结果图时,直方图非常相似(!),同时逐步通过使用ggplot() + m_p_list[[1]]等生成的各个层。很好地显示了层之间的差异,从而显示了我想要展示的效果(直方图缺乏鲁棒性)。这是怎么回事!?
谢谢你的指点

mzsu5hc0

mzsu5hc01#

你非常接近(我认为的)你想要的。试试这个:

m_p_hist +
  ggplot2::facet_wrap(. ~ fsm, scales = "free") + # instead of free_y
  ggplot2::theme_bw() +
  ggplot2::labs(x = "Maximum Heart Rate Achieved", y = "Count")

说明

您的原始代码将所有4个直方图层添加到单个ggplot对象中,然后再次将它们划分到4个单独的绘图面板中,**不允许x轴比例在各个方面变化。**因此,x轴范围/限制是根据所有4个层的组合数据计算的,每个直方图的20个箱是根据相同的范围计算的。
通过将scales = "free_y"更改为scales = "free",我们允许x轴尺度变化,并且每个直方图的20个bin是从不同的值范围计算的。
顺便说一句,我不太清楚为什么要通过facet_wrap创建它。我会做4个单独的ggplot对象,然后将它们拼接成一个单独的图表,以便于演示,这将避免上述问题。例如:

lapply(m_lp_hist, 
       function(p) ggplot() + 
         p + 
         labs(title = p$data$fsm[[1]]) +
         theme_bw()) %>%
  cowplot::plot_grid(plotlist = ., nrow = 2, ncol = 2)

相关问题