在单个图上绘制数千个观测值

时间:2014-11-03 23:47:55

标签: r plot ggplot2 visualization

我试图在X轴上绘制Date,在Y轴上绘制Revenue。我有大约16000个客户的数据,每周汇总收入。数据集看起来像下面的示例数据集(除了我有大约100周的数据和16000个客户):

CustNum    Date    Revenue
1    2013-01-07    35
1    2013-01-14    23
1    2013-01-21    42
1    2013-01-28    65
2    2013-01-07    78
2    2013-01-14    48
2    2013-01-21    85
2    2013-01-28    34

我想将这些数据绘制在单个图上,图中的一行代表一个客户。换句话说,该图上将有超过16000行,每周为每个客户显示Revenue

现在,我知道这个情节会非常混乱,上面有16000行,我想有什么建议可以更好地绘制这些数据,这样就不会那么杂乱。

我尝试了以下代码,但没有给出我想要的结果:

p <- ggplot() + geom_line(data=res,aes(x=Date,y=Revenue,color=custnum))

这并没有为多个客户提供多条线路。

所以我基本上有两个问题:

  1. 什么是表示此数据的更好方法?

  2. 我们如何改进我的代码以在一个图上显示16000行? (如果我能用另一种方式来表示这些数据,我不会太在意这个问题)

  3. 对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

以上是我上述评论中方法的基本R轮廓。我用一个大矩阵来保存所有数据。第一栏是客户是否得到了治疗。随后的列是100周的每周收入。

首先,我将模拟一些数据,这会产生很多时间噪音。

#First records are a stable pattern
notreat<- matrix(c(rep(0,8000), 100+rnorm(8000*100,0,5)),nrow=8000)
#second set of records get no treatment for 50 weeks    
treat<- matrix(c(rep(1,8000), 100+rnorm(8000*50,0,5)),nrow=8000)
#then get the treatment for 50 weeks
treat<-cbind(treat, 
             matrix(rnorm(50*8000,100+0.75*(0:50)),nrow=8000,ncol=50,byrow=TRUE))

m <- rbind(notreat, treat)

#use a color palette with transparency to be able to discern the overall pattern.
palette ( c(rgb(.4,0,0,0.01),rgb(0,0,0.4,0.01)))


#This will take several seconds to render 16000 lines
matplot(t(m[,2:101]),col=1+m[,1],type="l")

您可以使用unstack()reshape包等内容将数据框放入我构建的矩阵类型中。

答案 1 :(得分:0)

你可能正在看这样的事情:

CustNum = c("1","1","1","1",
            "2","2","2","2")
Date = c("2013-01-07","2013-01-14","2013-01-21","2013-01-28",
         "2013-01-07","2013-01-14","2013-01-21","2013-01-28")
Revenue = c("35","23","42","65","78","48","85","34")

df = as.data.frame(cbind(CustNum,Date,Revenue))

df$CustNum = as.factor(df$CustNum)
df$Revenue = as.numeric(as.character(df$Revenue))

## create the factor variable
df$Treatment = ifelse(df$CustNum == '1','campaign','no campaign')

ggplot(df) + geom_point(aes(x=Date, y=Revenue, color=Treatment), size=5) + facet_wrap(~Treatment)

结果:Plot

现在,您可以想象在所有数据点中使用geom_pointgeom_boxplot切换geom_errorbar时也是如此。您也可以选择不进行分面,只需在一个图表中进行绘图,但您必须在geom调用中指定选项'闪避',以避免让您将盒子图堆叠在一起。

结果2:Plot2