如何使用对数标度和离散值改进ggplot直方图的方面

Cpt*_*emo 6 r ggplot2

我正在努力提高离散值直方图的清晰度和方面,我需要用对数标度来表示.

请考虑以下MWE

set.seed(99)
data <- data.frame(dist = as.integer(rlnorm(1000, sdlog = 2)))
class(data$dist)
ggplot(data, aes(x=dist)) + geom_histogram()
Run Code Online (Sandbox Code Playgroud)

哪个产生

在此输入图像描述

然后

ggplot(data, aes(x=dist)) + geom_line() + scale_x_log10(breaks=c(1,2,3,4,5,10,100))
Run Code Online (Sandbox Code Playgroud)

这可能更糟糕

在此输入图像描述

从现在开始,它给人的印象是"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()
Run Code Online (Sandbox Code Playgroud)

得到: 在此输入图像描述


在这种情况下,最好使用密度图.但是,当您使用时,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()
Run Code Online (Sandbox Code Playgroud)

会给出这个结果: 在此输入图像描述


Gau*_*hal 5

我想知道,如果缩放 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()
Run Code Online (Sandbox Code Playgroud)

基本图

此外,您可能希望将频率显示为数据标签,因为人们可能会忽略 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..)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述