我尝试使用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)
答案 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)