我正在努力提高离散值直方图的清晰度和方面,我需要用对数标度来表示.
请考虑以下MWE
set.seed(99)
data <- data.frame(dist = as.integer(rlnorm(1000, sdlog = 2)))
class(data$dist)
ggplot(data, aes(x=dist)) + geom_histogram()
哪个产生

然后
ggplot(data, aes(x=dist)) + geom_line() + scale_x_log10(breaks=c(1,2,3,4,5,10,100))
这可能更糟糕

从现在开始,它给人的印象是"1"和"2"之间缺少某些东西,而且还不完全清楚哪个条的值为"1"(条形图位于刻度线的右侧),哪个条形图的值为"2" "(栏位于刻度线的左侧).
据我所知,技术上ggplot为对数刻度提供了"正确"的视觉答案.然而作为观察者,我在理解它时遇到了一些问题.
有可能改善一些东西吗?
编辑:
当我将Jaap解决方案应用于我的真实数据时会发生这种情况

x = 0和x = 1之间以及x = 1和x = 2之间的下降来自何处?我的值是离散的,但那么为什么绘图也映射x = 1.5和x = 2.5?
Jaa*_*aap 10
想到的第一件事就是玩弄binwidth.但这也没有给出一个很好的解决方案:
ggplot(data, aes(x=dist)) +
  geom_histogram(binwidth=10) +
  scale_x_continuous(expand=c(0,0)) +
  scale_y_continuous(expand=c(0.015,0)) +
  theme_bw()
得到:

在这种情况下,最好使用密度图.但是,当您使用时,scale_x_log10您将收到一条警告消息(Removed 524 rows containing non-finite values (stat_density)).这可以通过使用日志加一个转换来解决.
以下代码:
library(ggplot2)
library(scales)
ggplot(data, aes(x=dist)) +
  stat_density(aes(y=..count..), color="black", fill="blue", alpha=0.3) +
  scale_x_continuous(breaks=c(0,1,2,3,4,5,10,30,100,300,1000), trans="log1p", expand=c(0,0)) +
  scale_y_continuous(breaks=c(0,125,250,375,500,625,750), expand=c(0,0)) +
  theme_bw()
会给出这个结果:

我想知道,如果缩放 y 轴而不是 x 轴怎么办?当值为 0 时,它会导致很少的警告,但可能会达到您的目的。
set.seed(99)
data <- data.frame(dist = as.integer(rlnorm(1000, sdlog = 2)))
class(data$dist)
ggplot(data, aes(x=dist)) + geom_histogram() + scale_y_log10()
此外,您可能希望将频率显示为数据标签,因为人们可能会忽略 y 尺度,并且需要一些时间才能意识到 y 尺度是对数的。
ggplot(data, aes(x=dist)) + geom_histogram(fill = 'skyblue', color = 'grey30') + scale_y_log10() +
  stat_bin(geom="text", size=3.5, aes(label=..count.., y=0.8*(..count..)))