ggplot2-линейный график с рядом TIME и мультисплайном

Тема этого вопроса проста, но сводит меня с ума: 1. как использовать melt() 2. как работать с несколькими строками в одном изображении?

Вот мои необработанные данные:

a   4.17125 41.33875    29.674375   8.551875    5.5
b   4.101875    29.49875    50.191875   13.780625   4.90375
c   3.1575  29.621875   78.411875   25.174375   7.8012

Q1: я узнал из этого поста отображение двух переменных в виде линий с использованием ggplot2 на тот же график, чтобы узнать, как рисовать многострочные линии для нескольких переменных, вот так: enter image  описание здесь

Следующие коды могут получить приведенный выше график. Однако ось x действительно представляет собой временной ряд.

df <- read.delim("~/Desktop/df.b", header=F)
colnames(df)<-c("sample",0,15,30,60,120)
df2<-melt(df,id="sample")
ggplot(data = df2, aes(x=variable, y= value, group = sample, colour=sample)) + geom_line() + geom_point()

Хотелось бы, чтобы 0 15 30 60 120 можно было рассматривать как реальное число, чтобы показать временной ряд, а не name_characteristics. Даже попробовав это, я потерпел неудачу.

row.names(df)<-df$sample
df<-df[,-1]
df<-as.matrix(df)
df2 <- data.frame(sample = factor(rep(row.names(df),each=5)), Time = factor(rep(c(0,15,30,60,120),3)),Values = c(df[1,],df[2,],df[3,]))
ggplot(data = df2, aes(x=Time, y= Values, group = sample, colour=sample)) 
        + geom_line() 
        + geom_point()

Loooooooooking вперед к вашей помощи.

Q2: Я узнал, что следующий скрипт может добавить функцию spline() для одной строки. Как насчет того, чтобы применить spline() для всех трех строк в одном изображении?

n <-10
d <- data.frame(x =1:n, y = rnorm(n))
ggplot(d,aes(x,y))+ geom_point()+geom_line(data=data.frame(spline(d, n=n*10)))

person Puriney    schedule 19.09.2012    source источник


Ответы (1)


Ваш столбец variable является фактором (вы можете проверить, позвонив по номеру str(df2)). Просто преобразуйте его обратно в числовое:

df2$variable <- as.numeric(as.character(df2$variable))

Что касается вашего другого вопроса, вы можете использовать geom_smooth или stat_smooth, например:

p <- ggplot(data = df2, aes(x=variable, y= value, group = sample, colour=sample)) + 
      geom_line() + 
      geom_point()

library(splines)
p + geom_smooth(aes(group = sample),method = "lm",formula = y~bs(x),se = FALSE)

что дает мне что-то вроде этого:

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

person joran    schedule 19.09.2012
comment
Большое спасибо за вашу помощь! В моем случае я пробовал as.numeric(df2$Time) преобразовать их в число, но он возвращает мне 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5, что действительно сводит меня с ума. Спасибо еще раз. - person Puriney; 20.09.2012
comment
@Puriney Обратите внимание, что я не так делаю преобразование в своем ответе. Факторы выглядят как векторы символов, но они нет! Это целые коды и набор меток, которые сопровождают коды. Следовательно, as.numeric просто вернет целые коды. Вот почему я сначала превратился в персонажа. Более загадочный способ сделать это — as.numeric(levels(df2$Time)[df2$Time]). - person joran; 20.09.2012