Как построить несколько линий на одном графике ggplot2?

Я работаю над программой R Shiny, которая может принимать любой файл csv и выводить его графики. Пользователь, который загружает csv, имеет некоторые рекомендации о том, как должны выглядеть данные, но я не хочу, чтобы они были слишком строгими.

В настоящее время я пытаюсь использовать ggplot2 для построения нескольких строк одного и того же набора данных на одном графике для сравнения.

Данные, которые я сейчас загружаю, выглядят следующим образом (упрощенно, поскольку данные содержат более 1000 строк):

Date Hamburgers Salads Sodas Fries
12-01    4        4      3    2
12-02    1        7      3    9
12-03    22       24     45   34
12-04    23       44    46    22

Я пытаюсь вывести график, на котором время отображается по оси X (пользователь выбирает это через боковую панель, так как он может выбрать любую ось, но время имеет здесь наибольший смысл). Для оси Y мне нужны 4 линии, окрашенные по-разному, на графике каждой переменной с течением времени.

У меня есть все, что `` пользователь принимает ввод и выбирает столбцы для графического отображения '', но для простоты мы можем предположить, что по большей части это было жестко закодировано (поэтому переменная Y фактически будет входить в $ y и т. Д. в моей реализации)

Часть моего кода, в которой я пытаюсь построить график данных:

output$plotLine <- renderPlot({
  p <- ggplot(data, aes_string(x=X, y=Y), environment = environment()) 
      p <- p + geom_point(size = 3) 
      p <- p + geom_line(aes(group=1)) 

  print(p)
})

Это рисует одну из линий, но я понятия не имею, как построить другие на том же участке. Я читал об использовании 'group' в функции aes, но это зависит от наличия классификатора в наборе данных, которого в настоящее время нет.

Я также изучил функцию melt () из пакета reshape2, но не уверен, как она мне поможет (как для многострочной проблемы, так и для большего смысла этого проекта, так что пользователю не нужно соблюдать строгие правила). правила для формата загрузки csv).

Любая помощь приветствуется!


person user2522217    schedule 01.08.2013    source источник
comment
Что вы имеете в виду под we can assume that for the most part, this has been hard coded (so Y variable will actually be input$y, etc in my implementation)? Как это согласуется с наличием нескольких возможных столбцов в качестве переменной Y? Я думаю, вам следует сделать шаг назад и подумать, как лучше всего преобразовать входные данные в форму, которую вы можете легко построить. Насчет отсутствия строгих правил для csv Что вы имеете в виду? Должны быть какие-то определения. Как вы собираетесь анализировать столбец даты («12 -01» - это не дата, и определенно не однозначно %m-%d, %y-%m или просто идентификатор?   -  person mnel    schedule 01.08.2013
comment
Тот факт, что вы говорите предположить, что Y на самом деле будет input$y, в сочетании с подозрительным присутствием environment(), говорит мне, что вы уже прошли довольно большой путь по ложному пути. Использование melt здесь (по сути) неизбежно, и я предполагаю, что именно здесь вы передадите своим пользователям выбор конкретных столбцов.   -  person joran    schedule 01.08.2013
comment
@joran: Здравствуйте, я в основном следил за этим человеком в реализации пользовательского ввода: github.com/jcheng5/seattle-meetup/blob/master/diamonds3/. Как избежать использования расплава? Я почти уверен, что могу убрать environment (), я включил его только потому, что другой пользователь SO помог мне по другому вопросу с environment ().   -  person user2522217    schedule 01.08.2013
comment
@mnel: Вы правы, мне нужно сделать шаг назад = /. В основном мой код прямо сейчас (смоделированный на основе проекта jcheng diamonds 3 в приведенном выше комментарии) зависит от того, что пользователь загружает файл csv в определенном формате, например, в моем сообщении, что прискорбно. Я надеялся, что таяние снимет эти ограничения, но не знаю, как это сделать. Хорошо, что вы упомянули дату, поскольку одним из требований для работы моей программы является то, что дата должна быть в формате год-месяц, иначе ggplot2 отображает месяцы не по порядку (в алфавитном порядке).   -  person user2522217    schedule 01.08.2013


Ответы (1)


Предполагая, что вы поместили переменную xaxis (Date) в selectedxaxis, выбранные продукты в selectedproducts и с data, содержащим загруженные данные:

selectedxaxis = "Date"
selectedproducts = c("Sodas", "Salads")
widedata = subset(data, select = c(selectedxaxis, selectedcolumns))

longdata = melt(widedata, id.vars=selectedxaxis, variable.name='Product', value.name='Count')
ggplot(longdata) + geom_line(aes(Date, Count, color=Product))
person Aert    schedule 01.08.2013
comment
Есть ли способ с помощью melt позволить пользователю выбирать, какие входные данные должны быть на графике? Например, с учетом переменных input $ x и input $ y, может ли работать что-то вроде longdata = melt (widedate, id.vars = input $ x, variable.name = input $ y)? - person user2522217; 01.08.2013
comment
Да, это очень просто, все, что нужно, - это оставить те столбцы, которые вы хотите использовать. Я обновил ответ, чтобы показать вам. Однако вы не можете просто использовать variable.name=input.y, это просто меняет имя столбца. - person Aert; 02.08.2013