使用谷歌直方图创建日期直方图

Posted

技术标签:

【中文标题】使用谷歌直方图创建日期直方图【英文标题】:Create date histogram chart with google histogram 【发布时间】:2014-02-15 03:50:03 【问题描述】:

如何创建适用于日期的 Google 直方图 [1]?

我已放置示例代码(带有工作编号和非工作日期示例):http://jsfiddle.net/Qquse/417/ 和下面的代码 [2]

[1]https://developers.google.com/chart/interactive/docs/gallery/histogram

[2]

google.load("visualization", "1", 
    packages: ["corechart"]
);
google.setOnLoadCallback(drawChart);

function str_to_utcdate(d) 
    return new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(9, 2));


function drawChart() 
    var data = google.visualization.arrayToDataTable([
        ['item', 'date'],
        ['a', str_to_utcdate('2001-07-01')],
        ['b', str_to_utcdate('2001-07-01')],
        ['c', str_to_utcdate('2001-07-01')], ]);

    var chart = new google.visualization.Histogram(document.getElementById('chart_div1'));
    chart.draw(data);

    var data = google.visualization.arrayToDataTable([
        ['item', 'date'],
        ['a', 10],
        ['b', 20],
        ['c', 30], ]);

    var chart = new google.visualization.Histogram(document.getElementById('chart_div2'));
    chart.draw(data);


【问题讨论】:

直方图尚不支持日期。您可以提交feature request 以添加支持。 添加了功能请求code.google.com/p/google-visualization-api-issues/issues/…。有什么方法可以模拟支持吗?可以将日期转换为数字,但如何修复标签和轴? 您可以通过设置日期列的格式化值来修复标签,但无法调整直方图中的轴标签。 近 2 年后,直方图仍不支持日期jsfiddle.net/paul_h/Qquse/1569 只是添加另一个评论... 4 年后,直方图仍然不支持日期^_^ 【参考方案1】:

5 年了,直方图仍然不支持日期。由于我没有时间而且我需要完成我的工作,所以我做了一个解决方法(太丑了,很疼)但是有效。

首先,我定义了一种格式,只是在每个标签的开头放置一个关键字。就我而言,由于我的页面中只有一张图表,所以我只使用了关键字“日期”。

const keyword = 'date';
const options = 
      // ...
      hAxis: 
        format: `'$keyword'#`
      ,

如果您的页面中有多个图表并且您希望它们表现不同,您可能需要为每个图表定义不同的关键字。

现在,使用查询选择器,我选择了我感兴趣的所有标签元素

let labels = Array.from(document.querySelectorAll('#chart svg g:nth-of-type(3) g:nth-of-type(3) g text'));

在我的例子中,我的图表设置在一个 id 为“chart”的 DIV 中。如果您使用任何其他 id,只需将 #chart 替换为您的 id;

然后我将只过滤以我的关键字“日期”开头的标签

labels = labels.filter(g => g.innerhtml.startsWith(keyword));

这样,我将每个元素的innerHTML 替换为我希望的日期格式。

labels.forEach(g => 

    const date = new Date(+g.substring(keyword.length));
    // you can apply any format method you wish

    // .toLocaleDateString()
    g.innerHTML = date.toLocaleDateString();

    // moment.js
    g.innerHTML = moment(date).format('DD/MM/YYYY HH:MM');

);

另外,我使用的是交互式图表,因此标签会在每次用户交互时刷新。因此,我将所有内容都放在一个区间内,最终结果如下:

const keyword = 'date';
const options = 
      // ...
      hAxis: 
        format: `'$keyword'#`
      ,


// ... chart setup

setInterval(() => 
    let labels = Array.from(document.querySelectorAll('#chart svg g:nth-of-type(3) g:nth-of-type(3) g text'));
    labels = labels.filter(g => g.innerHTML.startsWith(keyword));
    labels.forEach(g => 
        const date = new Date(+g.substring(keyword.length));
        g.innerHTML = date.toLocaleDateString();
    );
, 100);

谨慎使用此答案。使用查询选择器修改第三方生成的内容是非常不安全的,因为它依赖于希望第三方开发人员不会修改内容的生成方式.

【讨论】:

【参考方案2】:

试试这个柱形图:

public histogramChart: GoogleChartInterface = 
    chartType: 'ColumnChart',
    dataTable: [
        ['Date', 'Number'],
        [new Date(2015, 1, 1), 5],
        [new Date(2015, 1, 2), 5.1],
        [new Date(2015, 1, 3), 6.2],
        [new Date(2015, 1, 4), 7]
    ];,
    //opt_firstRowIsData: true,
    options: 
        title: 'Shooting history',
        legend:  position: 'none' ,
        colors: ['#4285F4'],
    ,
;

【讨论】:

直方图和柱形图是不同类型的图表,虽然非常相似。在某些情况下,柱形图无法很好地替换直方图。例如,就我而言,我正在使用 Google Charts 的仪表板控件来制作交互式图表。将柱形图进行动态化以用作直方图将是太多的工作。

以上是关于使用谷歌直方图创建日期直方图的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 的日期时间每小时直方图 [重复]

使用日期范围来改变服务器R Shiny中的直方图范围

在R中实时格式直方图格式化日期时间轴?

如何根据 bin 的 x 值将颜色图应用于绘图直方图?

制作因子变量的频率直方图

频率计数日期