如何在使用带有scale_y_log10的geom_histogram时抑制零

Jos*_*eke 10 r ggplot2

我正在尝试使用ggplot,geom_histogram和scale_y_log10绘制具有log y标度的直方图.大多数区域(计数大于1的区域)看起来是正确的:背景是透明的,直方图条用默认的黑色填充.但是在计数为1时,颜色会反转:黑色背景和直方图条的透明填充.此代码(如下)在图中生成示例.

任何人都可以解释这个原因吗?我理解日志规模带来的问题,但我似乎无法找到解决方案.我希望有一个简单的解决方案,或者我忽略了一些东西.

set.seed(1)
df <- data.frame(E=sample(runif(100), 20, TRUE))
ggplot(df,aes(E)) + geom_histogram(binwidth=0.1) + scale_y_log10(limits=c(0.1,100)) + xlim(0,1)
Run Code Online (Sandbox Code Playgroud)

计数为1的反色方案示例

sha*_*dow 8

您可以添加drop=TRUEgeom_histogram零计数的删除箱的调用(?stat_bin有关详细信息,请参阅参考资料):

set.seed(1)
df <- data.frame(E=sample(runif(100), 20, TRUE))
ggplot(df,aes(E)) + 
  geom_histogram(binwidth=0.1, drop=TRUE) + 
  scale_y_log10(limits=c(0.1,100)) + 
  xlim(0,1)
Run Code Online (Sandbox Code Playgroud)

编辑:由于比例从1开始,因此无法显示高度为1的条.如本答案所述,您可以选择从不同级别开始,但可能会产生误导.无论如何,这是代码:

require(scales)
mylog_trans <- 
function (base = exp(1), from = 0) 
{
  trans <- function(x) log(x, base) - from
  inv <- function(x) base^(x + from)
  trans_new("mylog", trans, inv, log_breaks(base = base), domain = c(base^from, Inf))
}

ggplot(df,aes(E)) + 
  geom_histogram(binwidth=0.1, drop=TRUE) + 
  scale_y_continuous(trans = mylog_trans(base=10, from=-1), limits=c(0.1,100)) +
  xlim(0,1)
Run Code Online (Sandbox Code Playgroud)

  • 目前,`geom_histogram` 说:“`drop` 已被弃用。请改用‘pad’。” 但是`pad=TRUE` 不做同样的事情。 (2认同)