使用带有零区的y-log-scale的ggplot geo_geom_histogram()

时间:2017-01-25 11:05:24

标签: r ggplot2 histogram logarithm

我有一个> 10000整数的集合,达到1到500之间的值。 我想以直方图的形式绘制值,但是,因为只有几个整数达到大于200的值,所以我想对y轴使用对数刻度。

当一个bin的计数为零时出现问题,因为对数值变为-infinity。

为了避免这种情况,我想为每个bin添加一个1的伪数。 在标准的hist() - plot中,我可以这样做:

hist.data = hist(data, plot=F, breaks=30)
hist.data$counts = log10(hist.data$counts + 1)
plot(hist.data, ...)

但是,我很难找到一种方法来访问ggplot中的计数。

有没有一种简单的方法可以做到这一点,还是有其他推荐的方法来处理这个问题?

1 个答案:

答案 0 :(得分:3)

实现这一目标的一种方法是为y比例编写自己的转换函数。 ggplot2使用的转换函数(例如,当使用scale_y_log10()时)在scales包中定义。

简短回答

library(ggplot2)
library(scales)

mylog10_trans <- function (base = 10) 
{
  trans <- function(x) log(x + 1, base)
  inv <- function(x) base^x
  trans_new(paste0("log-", format(base)), trans, inv, log_breaks(base = base), 
            domain = c(1e-100, Inf))
}

ggplot(df, aes(x=x)) + 
  geom_histogram() + 
  scale_y_continuous(trans = "mylog10")

输出

enter image description here

用于此图的数据:

df <- data.frame(x=sample(1:100, 10000, replace = TRUE))
df$x[sample(1:10000, 50)] <- sample(101:500, 50)

解释反式函数

让我们来看看scales::log10_trans;它叫scales::log_trans();现在,scales::log_trans打印为:

function (base = exp(1)) 
{
    trans <- function(x) log(x, base)
    inv <- function(x) base^x
    trans_new(paste0("log-", format(base)), trans, inv, log_breaks(base = base), 
        domain = c(1e-100, Inf))
}
<environment: namespace:scales>

在上面的答案中,我取代了:

trans <- function(x) log(x, base)

使用:

trans <- function(x) log(x + 1, base)