我正在尝试使用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)

您可以添加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)
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)