Очень новенький вопрос, но, скажем, у меня есть такие данные:
test_data <-
data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
)
Как я могу построить как временные ряды, так var0
и var1
на одном графике с date
помощью оси X, используя ggplot2
? Бонусные баллы, если вы делаете var0
и var1
разных цветов, и могут включать в себя легенду!
Я уверен, что это очень просто, но я не могу найти никаких примеров там.
colour=
качестве имени переменной.colour='var_names'
как указано Хадли работает отлично. но @DaveX - будет более конкретным, если вы хотите выбрать определенные цвета, а не автоматически выбранные цвета с помощью функции.Общий подход заключается в преобразовании данных в длинный формат (используя
melt()
из пакетаreshape
илиreshape2
) илиgather()
/pivot_longer()
изtidyr
пакета:Также посмотрите этот вопрос о преобразовании данных из широкого в длинный.
источник
gather()
функциюtidyr
упаковки для расплавления данных:gather(test_data, variable, value, -date)
Вам нужно, чтобы данные были в «высоком» формате, а не в «широком» для ggplot2. «широкий» означает наличие наблюдения на строку с каждой переменной в виде отдельного столбца (как у вас сейчас). Вам необходимо преобразовать его в «высокий» формат, где у вас есть столбец, в котором указано имя переменной, и другой столбец, в котором указано значение переменной. Процесс перехода от широкого к высокому обычно называют «таянием». Вы можете использовать,
tidyr::gather
чтобы растопить ваш фрейм данных:Просто чтобы прояснить,
data
чтоggplot
потребляет после прохождения через негоgather
выглядит так:источник
Используя ваши данные:
Я создаю стековую версию, с которой
ggplot()
хотелось бы работать:В этом случае создание
stacked
было довольно легким, поскольку нам нужно было всего лишь выполнить пару манипуляций, ноreshape()
иreshape
иreshape2
может быть полезно, если у вас есть более сложный набор реальных данных для манипуляции.Как только данные находятся в этой суммированной форме, требуется всего лишь простой
ggplot()
вызов для создания нужного вам графика со всеми дополнительными функциями (одна из причин, почему высокоуровневые пакеты построения графиков нравятсяlattice
иggplot2
так полезны):Я оставлю это вам, чтобы привести в порядок метки осей, заголовок легенды и т. Д.
НТН
источник
rep()
, так что мы действительно получаем только 3 столбцаstacked
. Я отредактирую код, чтобы сделать отступ более понятным.melt()
хорошо принят, и я отмечаю, что пакет reshape [2] будет полезен здесь. Я не настолько знаком с reshape2, и для такой простой манипуляции сделать это вручную сложнее, чем призыватьmelt()
, это было меньше усилий, так как мне не нужно было читать, как использоватьmelt()
. И rcs подкрался с его ответом, пока я производил мой; когда я начал отвечать, ответов не было. более чем один способ снять шкуру с кошки - как говорится! ;-)Я также новичок в R, но, пытаясь понять, как работает ggplot, я думаю, у меня есть другой способ сделать это. Я просто поделюсь, вероятно, не как совершенное идеальное решение, а добавлю несколько разных точек зрения.
Я знаю, что ggplot лучше работает с фреймами данных, но, возможно, иногда полезно знать, что вы можете напрямую построить два вектора без использования фрейма данных.
Загрузка данных. Длина вектора исходной даты равна 100, тогда как var0 и var1 имеют длину 50, поэтому я только отображаю доступные данные (первые 50 дат).
Черчение
Однако я не смог добавить правильную легенду, используя этот формат. Кто-нибудь знает как?
источник
ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')