Подтвердить что ты не робот

Как нарисовать кривую мощности с помощью ggplot2

Я хочу использовать ggplot2 для визуализации некоторых данных, следующих за кривой мощности. Это было задано раньше (Добавить строку тенденции тренда/мощности в ggplot), но ответ действительно не помог.

Один трюк заключается в использовании stat_function() для создания кривой. Однако я не могу получить stat_function(), а моя кривая мощности работать с логарифмическими шкалами.

Я иллюстрирую свои проблемы.

Создайте образцы данных и базовый график:

library(ggplot2)

x <- 1:100
pwr <- function(x)x^-2.5
dat <- data.frame(x, y = pwr(x))

p <- ggplot(dat, aes(x = x, y = y)) + 
  geom_point()

p + stat_function(fun = pwr)

введите описание изображения здесь

Отлично, добавьте некоторые логарифмические шкалы с помощью coord_trans(). Это работает отлично, за исключением того, что мои прямые линии уже не прямые (точно так, как мне кажется, говорит мне документация).

p + stat_function(fun = pwr) + coord_trans(x = "log10", y = "log10")

введите описание изображения здесь

Итак, повторите попытку с coord_x_log10() и coord_y_log10(), но этот выдает ошибку:

p + stat_function(fun = pwr) + scale_x_log10() + scale_y_log10()

Error in seq.default(min, max, by = by) : 
  'from' cannot be NA, NaN or infinite

Это, скорее всего, связано с тем, что мне нужно настроить мою функцию, чтобы инвертировать эффект шкал, но я не могу это понять.

Я могу сделать это только с помощью логарифмической x-шкалы:

p + scale_x_log10() + stat_function(fun = function(x)pwr(10^x))

введите описание изображения здесь

Я не знаю, как преобразовать значения y, если я добавлю scale_y_log10().

Я, вероятно, пропустил нечто фундаментальное. Есть ли простой способ построить эту кривую?

4b9b3361

Ответ 1

Вводя мои комментарии в ответ:

Основная проблема - ошибка в stat_function. При использовании в сочетании с преобразованием осей он вычисляет значения у из преобразованного, а не из исходных значений. Это было исправлено на github совсем недавно.

Однако это непросто увидеть, так как первая ошибка возникает при расчете разрывов оси, так как ошибка создает Inf, нулевые и/или отрицательные значения y. Вам нужно установить явные границы оси, чтобы увидеть, что фактическая проблема stat_function:

p + stat_function(fun = pwr) + 
  scale_x_log10() + scale_y_log10(limits = c(1e-5, 1))
#Warning message:
#Removed 100 rows containing missing values (geom_path).

итоговый график

Это еще более очевидно, если вы только трансформируете ось x:

p + stat_function(fun = pwr) + 
  scale_x_log10() 

итоговый график

Если вы не можете использовать версию ggplot2 из github, вы можете использовать это:

p + geom_line(data = data.frame(x = seq(min(dat$x), max(dat$x), length.out = 100)),
              aes(y = pwr(x))) + 
  scale_x_log10() + scale_y_log10()

итоговый график