R 如何利用对数标度和离散值改进ggplot直方图

R 如何利用对数标度和离散值改进ggplot直方图,r,ggplot2,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() 这可能更糟 因为现在它给人的印象是“1”和“2”之间缺少了一些东西,而且也不完全清楚哪个条的值为“1”(条在勾号的右侧),哪个条

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

请考虑以下MWE

set.seed(99)
data <- data.frame(dist = as.integer(rlnorm(1000, sdlog = 2)))
class(data$dist)
ggplot(data, aes(x=dist)) + geom_histogram()
这可能更糟

因为现在它给人的印象是“1”和“2”之间缺少了一些东西,而且也不完全清楚哪个条的值为“1”(条在勾号的右侧),哪个条的值为“2”(条在勾号的左侧)

我知道ggplot从技术上为对数刻度提供了“正确”的视觉答案。然而,作为观察者,我在理解它时有一些问题

有可能改进一些东西吗

编辑:

这就是我将Jaap解决方案应用于真实数据时发生的情况


x=0和x=1之间以及x=1和x=2之间的倾角从何而来?我的值是离散的,但为什么绘图也映射x=1.5和x=2.5?

首先想到的是使用
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\u x\u log10
时,会收到一条警告消息(
删除了524行包含非有限值(统计密度)
)。这可以通过使用对数加上一个转换来解决

以下代码:

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()
将给出以下结果:
解决方案可以是将数据转换为因子:

library(ggplot2)
set.seed(99)
data <- data.frame(dist = as.integer(rlnorm(1000, sdlog = 2)))
ggplot(data, aes(x=factor(dist))) + 
    geom_histogram(stat = "count") + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1))
库(ggplot2)
种子集(99)

数据我想知道,如果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()

我也有同样的问题,受@Jaar答案的启发,我用对数刻度中的x轴来调整直方图的宽度

如果使用binwidth=0.201,则钢筋将按预期并置。但是,这意味着在两个x坐标之间最多只能有五个条

set.seed(99)
data <- data.frame(dist = as.integer(rlnorm(1000, sdlog = 2)))
class(data$dist)
ggplot(data, aes(x=dist)) + 
   geom_histogram(binwidth = 0.201, color = 'red') + 
   scale_x_log10()
set.seed(99)

数据这可能是微不足道的,但是,尝试减少垃圾箱的数量???@koundy,在我看来,这并没有真正的帮助。请看我答案中的例子。出于某种奇怪的原因,在我的真实数据上使用你的解决方案,我有一个介于x=0和x=1之间,以及介于x=1和x=2之间的倾角。为什么?在0和1之间没有可映射的值,因为在MWE中,我的值是离散的。(图片补充)由于您提供的样本数据也是离散的,这可能不是问题所在。看看你的图,它可能与你的y轴的定义有关。蜱虫在y轴的底部杂乱无章,这很奇怪。你能分享你使用的确切代码和数据的
dput
(或足够大的数据样本)吗?没有这一点,很难说出这种行为的确切原因。log1p,nice,不知道!您不需要预先这样做,还可以将其转换为
ggplot
函数中的一个因子变量:
ggplot(数据,aes(x=因子(dist))+geom_直方图()
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..)))
set.seed(99)
data <- data.frame(dist = as.integer(rlnorm(1000, sdlog = 2)))
class(data$dist)
ggplot(data, aes(x=dist)) + 
   geom_histogram(binwidth = 0.201, color = 'red') + 
   scale_x_log10()