在
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'))
由于
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")