geom_bar
и scale_y_log10
(или любая логарифмическая шкала) плохо работают вместе и не дают ожидаемых результатов.
Первая фундаментальная проблема заключается в том, что столбцы переходят в 0, а в логарифмическом масштабе 0 преобразуется в отрицательную бесконечность (что трудно построить). Шпаргалка вокруг этого обычно начинается с 1, а не с 0 (так как $ \ log (1) = 0 $), не строит ничего, если было 0 отсчетов, и не беспокоится об искажении, потому что, если необходим масштаб журнала, вы, вероятно, не не заботиться о том, чтобы быть выключенным на 1 (не обязательно верно, но ...)
Я использую diamonds
пример, который показал @dbemarest.
Для этого в общем случае нужно преобразовать координату, а не масштаб (подробнее о разнице позже).
ggplot(diamonds, aes(x=clarity, fill=cut)) +
geom_bar() +
coord_trans(ytrans="log10")
Но это дает ошибку
Error in if (length(from) == 1 || abs(from[1] - from[2]) < 1e-06) return(mean(to)) :
missing value where TRUE/FALSE needed
, который возникает из проблемы отрицательной бесконечности.
Когда вы используете преобразование шкалы, преобразование применяется к данным, затем выполняется статистика и сортировка, затем шкалы помечаются в обратном преобразовании (примерно). Вы можете увидеть, что происходит, самостоятельно разбив расчеты.
DF <- ddply(diamonds, .(clarity, cut), summarise, n=length(clarity))
DF$log10n <- log10(DF$n)
, что дает
> head(DF)
clarity cut n log10n
1 I1 Fair 210 2.322219
2 I1 Good 96 1.982271
3 I1 Very Good 84 1.924279
4 I1 Premium 205 2.311754
5 I1 Ideal 146 2.164353
6 SI2 Fair 466 2.668386
Если мы построим это обычным способом, мы получим ожидаемый гистограмма:
ggplot(DF, aes(x=clarity, y=n, fill=cut)) +
geom_bar(stat="identity")
и масштабирование оси y создает ту же проблему, что и использование предварительно не суммированных данных.
ggplot(DF, aes(x=clarity, y=n, fill=cut)) +
geom_bar(stat="identity") +
scale_y_log10()
Мы можем увидеть, как проблема возникает, изобразив log10()
значения счетчиков.
ggplot(DF, aes(x=clarity, y=log10n, fill=cut)) +
geom_bar(stat="identity")
Это похоже на тот, что с scale_y_log10
, но метки 0, 5, 10, ... вместо 10 ^ 0, 10 ^ 5, 10 ^ 10, ...
Таким образом, использование scale_y_log10
производит подсчет, преобразовывает их в журналы, складывает эти журналы и затем отображает масштаб в форме анти-журнала. Однако укладка журналов не является линейным преобразованием, поэтому то, что вы просили сделать, не имеет никакого смысла.
Суть в том, что гистограммы с накоплением в логарифмическом масштабе не имеют особого смысла, потому что они не могут начинаться с 0 (где должно быть дно столбца), и сравнение частей столбца нецелесообразно, поскольку их размер зависит от того, где они находятся в стеке. Вместо этого рассматривается что-то вроде:
ggplot(diamonds, aes(x=clarity, y=..count.., colour=cut)) +
geom_point(stat="bin") +
scale_y_log10()
Или, если вы действительно хотите получить общее количество для групп, которые обычно дают стеки, вы можете сделать что-то вроде:
ggplot(diamonds, aes(x=clarity, y=..count..)) +
geom_point(aes(colour=cut), stat="bin") +
geom_point(stat="bin", colour="black") +
scale_y_log10()