我有一个> 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中的计数。
有没有一种简单的方法可以做到这一点,还是有其他推荐的方法来处理这个问题?
答案 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")
输出
用于此图的数据:
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)