【问题标题】:Time-series histogram时间序列直方图
【发布时间】:2012-07-26 06:33:17
【问题描述】:

是否可以使用 R 或 D3.js 创建类似于this 演示文稿(幻灯片 36-39)中描述的时间序列直方图?或者有没有更好的方法将分桶数据显示为时间序列?

编辑:这是一些预先存储的sample data。理想情况下,D3 或 R 会自己进行分桶。是的,如果不清楚,我知道我可以自己写这个。我只是想知道是否已经有一个包可以做到这一点,而我还没有遇到过。谢谢!

【问题讨论】:

  • 这类问题需要fortunes::fortune("Yoda")当然这是可能的。但如果你问“有人已经在一个包裹里做过这个吗?”,答案可能是否定的。也就是说,图表很有趣,应该有人编写这样的时间序列直方图。也许你能做到?
  • 使用ggplot2 应该很容易做到这一点。也许如果您发布一些示例数据,我可能会很想制作这样的图。

标签: r d3.js time-series histogram


【解决方案1】:

把你的数字放在一个矩阵中并使用'image(mat)'?看起来就是这样。一个网格。一个光栅。还是我错过了什么?

还有一些方法可以使用 ggplot、raster 以及可能的其他方法。

【讨论】:

    【解决方案2】:

    这是使用 R 和 ggplot2 的一种可能解决方案。

    您的数据,准备粘贴到 R 控制台:

    dat = structure(list(date = structure(c(15541, 15541, 15541, 15541, 
        15541, 15541, 15541, 15541, 15541, 15541, 15541, 15541, 15541, 
        15541, 15541, 15541, 15541, 15542, 15542, 15542, 15542, 15542, 
        15542, 15542, 15542, 15542, 15542, 15542, 15542, 15542, 15542, 
        15542, 15543, 15543, 15543, 15543, 15543, 15543, 15543, 15543, 
        15543, 15543, 15543, 15543, 15543, 15543, 15543, 15543, 15543, 
        15543, 15543, 15544, 15544, 15544, 15544, 15544, 15544, 15544, 
        15544, 15544, 15544, 15544, 15544, 15544, 15544, 15544, 15544, 
        15544, 15544, 15544, 15544, 15544, 15545, 15545, 15545, 15545, 
        15545, 15545, 15545, 15545, 15545, 15545, 15545, 15545, 15545, 
        15545, 15545, 15545, 15545, 15546, 15546, 15546, 15546, 15546, 
        15546, 15546, 15546, 15546, 15546, 15546, 15546, 15546, 15546, 
        15546, 15546, 15546, 15547, 15547, 15547, 15547, 15547, 15547, 
        15547, 15547, 15547, 15547, 15547, 15547, 15547, 15547, 15547, 
        15547, 15547, 15547, 15547), class = "Date"), bucket = c(800L, 
        900L, 1000L, 1100L, 1200L, 1300L, 1400L, 1500L, 1600L, 1700L, 
        1800L, 1900L, 2000L, 2100L, 2200L, 2300L, 2400L, 800L, 900L, 
        1000L, 1100L, 1200L, 1300L, 1400L, 1500L, 1600L, 1700L, 1800L, 
        1900L, 2000L, 2100L, 2200L, 900L, 1000L, 1100L, 1200L, 1300L, 
        1400L, 1500L, 1600L, 1700L, 1800L, 1900L, 2000L, 2100L, 2200L, 
        2300L, 2400L, 2500L, 2600L, 2800L, 800L, 900L, 1000L, 1100L, 
        1200L, 1300L, 1400L, 1500L, 1600L, 1700L, 1800L, 1900L, 2000L, 
        2100L, 2200L, 2300L, 2400L, 2500L, 2600L, 2700L, 2800L, 800L, 
        900L, 1000L, 1100L, 1200L, 1300L, 1400L, 1500L, 1600L, 1700L, 
        1800L, 1900L, 2000L, 2100L, 2200L, 2300L, 2400L, 800L, 900L, 
        1000L, 1100L, 1200L, 1300L, 1400L, 1500L, 1600L, 1700L, 1800L, 
        1900L, 2000L, 2100L, 2200L, 2300L, 2400L, 1300L, 1400L, 1500L, 
        1600L, 1700L, 1800L, 1900L, 2000L, 2100L, 2200L, 2300L, 2400L, 
        2500L, 2600L, 2700L, 2800L, 2900L, 3000L, 3200L), cnt = c(119L, 
        123L, 173L, 226L, 284L, 257L, 268L, 244L, 191L, 204L, 187L, 177L, 
        164L, 125L, 140L, 109L, 103L, 123L, 165L, 237L, 278L, 338L, 306L, 
        316L, 269L, 271L, 241L, 188L, 174L, 158L, 153L, 132L, 154L, 241L, 
        246L, 300L, 305L, 301L, 292L, 253L, 251L, 214L, 189L, 179L, 159L, 
        161L, 144L, 139L, 132L, 136L, 105L, 120L, 156L, 209L, 267L, 299L, 
        316L, 318L, 307L, 295L, 273L, 283L, 229L, 192L, 193L, 170L, 164L, 
        154L, 138L, 101L, 115L, 103L, 105L, 156L, 220L, 255L, 308L, 338L, 
        318L, 255L, 278L, 260L, 235L, 230L, 185L, 145L, 147L, 157L, 109L, 
        104L, 191L, 201L, 238L, 223L, 229L, 286L, 256L, 240L, 233L, 202L, 
        180L, 184L, 161L, 125L, 110L, 101L, 132L, 117L, 124L, 154L, 167L, 
        137L, 169L, 175L, 168L, 188L, 137L, 173L, 164L, 167L, 115L, 116L, 
        118L, 125L, 104L)), .Names = c("date", "bucket", "cnt"), 
        class = "data.frame", row.names = c(NA, -125L))
    

    绘制代码:

    library(ggplot2)
    
    plot_1 = ggplot(dat, aes(x=date, y=bucket, fill=cnt)) +
             geom_tile() +
             scale_fill_continuous(low="#F7FBFF", high="#2171B5") +
             theme_bw()
    
    ggsave("plot_1.png", plot_1, width=6, height=4)
    

    如果您在数据中包含零桶值的行,该图可能看起来更好。然后你可以把low="#F7FBFF"改成low="white"

    【讨论】:

    • 这看起来很像我想要的。谢谢!
    • 日期如何转换为数字?
    • @slashdottir,ggplot2 正在处理将 Date 类中的数据转换为适合绘图的数据。不确定具体如何,因为它是 ggplot 内部的。
    【解决方案3】:

    这是 D3 中的一个版本,以 @bdemarest 使用 ggplot2 的回答为模型:

    此版本使用tiled rect elements。如果您有一个大型数据集,您可能会从 pixel-based heatmap 获得更好的性能。

    如果您想使用 D3 计算存储桶,可以使用 d3.nest 按天和按值对数据进行分组。还有d3.layout.histogram,但由于您可能希望每天使用均匀间隔的垃圾箱和相同的垃圾箱,d3.nest 应该就足够了。

    一个微妙的考虑:我将刻度线放在瓷砖之间的刻度上,以便直观地指示值是如何分箱的。例如,左下角的桶对应于 7 月 20 日 800 到 900 之间的所有值(其中 7 月 20 日是午夜到午夜的时间间隔);至少,这是我通过查看您的数据所假设的。这比标记矩形的中间要清楚一些,因为它表明这些值是取整而不是四舍五入的。

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 2021-04-26
      • 2023-04-06
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2017-04-05
      • 2015-12-03
      • 2017-06-22
      相关资源
      最近更新 更多