直方图的 x 轴上不需要的空间

Posted

技术标签:

【中文标题】直方图的 x 轴上不需要的空间【英文标题】:unwanted spaces in x-axis of a histogram plot 【发布时间】:2022-01-09 23:02:18 【问题描述】:

我想用一系列整数数据创建一个直方图。因此,由于 x 轴的范围很大,我决定对 x 轴使用对数刻度。但是图中的“1”、“2”和“3”数字之间有一个空格。谁能帮我解释原因并告诉我如何删除这些空格?

这是我的代码:

H1 <- as.data.frame(floor(runif(10000, min = 1, max = 100)))
colnames(H1) <- "H"
breaks <- c(1,2,3,4,5,6,7,8,9,10,100,500,1000,max((H1$H)))

ggplot (H1, aes(H)) + 
  geom_histogram(colour="darkgreen", size=1, fill="green", binwidth = 0.1) + 
  stat_bin(geom="text", aes(label=..count..) , hjust=-0.4, vjust = 0.4, binwidth = 0.1 , angle = 90, size = 2.5) + 
  scale_x_log10('Integer Data', breaks = breaks, labels = breaks, expand = expansion(mult = c(0, 0.01))) +
  scale_y_continuous('Count', expand = expansion(mult = c(0, 0.1))) +
  theme(axis.text.x = element_text(size = 8, angle = 60, vjust = 0.8, hjust=1))

这是输出:

【问题讨论】:

如果您希望 1 和 2 之间的空间不大于 2 和 3 之间的空间,并且 2 和 3 之间的空间不大于 3 和 4 之间的空间,依此类推,也许您没有实际上想要一个对数刻度。这就是根据定义对数刻度的工作方式。您也不会拥有与所有这些整数对齐的 bin。 【参考方案1】:

当您对直方图使用对数刻度时,您必须确保每个 bin 中有 合理 数量的元素。 您已使用runif 生成数据,因此分布均匀。这意味着 1 到 10 之间的元素将远少于 10 到 100 之间的元素。 由于您已经修复了一定数量的 breaks 和一定数量的 binwidth,因此您将得到空垃圾箱。

您可以做的是更改binwidthbins 的数量。例如:

ggplot(H1, aes(H)) + 
  geom_histogram(colour="darkgreen", size=1, fill="green", bins = 10) + 
  stat_bin(geom="text", aes(label=..count..) , hjust=-0.4, vjust = 0.4, bins = 10 , angle = 90, size = 2.5) + 
  scale_x_log10('Integer Data', expand = expansion(mult = c(0, 0.01))) +
  scale_y_continuous('Count', expand = expansion(mult = c(0, 0.1))) +
  theme(axis.text.x = element_text(size = 8, angle = 60, vjust = 0.8, hjust=1))

我删除了 breakslabels,因为 bin 的中心不再落在整数上。

【讨论】:

以上是关于直方图的 x 轴上不需要的空间的主要内容,如果未能解决你的问题,请参考以下文章

Histogram LightOJ - 1083

在 R 中的 x 轴上显示次要对数刻度

使用元组元素从列表中生成频率直方图

如何在 Python 中向直方图添加特定的 x 刻度线? [复制]

在绘图直方图 x 轴中格式化刻度

不同 bin 分组的直方图