Построение переменного числа серий в ggplot для использования в приложении Shiny

88
10

Мне нужно сделать график с ggplot, где число серий, включенных в график, является переменным. Фрейм данных имеет даты (переменная x) в первом столбце, а затем в любом месте от 1 до 15 дополнительных столбцов, содержащих переменные, которые должны быть нанесены на график. Я видел предыдущий пост, предлагающий расплавить из пакета изменить форму; однако я не мог заставить это работать. Я хотел бы, чтобы это работало независимо от спецификации ncol = при уменьшении яркости тестовой матрицы. Очень ценю любую помощь в этом!

Имитация данных:

#rm(list = ls())

library(ggplot2)
library(reshape2)

test <- matrix(0, nrow = 10, ncol = 5)

test[,1] <- seq(from = 2000, by = 1, length = 10)

for(i in 2:5){

test[1, i] <- 100

for(j in 2:10){

test[j, i] <- test[j-1, i] + rnorm(1, 25, 5)

}
}

colnames(test)[1] <- "date"

melt_test <- melt(test, id = "date")

ggplot(melt_test, aes(x=date, y=value, colour = variable, group = variable)) +
geom_line()

спросил(а) 2020-03-25T19:50:29+03:00 1 неделя, 4 дня назад
1
Решение
72

Исправление данных:

Ваш код выдает ошибку

Error in dimnames(x) <- dn : 
length of 'dimnames' [2] not equal to array extent

поэтому я регенерирую данные более непосредственно в data.frame используя matrix:

library(ggplot2)
library(reshape2)
test <- matrix(0, nrow = 10, ncol = 4)
set.seed(2) # for reproducibility, always include this in SO questions when using random funcs
for(i in 1:4){
test[1,i] <- 100
for(j in 2:10){
test[j, i] <- test[j-1, i] + rnorm(1, 25, 5)
}
}
test[1:3,]
# [,1] [,2] [,3] [,4]
# [1,] 100.0000 100.0000 100.0000 100.0000
# [2,] 120.5154 124.3061 130.0641 122.0172
# [3,] 146.4397 151.3943 157.2255 150.9782
dat <- cbind.data.frame(date = seq(2000, by=1, length=nrow(test)), test)
dat[1:3,]
# date 1 2 3 4
# 1 2000 100.0000 100.0000 100.0000 100.0000
# 2 2001 120.5154 124.3061 130.0641 122.0172
# 3 2002 146.4397 151.3943 157.2255 150.9782

Теперь, когда мы меняем форму, мы можем видеть что-то лучшее:

melt_dat <- reshape2::melt(dat, id="date")
melt_dat[1:3,]
# date variable value
# 1 2000 1 100.0000
# 2 2001 1 120.5154
# 3 2002 1 146.4397

Теперь все работает:

ggplot(melt_dat, aes(x=date, y=value, colour = variable, group = variable)) + 
geom_line()

sample ggplot image

ответил(а) 2020-03-25T20:03:25.665055+03:00 1 неделя, 4 дня назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема