【发布时间】: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