【问题标题】:How to graph multiple lines in a single plot ggplot2?如何在单个绘图 ggplot2 中绘制多条线?
【发布时间】:2013-08-01 18:17:23
【问题描述】:

我正在开发一个 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 变量实际上是 input$ 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)
})

这绘制了其中一条线,但我不知道如何在同一图上绘制其他线。我读过关于在 aes 函数中使用“组”的信息,但这取决于数据集中有一个分类器,而这个分类器目前没有。

我还研究了 reshape2 包中的 melt() 函数,但不确定它对我有什么帮助(对于多行问题和这个项目的更大意义,这样用户就不必遵守 csv 上传格式的严格规定。

任何帮助将不胜感激!

【问题讨论】:

  • 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 或只是一个 id?
  • 你说假设Y 实际上是input$y,再加上environment() 的可疑存在告诉我,你已经走错了路小路。 melt 的使用(基本上)在这里是不可避免的,我认为这将是您传递用户选择特定列的地方。
  • @joran:您好,在实现用户输入方面我主要关注此人:github.com/jcheng5/seattle-meetup/blob/master/diamonds3/…。如何不可避免地使用熔体?我很确定我可以把 environment() 拿出来,我只是把它包括在内,因为 SO 上的另一个用户帮助我解决了另一个关于 environment() 的问题。
  • @mnel:你说得对,我确实需要退后一步 =/。基本上我现在的代码(在上面的评论中以 jcheng 的 diamonds 3 项目为模型)取决于用户上传一个特定格式的 csv 文件,就像我的帖子中的那样,这是不幸的。我希望融化可以缓解这些限制,但我不确定如何。您提到日期是一件好事,因为我的程序工作的要求之一是日期采用年月格式,否则 ggplot2 会乱序绘制月份(按字母顺序)。

标签: r ggplot2 reshape shiny reshape2


【解决方案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))

【讨论】:

  • 有没有一种方法可以让用户选择要在图表上显示的输入?例如,允许 input$x 和 input$y 变量,像 longdata = melt(widedate, id.vars=input$x, variable.name=input$y) 这样的东西可以工作吗?
  • 是的,这很容易,只需留下您要使用的列。我更新了答案给你看。不过,您不能简单地使用variable.name=input.y,这只会更改列名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2016-01-02
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多