如何在使用scale_y_log10时抑制geom_histogram中的零值

11

我正在尝试使用ggplot、geom_histogram和scale_y_log10绘制一个在对数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)

倒序颜色方案示例,显示数字1以下

1个回答

9

您可以在geom_histogram调用中添加drop=TRUE,以删除计数为零的箱子(有关详细信息,请参见?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的条形图。如此答案所述,你可以选择从不同的水平开始,但这可能会误导。无论如何,以下是此代码:

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)

非常感谢您的快速回复。我希望有一个像那样简单的解决方案,但不幸的是它不能正常工作。虽然黑色区域消失了(其中为零),但应该出现1的地方却没有。所有低于1的内容都被删除了。 - Joseph Kreke
2
目前,geom_histogram 显示:“drop 已弃用,请改用 pad。” 但是 pad=TRUE 并不会做同样的事情。 - Ruud
1
@Ruud 我也有同样的问题,即ggplot2告诉我“请使用pad而不是drop”,但它并没有像drop一样起作用。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接