Наложение нескольких вызовов stat_function в ggplot2 - PullRequest
9 голосов
/ 30 июля 2010

У меня есть два фрейма данных raw и coef:

  • один, содержащий необработанные данные
  • другой содержит коэффициенты моделирования, которые я получил из необработанных данных.

Первый кадр данных raw содержит:

  • Time (от 0 до 900 секунд)
  • OD для многих вариантов и четырех пробежек.

Второй кадр данных coef содержит:

  • одна строка на комбинацию вариантов / прогонов, с отдельными коэффициентами (M, D.1 и t0.1) в этой строке.

Я без проблем построил разделение необработанных данных на вариант и закрасил их runID. Но теперь я хочу наложить модельные кривые в соответствии с runID.

Поскольку коэффициенты моделирования находятся в разных фреймах данных с разными измерениями, я не могу просто cbind их. stat_function не будет работать для меня. Я могу получить только одну кривую за раз.

Я пробовал с for loop, добавляя слой stat_function каждый раз:

p <- ggplot(temp, aes(Time, OD)) + geom_point(aes(colour = runID), size = 2) #works fine!
calc <- function(x){temp.n$M[ID] * (1 - exp(temp.n$D.1[ID] * temp.n$t0.1[ID] - x)))}
for(ID in 1:length(unique(temp.n$runID))) {
  p <- p + stat_function(fun = calc)
}
print(p)

В конце все возвращаемые значения p являются графиком необработанных данных и окончательной кривой из бита цикла. p, похоже, возвращается в исходное состояние каждый раз, когда я пытаюсь добавить новый stat_function слой.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 07 августа 2010

Следуя приведенному здесь решению , вам, возможно, придется подражать эффекту stat_function самостоятельно. Поскольку вы не приводите воспроизводимый пример, я создал простой пример, который, как мы надеемся, имитирует вашу проблему:

library(ggplot2)
reg.fun <- function(x, par1, par2){exp(-x*par1) + par2} #functional form
reg <- data.frame(g=factor(1:3), par1=(1:3)/10, par2=1:3)  #parameters for 3 groups

#generate data from reg.fun
dd <- expand.grid(x=0:9, g=reg$g)         #set x values, and 3 groups from reg
dd <- merge(dd, reg)                      #"import" parameters
dd$mn <- with(dd, reg.fun(x, par1, par2)) #value of function for given x's
dd$y <- rnorm(30, mean=dd$mn, sd=0.5)     #add variability
dd <- subset(dd, select=c(g,x,y))         #remove auxiliary variables 

#similarly to above generate values for the function on a fine grid of x values
pred.dd <- expand.grid(x=seq(0,9, length=101), g=levels(dd$g))
pred.dd <- merge(pred.dd, reg)
pred.dd$y <- with(pred.dd, reg.fun(x, par1, par2))

#draw the plot
p <- qplot(x,y, colour=g, data=dd)  #scatterplot of data
p + geom_line(data=pred.dd)         #add the curves of the functions 
1 голос
/ 23 февраля 2018

У меня была такая же проблема с тобой.В очень не элегантном решении единственное решение, которое я нашел, состояло в том, чтобы объединить функции статистики вместе примерно так:

p <- ggplot(temp, aes(Time, OD)) + geom_point(aes(colour = runID), size = 2) #works fine!

calc <- function(x){temp.n$M[ID] * (1 - exp(temp.n$D.1[ID] * temp.n$t0.1[ID] - x)))}
    p <- p +
      stat_function(fun = function(x){temp.n$M[1] * (1 - exp(temp.n$D.1[1] * temp.n$t0.1[1] - x)))) + 
      stat_function(fun = function(x){temp.n$M[2] * (1 - exp(temp.n$D.1[2] * temp.n$t0.1[2] - x)))) +
      stat_function(fun = function(x){temp.n$M[3] * (1 - exp(temp.n$D.1[3] * temp.n$t0.1[3] - x)))) +
      # etc

Что хорошо, если у вас есть только несколько строк для добавления, но не если выесть много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...