【问题标题】:Creating a timeline with a bar chart in Google Charts?在 Google Charts 中使用条形图创建时间线?
【发布时间】:2013-06-20 16:54:37
【问题描述】:

我想使用 Google 图表创建一个时间线,以显示事件的持续时间、重复和重叠。每行应该是一个新事件,列应该是时间增量。

我一直在查看Google Charts docs,但是,它看起来不像我想要的那样 - 不仅要对水平条的长度进行范围调整,而且在同一行(不重叠)。

这可以通过 Chrome 或其他免费图表库实现吗?

编辑:我想制作一个类似于下面的图表

【问题讨论】:

    标签: javascript charts google-visualization


    【解决方案1】:

    我 100% 有信心可以在 Google 可视化中重新创建它,但由于我无法弄清楚的奇怪行为(标记日期的红线),我有点失望。如果你能解决这个问题,剩下的就很好了,看起来像这样:

    代码如下:

    function drawVisualization() {
      // Create and populate the data table.
      var data = new google.visualization.DataTable();
      data.addColumn('string', 'Assignment');
      data.addColumn('date', 'Dummy');
      data.addColumn('date', 'Current Assignment');
      data.addColumn('date', 'Dummy');
      data.addColumn('date', 'Next Assignment');
      data.addRows([
        ['Uranus', new Date(1298246400000), {v:new Date(26092800000), f:'2/21-12/20'}, new Date(0), {v:new Date(0), f:'1/0-1/0'}],
        ['Thomas Lamonthezie', new Date(1297036800000), {v:new Date(6393600000), f:'2/7-4/22'}, new Date(0), {v:new Date(0), f:'1/0-1/0'}],
        ['Shuo Li', new Date(0), {v:new Date(0), f:'1/0-1/0'}, new Date(1303689600000), {v:new Date(2937600000), f:'4/25-5/29'}],
        ['Saturne', new Date(1298246400000), {v:new Date(4579200000), f:'2/21-4/15'}, new Date(0), {v:new Date(0), f:'1/0-1/0'}],
        ['Roger Erwin', new Date(1301875200000), {v:new Date(1555200000), f:'4/4-4/22'}, new Date(259200000), {v:new Date(2160000000), f:'4/25-5/20'}],
        ['Rick Maverick', new Date(1302652800000), {v:new Date(2592000000), f:'4/13-5/13'}, new Date(0), {v:new Date(0), f:'1/0-1/0'}],
      ]);
    
      //Define date ranges for the chart
      var dateMin = new Date(2010,11,1);
      var dateMax = new Date(2012,0,1);
      var dateToday = new Date(2012,3,15);
    
    
      // Create and draw the visualization.
      new google.visualization.BarChart(document.getElementById('visualization')).
        draw(data,
             {width:600, height:400,
              isStacked: true,
              series: [{color: 'transparent'},{},{color: 'transparent'},{}],
              hAxis: {
                viewWindow: {
                  max: dateMax,
                  min: dateMin,
                },
                baseline: dateToday,
                baselineColor: 'red',
              },
             }
            );
    }
    

    基本上,您创建 4 个系列:

    1. 虚拟系列(距离第一次作业的时间)
    2. 第一次作业的持续时间
    3. 虚拟系列(第一次和第二次分配之间的时间)
    4. 第二次作业的持续时间

    然后您将系列 1 和 3 设置为不可见。

    对于数据,您必须进行一些日期数学运算(我在 Excel 中做过,抱歉),但基本上您只需通过减去每个作业的开始/结束日期来获得持续时间,并将虚拟设置为开始日期第二次分配的时间减去到第一次分配的时间加上第一次分配的持续时间。

    我使用{value: x, format: y} 技巧使鼠标悬停正常工作。您可以自动执行此操作(同样,我在 excel 中处理数据,因为我的 javascript 会花费更长的时间)。

    然后设置设置最小日期,最大日期,将系列变为正确的颜色,并将基线设置为红色。不幸的是,由于我无法理解的原因,无论日期设置如何,基线都希望位于图表的左侧。如果你能找到解决方法,你就有了你的图表。

    【讨论】:

    • 很高兴我能帮上忙。需要一些微调,我问了一个后续问题here,希望我能解决基线问题。
    【解决方案2】:

    您的 dateToday 超出范围更改以更改 var dateToday = new Date(2011,7,1),另一种解决方法是我创建一个额外的列,这将是我的 datetoday 并设置为 new Date(2011,6,1 )

    data.addColumn('string', 'Assignment');
    data.addColumn('date', 'Dummy');
    data.addColumn('date', 'Current Assignment');
    data.addColumn('date', 'Dummy');
    data.addColumn('date', 'Next Assignment');
    data.addColumn('date', 'Date of Report');
    data.addRows([
    ['Uranus', new Date(1298246400000), {v:new Date(26092800000), f:'2/21-12/20'}, new Date(0), {v:new Date(0), f:'1/0-1/0'},new Date(2011,6,1) ],
    ['Thomas Lamonthezie', new Date(1297036800000), {v:new Date(6393600000), f:'2/7-4/22'}, new Date(0), {v:new Date(0), f:'1/0-1/0'},new Date(2011,6,1) ],
    ['Shuo Li', new Date(0), {v:new Date(0), f:'1/0-1/0'}, new Date(1303689600000), {v:new Date(2937600000), f:'4/25-5/29'},new Date(2011,6,1)],
    ['Saturne', new Date(1298246400000), {v:new Date(4579200000), f:'2/21-4/15'}, new Date(0), {v:new Date(0), f:'1/0-1/0'},new Date(2011,6,1)],
    ['Roger Erwin', new Date(1301875200000), {v:new Date(1555200000), f:'4/4-4/22'}, new Date(259200000), {v:new Date(2160000000), f:'4/25-5/20'},new Date(2011,6,1)],
    ['Rick Maverick', new Date(1302652800000), {v:new Date(2592000000), f:'4/13-5/13'}, new Date(0), {v:new Date(0), f:'1/0-1/0'},new Date(2011,6,1)],
    ]);
    

    换个系列

    series: [{color: 'transparent'},{},{color: 'transparent'},{}]
    

    series: [{color: 'transparent'},{},{color: 'transparent'},{},{type: "line"}]
    

    我使用谷歌游乐场进行复制。

    一个问题你的日期是时间戳?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多