Ответ 1
geom_bar
и scale_y_log10
(или любой логарифмический масштаб) не работают хорошо и не дают ожидаемых результатов.
Я использую пример 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()