2015-08-21 3 views
0

Это мой кадр данных:Plot функция для каждой строки в кадре R данных

Variables: 
$ X1 (dbl) 3.742382, 4.185260, 3.869329, 4.468430, 4.287528, 4.422470, 4.23... 
$ X2 (dbl) 7.0613552, 3.1143999, 6.4780125, 0.8486984, 3.4132880, 1.6816965... 
$ X3 (dbl) -2.02416823, 9.10853246, -0.56165113, 16.16834346, 8.02026020, 1... 
$ X4 (dbl) 15.0497971, 5.0139219, 13.8001589, -2.0927945, 6.5455396, -0.790... 

Xn являются параметрами 4-го полинома степени:

f(x) = X1*x + X2*x^2 + X2*x^3 + X2*x^4 

Таким образом, каждая строка представляет собой функцию. Можно ли построить каждую функцию на одном графике?

+5

Да. Пожалуйста, покажите, что вы уже пытались выполнить. Или, по крайней мере, воспроизводимый, где кто-то другой может с ним поработать без необходимости вручную редактировать данные. – Heroka

+0

Пожалуйста, укажите выходные данные, которые вы ожидаете при публикации примера. –

+0

Пожалуйста, вопрос прост, решение нет. Это воспроизводимый пример: DF <- data.frame (X1 = rnorm (10), X2 = rnorm (10), X3 = rnorm (10), X4 = rnorm (10)). Я еще не знаю, как это решить, поэтому то, что я пробовал, совсем не полезно. –

ответ

0

Что-то вроде этого?

DF <- data.frame(X1 = rnorm(10), X2 = rnorm(10), X3 = rnorm(10), X4 = rnorm(10)) 

# fixed plot region: 
xmin<-0 
xmax<-10 
ymin<- -10 
ymax<-10 

for (i in 1:10) { 
curve(DF$X1[i]*x+DF$X2[i]*x^2+DF$X3[i]*x^3+DF$X4[i]*x^4, xlim=c(xmin,xmax), ylim=c(ymin,ymax), add=TRUE) 
} 

enter image description here

EDIT: С помощью ggplot:

library(ggplot2) 
library(reshape) 


xmin<-0 
xmax<-10 
step<-0.01 

DF <- data.frame(X1 = rnorm(10), X2 = rnorm(10), X3 = rnorm(10), X4 = rnorm(10)) 

xx<-seq(xmin,xmax,by=step) 
DF2<-data.frame(matrix("", ncol = length(DF$X1), nrow = length(xx))) 
DF2$xx<-xx 
for(i in 1:length(DF$X1)){ 
DF2[,i]<-DF$X1[i]*xx+DF$X2[i]*xx^2+DF$X3[i]*xx^3+DF$X4[i]*xx^4 
} 

DF3 <- melt(DF2 , id.vars = "xx") 

ggplot(DF3, aes(xx,value)) + geom_line(aes(colour = variable)) 

enter image description here

+0

Мой подход был похож на один из @ T.Des, но ваш лучше. Это будет идеально (для меня), если вы используете ggplot вместо кривой. –

+0

Первая часть вашего ответа работает для меня. –

+0

@ Математический физик: Отредактировано (имя неправильной переменной). Теперь решение ggplot должно быть в порядке. – mira

0

Я хотел бы попробовать что-то вроде этого (хотя это не является оптимальным решением)

f <- function (x, X0, X1, X2, X3, X4){ 
    return (X0 + X1*x + X2*x^2 + X3*x^3 + X4*x^4) 
} 

x <- seq(-10,10,length.out = 100) 
for (i in c(1:length(DF$X1)){ 
    plot(f(x, 0, DF$X1[i], DF$X2[i], DF$X3[i], DF$X4[i]) ,t='l') 
    par(new = TRUE) 
} 

Пожалуйста, обратите внимание, что я определил функцию степени 4 (поэтому вам нужно 5 коэффициентов, чтобы выразить это). Ваши данные свидетельствуют о том, что X0 = 0.

Я также решил построить на полиномы от -10 до 10, вы можете изменить его, если вы хотите ...

0

как дополнение к @ T.Des ответа у меня есть альтернативный подход с использованием пакетов dplyr и ggplot2. Запустите скрипт шаг за шагом, чтобы увидеть, как он работает.

library(dplyr) 
library(ggplot2) 

# get the parameters as a dataframe 
dt = data.frame(x1 = c(2,4,5), 
       x2 = c(6,7,2), 
       x3 = c(1,2,4), 
       x4 = c(2,1,8)) 

# create plot_id based on the number of plots you want to produce 
dt$plot_id = 1:nrow(dt) 

# input how many points you want for your plot 
Np = 10 

data.frame(expand.grid(dt$plot_id, 1:Np)) %>%      # create all combinations of plot id and points 
    select(plot_id = Var1, 
     point=Var2) %>% 
    inner_join(dt, by="plot_id") %>%        # join back the parameters 
    mutate(y = x1*point + x2*point^2 + x3*point^3 + x4*point^4,  # calculate your output value 
     plot_id = as.character(plot_id)) %>% 
    ggplot(., aes(point,y,color=plot_id)) + 
    geom_line() 

Основываясь на моем примере наборе данных вы должны получить что-то вроде:

enter image description here

0

Вы также мог бы это сделать, как это с чистой базовой функциональностью R:

set.seed(1) 
x <- seq(-10, 10, length.out = 100) 
xx <- rbind(x, x^2, x^3, x^4) 
m <- matrix(rnorm(40), ncol = 4) # your coefficients 
matplot(x, t(m %*% xx), type = "l") 

Так, обратите внимание, что в вашем полиноме нет постоянного члена. Вам просто нужно адаптировать x к вашим данным и запустить этот код.

enter image description here

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