使用有光泽和ggplot2以交互方式绘制多条线

时间:2016-09-15 22:34:09

标签: r ggplot2 reshape2

我正在创建一个闪亮的应用程序,其中包含checkboxGroupInput,其中每个选中的框都会在频率图中添加另一行。我试图绕着reshape2ggplot2来了解如何使这成为可能。

数据:

  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

我的第一个想法是在绘图内部编写一个for循环,以便为geom_line()向量的每个返回值渲染一个新的input$productId。 - 然而经过一些研究似乎是错误的做事方式。

目前我尝试将数据melt()转换为有用的内容,然后aes(...group=product_id),但我尝试的任何内容都会出错。

试图融化数据:

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

所以我的轴和价值都是不稳定的,而不是我对设定情节所期望的。

1 个答案:

答案 0 :(得分:1)

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

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

你可以在aggrSet上做你的ggplot。它现在有三列:date,product_id,count。

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