R 在一张图表上绘制数千个观测值

R 在一张图表上绘制数千个观测值,r,plot,ggplot2,visualization,R,Plot,Ggplot2,Visualization,我试图在X轴上绘制日期,在Y轴上绘制收入。我有大约16000名客户的数据,每周收入合计。数据集看起来像下面的示例数据集(除了我有大约100周和16000名客户的数据): 我想将这些数据绘制在一个绘图上,绘图上的一行代表一个客户。换句话说,绘图上每周将有16000多行显示每个客户的收入 现在,我知道这个绘图将非常混乱,上面有16000行,我想提出一些建议,以更好的方式绘制这些数据,使其不那么混乱 我尝试了以下代码,但没有得到预期的结果: p <- ggplot() + geom_line(d

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

我想将这些数据绘制在一个绘图上,绘图上的一行代表一个客户。换句话说,绘图上每周将有16000多行显示每个客户的收入

现在,我知道这个绘图将非常混乱,上面有16000行,我想提出一些建议,以更好的方式绘制这些数据,使其不那么混乱

我尝试了以下代码,但没有得到预期的结果:

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

p您可能正在看到类似的情况:

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)
结果:

现在,您可以想象通过在所有数据点之间切换
geom_point
geom_boxplot
geom_errorbar
来执行相同的操作。您也可以选择不刻面,只在一个图形中绘制,但您必须在geom调用中指定选项“dodge”,以避免箱线图堆叠在另一个图形上


结果2:

这是我在上面的评论中对该方法的基本概述。我使用一个大矩阵来保存所有数据。第一栏是客户是否得到了治疗。后面的列是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")
#第一条记录是一种稳定的模式

不,你想用你的情节传达什么信息?顾客中有一种普遍的倾向吗?或者另一方面,有很大的可变性?确定要显示的内容,然后选择如何显示。在我绘制此信息后,我将尝试显示某些营销活动影响了总客户的一个子集,我将在同一个绘图上对其进行子集和显示。因此,营销活动的效果最终会显现出来。也许
geom_line(data=res,aes(x=Date,y=Revenue,group=CustNum),alpha=0.2)
?@Patthebug我的意思是,你想显示一段时间内的趋势吗?在这段时间之后,事情发生了变化,诸如此类的“什么”。我只是想知道你是否真的需要台词。例如,箱线图或小提琴图可能是一个选项。。。无论如何,你会发现很难想出10种容易辨别的颜色,更不用说16000了。这些线条将无法区分,因此毫无用处。@ZéLoff-我同意颜色根本无法区分。对于您的问题,是的,我想表明,对于某些客户来说,在某个特定点之后情况发生了变化,而对于其他客户来说,情况是一致的。我们针对少数客户开展了一项活动,问题是该活动如何影响与这些客户相关的收入。我想我应该特别关注受影响的客户,而不是同时关注所有客户。我还没有将其应用到我的数据中,并以所需的格式对其进行重塑,但这看起来与我想要的非常相似。我运行了你的代码,结果很漂亮,很像一幅水彩画。非常感谢你的帮助,伙计。我从flowingdata.com的Nathan Yau那里得到了灵感。他有很多很好的例子
#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")