Почему столбцы указывают вниз и что с этим делать
Графики в ggplot
создаются таким образом, что столбцы для положительных значений указывают вверх, начиная с y = 0, а столбцы для отрицательных значений указывают вниз от та же ось. Вы показываете плотность на оси Y, которая по определению лежит между 0 и 1. Логарифм числа в этом диапазоне отрицателен, и поэтому все ваши столбцы направлены вниз.
Я не знаю способа позволить ggplot
делать то, что вы хотите автоматически. Тем не менее, вы можете достичь своей цели, составив график вместо плотности. Это будет работать, потому что число равно 1 или больше, что означает, что логарифм положительный. Исключением является, конечно, когда число равно 0. Логарифм 0 расходится, и эти значения не будут построены, что эквивалентно построению графиков с нулевой высотой.
Простой пример
Поскольку у меня нет ваших данных, я покажу решение с использованием встроенного набора данных faithful
. Должно быть достаточно легко адаптировать это к вашим данным.
В качестве демонстрации того, что я имею в виду, я сначала покажу вам пример, где ось Y не является логарифмической c. Преимущество в том, что сюжет можно легко создать без каких-либо уловок:
bw <- 2
n <- nrow(faithful)
ggplot(faithful, aes(waiting)) +
geom_histogram(aes(y = stat(density)), binwidth = bw)
Обратите внимание, что я использовал stat(density)
вместо (..count..)/sum(..count..)
, что является более современным способом достижения того же самого. Я также сохранил binwdith и количество точек данных в переменных, так как я буду часто использовать эти значения. Следующий код дает точно такое же изображение:
ggplot(faithful, aes(waiting)) +
geom_histogram(binwidth = bw) +
scale_y_continuous(
breaks = seq(0, 0.05, 0.01) * (bw * n),
labels = function(x) x / (bw * nrow(faithful))
)
Обратите внимание, что на этот раз я строю счетчики, а не плотность. Тем не менее, я использую аргументы breaks
и labels
в scale_y_continuous()
, чтобы переопределить позиции разрывов и их метки так, чтобы они все же показывали плотность.
Решение с логарифмией c y-axis
Тот же принцип может быть применен к логарифму. Во-первых, я создаю лог-график так же, как вы сделали, так что вы можете видеть, что я сталкиваюсь с той же проблемой: столбцы указывают вниз.
ggplot(faithful, aes(waiting)) +
geom_histogram(aes(y = stat(density)), binwidth = 2) +
scale_y_log10()
Но, составив граф и подсчитав метки, вы можете получить более подходящее изображение:
ggplot(faithful, aes(waiting)) +
geom_histogram(binwidth = bw) +
scale_y_log10(
breaks = seq(0, 0.05, 0.01) * (bw * n),
labels = function(x) x / (bw * nrow(faithful))
)