Как подавить нули при использовании geom_histogram с помощью scale_y_log10

Я пытаюсь построить гистограмму с масштабом log y, используя ggplot, geom_histogram и scale_y_log10. Большинство регионов (с числом больше 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

Вы можете добавить 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)

EDIT: Поскольку масштаб начинается с 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)