2016-09-15 53 views
1

我创建了一个闪亮的应用程序,它将有一个checkboxGroupInput,其中每个选中的框将添加另一行到频率图。我试图围绕reshape2ggplot2来理解如何使这成为可能。以闪亮和ggplot2交互绘制多行

数据:

head(testSet) 
    date store_id product_id count 
1 2015-08-15  3  1  8 
2 2015-08-15  3  3  1 
3 2015-08-17  3  1  7 
4 2015-08-17  3  2  3 
5 2015-08-17  3  3  1 
6 2015-08-18  3  3  2 

类级别信息:

dput(droplevels(head(testSet, 10))) 
structure(list(date = structure(c(16662, 16662, 16664, 
16664, 16664, 16665, 16665, 16665, 16666, 16666), class = "Date"), 
    store_id = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), product_id = c(1L, 
    3L, 1L, 2L, 3L, 3L, 1L, 2L, 1L, 2L), count = c(8L, 1L, 7L, 
    3L, 1L, 2L, 18L, 1L, 0L, 2L)), .Names = c("date", "store_id", 
"product_id", "count"), row.names = c(NA, 10L), class = "data.frame") 

该图应具有对应于date的x轴,以及对应于count y轴。我希望有一个复选框组输入,其中对于代表检查产品的每个框,将在图上绘制对应于product_id的行。数据已经过滤到store_id

我的第一个想法是在plot的内部写一个for循环来为input$productId向量的每个返回值渲染一个新的geom_line()。 - 但经过一些研究后,似乎这是错误的做法。

当前我正在尝试将melt()的数据降低到某些有用的值,然后aes(...group=product_id),但在我尝试的任何地方出现错误。

试图熔化数据:

meltSet

meltSet <- melt(testSet, id.vars="product_id", value.name="count", variable.name="date") 

head(meltSet) 
    product_id date count 
1  1 date 16662 
2  3 date 16662 
3  1 date 16664 
4  2 date 16664 
5  3 date 16664 
6  3 date 16665 

meltSet

的尾
tail(meltSet) 
    product_id date count 
76  9  count  5 
77  1  count 19 
78  2  count  1 
79  3  count 39 
80  8  count  1 
81  9  count  4 

绘图:

ggplot(data=meltSet, aes(x=date, y=count, group = product_id, colour = product_id)) + geom_line() 

enter image description here

所以我的坐标轴和数值都是不可靠的,而不是我期望的设置图。

+0

'熔化'是正确的想法。当你不显示你的代码甚至是错误文本时,很难知道你做错了什么!请编辑以准确显示您正在使用的代码(熔化()),可能是熔化数据框的head(),以及ggplot代码的(简单)版本,以及任何你得到的错误。如果你用'dput()',例如'dput(droplevels(head(testSet,10)))'分享你的初始数据,这样也很好,这样列的类信息也是共享的。如果您使用因素或日期或数字或字符,这很重要。 – Gregor

+0

我已经删除了“闪亮”的相关标签 - 它看起来像闪亮是你的最终目标,但这只是一个中间步骤。事实上,这将结束在一个闪亮的应用程序似乎切线。 – Gregor

+0

Thanks @Gregor,我用最近的尝试更新了这个问题。将保持在它,我敢肯定,我只是不正确地融化我的数据。 – huxfurpaw

回答

1

如果我正确地理解它,你不需要任何融化,你只需要汇总数据,总结按日期和product_id计数。你可以为此使用data.table:

testSet = data.table(testSet) 
aggrSet = testSet[, .(count=sum(count)), by=.(date, product_id)] 

你可以在aggrSet上做你的ggplot的东西。它现在有三列:日期,产品ID,计数。

当你像你一样融化时,你将不同类型的两个变量合并到date:date(Date)和store_id(int)中。