使用geom_histogram和scale_y_log10时如何抑制零

时间:2014-04-15 12:30:30

标签: 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)

Example of reversed color scheme below the count of 1

1 个答案:

答案 0 :(得分:8)

您可以将drop=TRUE添加到geom_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)

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

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)
相关问题