【问题标题】:Plotting thousands of observations on a single graph在一张图上绘制数千个观察值
【发布时间】:2014-11-03 23:47:55
【问题描述】:

我试图在 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 行? (如果我能得到另一种表示这些数据的方式,我不太关心这个问题)

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

【问题讨论】:

  • 你想用你的情节传达什么信息?客户之间有一种普遍的趋势吗?或者另一方面,有很大的可变性?确定您要显示的什么,然后才选择如何显示它。
  • 绘制此信息后,我将尝试表明某些营销活动影响了总客户的一个子集,我将对其进行子集化并显示在同一个图上。所以最终会显示营销活动的效果。
  • 也许geom_line(data=res,aes(x=Date,y=Revenue,group=CustNum),alpha=0.2) ?
  • @Patthebug 我的意思是,你想展示一段时间内的趋势吗,在某个时间点之后事情发生了变化,那种“what”。我只是想了解您是否真的需要线条。例如,箱线图或小提琴图可能是一种选择......无论如何,你会发现很难想出 10 种容易辨别的颜色,更不用说 16000 种了。这些线条将无法区分,因此毫无用处,恕我直言。跨度>
  • @ZéLoff - 我同意颜色根本无法区分。对于您的问题,是的,我想表明在某些客户的特定时间点之后情况发生了变化,而对于其他客户而言,情况是一致的。例如。我们针对少数客户开展了一项活动,问题是该活动如何影响与这些客户相关的收入。我想我应该专门关注受影响的客户,而不是同时关注所有客户。

标签: r plot ggplot2 visualization


【解决方案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 包之类的东西将您的数据框放入我在此处构建的矩阵类型。

【讨论】:

  • 我还没有将它应用到我的数据并以所需的格式重塑它,但这看起来很像我想要的。我运行了你的代码,输出很漂亮,就像一幅水彩画。非常感谢您的帮助伙伴。
  • 我的灵感来自 flowdata.com 的 Nathan Yau。他有很多不错的 R 示例
【解决方案2】:

也许你正在看这样的东西:

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_pointgeom_boxplotgeom_errorbar 做同样的事情。您也可以选择不分面并仅在一张图中绘制,但您必须在 geom 调用中指定选项“dodge”以避免将箱线图堆叠在一起。

结果2:

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多