2015-07-23 4 views
13

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

Один трюк заключается в использовании 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) 

enter image description here

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

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

enter image description here

Итак, попробуйте еще раз с 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 

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

я могу сделать это с только logarithmix х масштаба:

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

enter image description here

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

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

+1

Если 'ggplot2' часть не прерыватель сделки, есть пакет,' poweRlaw', что делает это: https://cran.r-project.org/web /packages/poweRlaw/index.html. – ulfelder

+0

Глупый вопрос: do 'geom_line()' в дополнение к 'geom_point()' с исходными данными и вообще не использовать 'stat_function' ...? – joran

+0

Две проблемы: вам необходимо установить пределы оси, чтобы избежать нулевых/отрицательных значений. Например, 'scale_x_log10 (пределы = c (1, 200)) + scale_y_log10 (пределы = c (1e-5, 1))'. Однако 'stat_function' не работает вместе с преобразованием осей: http://stackoverflow.com/questions/9382032/ggplot2-scale-x-log10-destroys-doesnt-apply-for-function-plotted-via-stat- fun – Roland

ответ

6

Положив свои комментарии в ответ:

Основной проблемой является ошибка в stat_function. При использовании в сочетании с преобразованием осей он вычисляет значения у из преобразованного, а не из исходных значений. Это совсем недавно было fixed on 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). 

resulting plot

Это еще более очевидно, если вы только преобразовать ось х:

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

resulting plot

Если вы не можете использовать версию 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() 

resulting plot

Смежные вопросы