R ggplot2: используя stat_summary (среднее) и логарифмическую шкалу - PullRequest
4 голосов
/ 02 августа 2010

У меня есть куча измерений с течением времени, и я хочу построить их в R. Вот пример моих данных.У меня есть 6 измерений для каждой из 4 временных точек:

values <- c (1012.0, 1644.9, 837.0, 1200.9, 1652.0, 981.5, 
    2236.9, 1697.5, 2087.7, 1500.8,
    2789.3, 1502.9, 2051.3, 3070.7, 3105.4, 
    2692.5, 1488.5, 1978.1, 1925.4, 1524.3,
    2772.0, 1355.3, 2632.4, 2600.1)
time <- factor (rep (c(0, 12, 24, 72), c(6, 6, 6, 6)))

Масштаб этих данных является произвольным, и фактически я собираюсь нормализовать его так, чтобы среднее значение t = 0 составляло 1.

norm <- values / mean (values[time == 0])

Пока все хорошо.Используя ggplot, я рисую как отдельные точки, так и линию, которая проходит через среднее значение в каждый момент времени:

require (ggplot2)
p <- ggplot(data = data.frame(time, norm), mapping = aes (x = time, y = norm)) +
    stat_summary (fun.y = mean, geom="line", mapping = aes (group = 1)) +
    geom_point()

Однако теперь я хочу применить логарифмическую шкалу, и этогде начинается моя проблемаКогда я это сделаю:

q <- ggplot(data = data.frame(time, norm), mapping = aes (x = time, y = norm)) +
    stat_summary (fun.y = mean, geom="line", mapping = aes (group = 1)) +
    geom_point() + 
    scale_y_log2()

Линия НЕ проходит через 0 при t = 0, как и следовало ожидать, потому что log (1) == 0. Вместо этого линия пересекает ось y немного ниже 0.По-видимому, ggplot применяет среднее значение после преобразования журнала, что дает другой результат.Я хочу, чтобы оно приняло среднее значение перед преобразованием журнала.

Как я могу сказать ggplot, чтобы сначала применить среднее значение?Есть ли лучший способ создать этот график?

Ответы [ 3 ]

7 голосов
/ 02 августа 2010

scale_y_log2() сначала выполнит преобразование, а затем вычислит геомы.

coord_trans() сделает наоборот: сначала вычислите геомы, а затем преобразуйте ось.

Так что вам нужно coord_trans(ytrans = "log2") вместо scale_y_log2()

1 голос
/ 02 ноября 2016

Чтобы решить эту проблему, если вы не хотите использоватьordin_trans () и все же хотите преобразовать данные, создайте функцию, которая будет преобразовывать ее обратно:

0 голосов
/ 25 мая 2017

Лучшее решение, которое я нашел для этой проблемы, состояло в том, чтобы использовать комбинацию coord_trans() и scale_y_continuous(breaks = breaks)

Как ранее предлагалось, использование coord_trans будет масштабировать вашу ось без преобразования данных, однако это будетоставить вас с уродливой осью.

Установка ограничений в coord_trans работает для некоторых вещей, но если вы хотите зафиксировать ось, чтобы у нее были определенные метки, тогда вы включите scale_y_continuous с разрывами, которые вы хотите установить.

coord_trans(y = 'log10') +
scale_y_continuous(breaks = breaks)
...