使用相对频率添加透明直方图轮廓

问题描述 投票:0回答:1

ggplot2
中,我尝试比较两个分布,一个使用填充直方图,另一个使用直方图的轮廓。目标是在此处显示相对频率直方图,而不是计数(因此为什么使用
density * width
表示 y)。

问题是,当我使用两个直方图时,垂直条仍然出现,这会分散注意力并使数据难以阅读。我当然可以使用重叠的透明直方图,但我更喜欢这里的轮廓方法。我尝试过其他方法:

  • geom_histogram
    产生内部线条
  • geom_freqpoly
    产生锯齿状线条,而不是扁条(首选)或平滑的密度
  • stat_bin
    /
    geom_step
    产生“浮动端点”而不是连接到 0。它也不与末端的 x = 0 或 x = 1 对齐。
  • geom_density
    过于光滑,无法有效看到形状。它也不与末端的 x = 0 或 x = 1 对齐。 (我也不确定如何使密度接近其他方法发现的%,而且我可能做错了

如果我能够获得这些方法中的任何一种来创建所需的结果,我会欣喜若狂!

示例代表:

set.seed(22)
library(ggplot2)
library(ggpubr)

# Create Fake Data
flavor <- data.frame(
  flavor = sample.int(n = 100, size = 500, replace = TRUE) / 100
)

flavor2 <- 
  data.frame(
  flavor = (sample.int(n = 100, size = 500, replace = TRUE) / 100) ^ 2
  )

我尝试绘制我能找到的所有方法,但无法产生类似

geom_histogram
的结果,但内部没有条形图。

生成此内容的代码如下:

p1 <- 
  ggplot() + 
  geom_histogram(data = flavor, 
                 mapping = aes(x = flavor,
                               y = after_stat(density * width)),
                 bins = 34,
                 alpha = 0.5)
  
ggarrange(plotlist = list(
  'A' = p1 + 
    geom_histogram(data = flavor2,
                   mapping = aes(x = flavor,
                                 y = after_stat(density * width)),
                   fill = NA, 
                   color = 'black',
                   bins = 34),
  'B' = p1 + 
    geom_freqpoly(data = flavor2,
                  mapping = aes(x = flavor,
                                y = after_stat(density * width)),
                  bins = 34),
  'C' = p1 + 
    stat_bin(data = flavor2, 
             mapping = aes(x = flavor,
                           y = after_stat(density * width)),
             geom = 'step',
             bins = 34,
             color = 'black'),
  'D' = p1 + 
    geom_density(data = flavor2,
                 mapping = aes(x = flavor,
                               y = after_stat(density / 34)), # Maybe wrong! 
                 fill = NA, 
                 outline.type = 'full',
                 color = 'black')), 
  labels = c('geom_histogram', 'geom_freqpoly', 'stat_bin w/ geom = "step"', 'geom_density'))
r ggplot2 histogram
1个回答
0
投票

由于

p1
已经包含了您想要的中断,您可以借用它们来构造
flavor2
的直方图对象,然后您可以使用它来计算和绘制
geom_area
:

p1 <- ggplot(flavor, aes(flavor)) + geom_histogram() 

h <- hist(flavor2$flavor, 
          breaks = unique(round(unlist(ggplot_build(p1)$data[[1]][4:5]), 3)), 
          plot = FALSE)

p1 + geom_area(data = data.frame(flavor = rep(h$breaks, each = 2),
                                 y = c(0, rep(h$counts, each = 2), 0)), 
               aes(y = y), color = "black", fill = "transparent")

© www.soinside.com 2019 - 2024. All rights reserved.