Как сделать ось Y гистограммы логарифмической c и процентной долей? - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь сделать гистограмму в ggplot2, и я пытаюсь сделать ось Y логарифмированной c и показывающей проценты, чтобы получить ее как 0,1%, 1%, 10% и c ,

Мой набор данных содержит 60 000 выборок, но я надеюсь, что этот вид захватывает его:

    -0.0651
    -0.0649
    -0.0661
    -0.0652
    -0.058
    -0.045
    -0.022
    -0.001
    +0.028
    +0.039
    -0.022
    -0.0651
    -0.0652

Я могу сделать обе эти вещи (1, делая журнал по оси Y, и 1, делая его в процентах) независимо. Поэтому, когда я просто делаю проценты, я использую следующий код:

ggplot(aphist, aes(aphist$baseline1CW_Vm_samp)) +
  geom_histogram(aes(y = (..count..)/sum(..count..)), binwidth=0.0008) +

И я получаю этот вывод с процентами:

percentage

Но теперь я хочу сделать ось Y логарифмической c. Когда я делаю это так, как меня учили, используя следующий код:

ggplot(aphist, aes(aphist$baseline1CW_Vm_samp)) +
  geom_histogram(aes(y = (..count..)/sum(..count..)), binwidth=0.0008) +
  scale_y_continuous(trans = 'log10')

Я вдруг получаю очень странный перевернутый перевернутый график:

..

Я подозреваю, что это потому, что некоторые сэмплы имеют значение 0 или близко к 0, но я не уверен. Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 22 марта 2020

Почему столбцы указывают вниз и что с этим делать

Графики в 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)

enter image description here

Обратите внимание, что я использовал 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()

enter image description here

Но, составив граф и подсчитав метки, вы можете получить более подходящее изображение:

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))
  )

enter image description here

...