javascript - 加载 CSV 的连续轴 Google 图表?

标签 javascript html csv charts google-visualization

我已经设法在我的页面上实现了一个连续轴谷歌图表,并按照我想要的方式对其进行了格式化。现在我的要求已经改变,我正在尝试从 CSV 加载此图表,而不是硬编码和随机生成的数据。

我对如何将我的工作图表转换为从 CSV 中提取图表感到困惑,并陷入了困境。我要在这里发布一些东西,

  1. 我使用 CSV 的其他图表之一,这是我试图重新创建的图表
  2. 我的工作连续轴图运行硬编码数据
  3. 自从我尝试实现更改后,我目前的图表状态。

这是#1:

            function drawPieVisualization() {
               $.get("Thornton.M2.csv", function(csvString) {
                  // transform the CSV string into a 2-dimensional array
                  var arrayData = $.csv.toArrays(csvString, {onParseValue: $.csv.hooks.castToScalar}, {onParseValue: $.csv.hooks.castToScalar});


                  // this new DataTable object holds all the data
                  var data = new google.visualization.arrayToDataTable(arrayData);
                  // CAPACITY - En-route ATFM delay - YY - CHART
                  var pieMain = new google.visualization.ChartWrapper({
                     chartType: 'BarChart',
                     containerId: 'pieMain',
                     dataTable: data,
                     options:{
                         title: 'Bar Chart Test',
                        'vAxis': { title: "Bar Chart Test" },
                        'width': 1100, 
                        'height': 540,
                        'backgroundColor': 'Ivory',
                        'color':'Black',
                        'hAxis': {
                    title: "Date",
                    gridlines: { count: 3, color: '#CCC' },
                    format: 'dd-MMM-yyyy'
                },
                        title: 'Bar Chart Test',
                        titleTextStyle : {color: 'Black', fontSize: 16},
                     }
                  });
                  pieMain.draw();
               });
            }
            google.setOnLoadCallback(drawPieVisualization)

            changeRange = function() {
          pieMain.sort({column: 0, desc: false});
          pieMain.draw();
        };

            changeRangeBack = function() {
          pieMain.sort({column: 0, desc: true});
          pieMain.draw();
        };

这是#2:

    function drawVisualization() {
 var data = new google.visualization.DataTable();
    data.addColumn('date', 'Date');
    data.addColumn('number', 'Value');

    // add 100 rows of pseudo-random-walk data
    for (var i = 0, val = 50; i < 100; i++) {
        val += ~~(Math.random() * 5) * Math.pow(-1, ~~(Math.random() * 2));
        if (val < 0) {
            val += 5;
        }
        if (val > 100) {
            val -= 5;
        }
        data.addRow([new Date(2014, 0, i + 1), val]);
    }

    var chart = new google.visualization.ChartWrapper({
        chartType: 'ComboChart',
        containerId: 'slider_chart_div',
        options: {
            'title': 'Average Ratings',
                            'vAxis': { title: "Average Rating" },
                            'backgroundColor': 'Ivory',
                            'color':'Black',
            width: 1100,
            height: 400,
            // omit width, since we set this in CSS
            chartArea: {
                width: '75%' // this should be the same as the ChartRangeFilter
            }
        }
    });

    var control = new google.visualization.ControlWrapper({
        controlType: 'ChartRangeFilter',
        containerId: 'control_div',
        options: {
            filterColumnIndex: 0,
            ui: {
                chartOptions: {
                    'backgroundColor': 'Ivory',
                            'color':'Black',
                    width: 1100,
                    height: 50,
                    // omit width, since we set this in CSS
                    chartArea: {
                        width: '75%' // this should be the same as the ChartRangeFilter
                    }
                }
            }
        }
    });

    var dashboard = new google.visualization.Dashboard(document.querySelector('#dashboard_div'));
    dashboard.bind([control], [chart]);
    dashboard.draw(data);

    function zoomLastDay () {
        var range = data.getColumnRange(0);
        control.setState({
            range: {
                start: new Date(range.max.getFullYear(), range.max.getMonth(), range.max.getDate() - 1),
                end: range.max
            }
        });
        control.draw();
    }
    function zoomLastWeek () {
        var range = data.getColumnRange(0);
        control.setState({
            range: {
                start: new Date(range.max.getFullYear(), range.max.getMonth(), range.max.getDate() - 7),
                end: range.max
            }
        });
        control.draw();
    }
    function zoomLastMonth () {
        // zoom here sets the month back 1, which can have odd effects when the last month has more days than the previous month
        // eg: if the last day is March 31, then zooming last month will give a range of March 3 - March 31, as this sets the start date to February 31, which doesn't exist
        // you can tweak this to make it function differently if you want
        var range = data.getColumnRange(0);
        control.setState({
            range: {
                start: new Date(range.max.getFullYear(), range.max.getMonth() - 1, range.max.getDate()),
                end: range.max
            }
        });
        control.draw();
    }

    var runOnce = google.visualization.events.addListener(dashboard, 'ready', function () {
        google.visualization.events.removeListener(runOnce);

        if (document.addEventListener) {
            document.querySelector('#lastDay').addEventListener('click', zoomLastDay);
            document.querySelector('#lastWeek').addEventListener('click', zoomLastWeek);
            document.querySelector('#lastMonth').addEventListener('click', zoomLastMonth);
        }
        else if (document.attachEvent) {
            document.querySelector('#lastDay').attachEvent('onclick', zoomLastDay);
            document.querySelector('#lastWeek').attachEvent('onclick', zoomLastWeek);
            document.querySelector('#lastMonth').attachEvent('onclick', zoomLastMonth);
        }
        else {
            document.querySelector('#lastDay').onclick = zoomLastDay;
            document.querySelector('#lastWeek').onclick = zoomLastWeek;
            document.querySelector('#lastMonth').onclick = zoomLastMonth;
        }
    });

    }

这是#3:

function drawVisualization() {
 $.get("Source7Days.csv", function(csvString) {
                  // transform the CSV string into a 2-dimensional array
                  var arrayData = $.csv.toArrays(csvString, {onParseValue: $.csv.hooks.castToScalar}, {onParseValue: $.csv.hooks.castToScalar});


                  // this new DataTable object holds all the data
                  var data = new google.visualization.arrayToDataTable(arrayData);


var chart = new google.visualization.ChartWrapper({
    chartType: 'ComboChart',
    containerId: 'slider_chart_div',
    dataTable: data,
    options: {
        'title': 'Average Ratings',
                        'vAxis': { title: "Average Rating" },
                        'backgroundColor': 'Ivory',
                        'color':'Black',
        width: 1100,
        height: 400,
        // omit width, since we set this in CSS
        chartArea: {
            width: '75%' // this should be the same as the ChartRangeFilter
        }
    }
});

var control = new google.visualization.ControlWrapper({
    controlType: 'ChartRangeFilter',
    containerId: 'control_div',

    options: {
        filterColumnIndex: 0,
        ui: {
            chartOptions: {
                'backgroundColor': 'Ivory',
                        'color':'Black',
                width: 1100,
                height: 50,
                // omit width, since we set this in CSS
                chartArea: {
                    width: '75%' // this should be the same as the ChartRangeFilter
                }
            }
        }
    }
});

var dashboard = new google.visualization.Dashboard(document.querySelector('#dashboard_div'));
dashboard.bind([control], [chart]);
dashboard.draw(data);

function zoomLastDay () {
    var range = data.getColumnRange(0);
    control.setState({
        range: {
            start: new Date(range.max.getFullYear(), range.max.getMonth(), range.max.getDate() - 1),
            end: range.max
        }
    });
    control.draw();
}
function zoomLastWeek () {
    var range = data.getColumnRange(0);
    control.setState({
        range: {
            start: new Date(range.max.getFullYear(), range.max.getMonth(), range.max.getDate() - 7),
            end: range.max
        }
    });
    control.draw();
}
function zoomLastMonth () {
    // zoom here sets the month back 1, which can have odd effects when the last month has more days than the previous month
    // eg: if the last day is March 31, then zooming last month will give a range of March 3 - March 31, as this sets the start date to February 31, which doesn't exist
    // you can tweak this to make it function differently if you want
    var range = data.getColumnRange(0);
    control.setState({
        range: {
            start: new Date(range.max.getFullYear(), range.max.getMonth() - 1, range.max.getDate()),
            end: range.max
        }
    });
    control.draw();
}

var runOnce = google.visualization.events.addListener(dashboard, 'ready', function () {
    google.visualization.events.removeListener(runOnce);

    if (document.addEventListener) {
        document.querySelector('#lastDay').addEventListener('click', zoomLastDay);
        document.querySelector('#lastWeek').addEventListener('click', zoomLastWeek);
        document.querySelector('#lastMonth').addEventListener('click', zoomLastMonth);
    }
    else if (document.attachEvent) {
        document.querySelector('#lastDay').attachEvent('onclick', zoomLastDay);
        document.querySelector('#lastWeek').attachEvent('onclick', zoomLastWeek);
        document.querySelector('#lastMonth').attachEvent('onclick', zoomLastMonth);
    }
    else {
        document.querySelector('#lastDay').onclick = zoomLastDay;
        document.querySelector('#lastWeek').onclick = zoomLastWeek;
        document.querySelector('#lastMonth').onclick = zoomLastMonth;
    }
});

}


)}

这是我正在使用的 CSV 数据示例

    Time,Value
    2017/05/22 00:05:00,6710.4305066168
    2017/05/22 00:10:00,6667.5043776631
    2017/05/22 00:15:00,6615.6655550003
    2017/05/22 00:20:00,6554.988194257
    2017/05/22 00:25:00,6532.4164219201
    2017/05/22 00:30:00,6520.8965539932

#2 和#3 中底部的“runOnce”部分用于将图表上的 slider 控件从1 天 - 1 周 - 或 1 个月更改为图表上的范围,以作澄清.

我的图表目前出现错误:

One or more participants failed to draw(). (Two of these)

The filter cannot operate on a column of type string. Column type must be one of: number, date, datetime or timeofday. Column role must be domain, and correlate to a continuous axis.

最佳答案

第二条错误消息显示 arrayToDataTable
将第一列创建为 --> type: 'string'
而不是 --> type: 'date'

使用 DataView将字符串转换为日期

您可以使用方法在数据 View 中创建计算列 --> setColumns

在绘制仪表盘时使用view代替data

请看下面的片段...

$.get("Source7Days.csv", function(csvString) {
  var arrayData = $.csv.toArrays(csvString, {onParseValue: $.csv.hooks.castToScalar}, {onParseValue: $.csv.hooks.castToScalar});

  // this is a static method, "new" keyword should not be used here
  var data = google.visualization.arrayToDataTable(arrayData);

  // create view
  var view = new google.visualization.DataView(data);
  view.setColumns([
    // first column is calculated
    {
      calc: function (dt, row) {
        // convert string to date
        return new Date(dt.getValue(row, 0));
      },
      label: data.getColumnLabel(0),
      type: 'date'
    },
    // just use index # for second column
    1
  ]);

  var chart = new google.visualization.ChartWrapper({
    chartType: 'ComboChart',
    containerId: 'slider_chart_div',
    options: {
      title: 'Average Ratings',
      vAxis: { title: 'Average Rating' },
      backgroundColor: 'Ivory',
      color: 'Black',
      width: 1100,
      height: 400,
      chartArea: {
        width: '75%'
      }
    }
  });

  var control = new google.visualization.ControlWrapper({
    controlType: 'ChartRangeFilter',
    containerId: 'control_div',
    options: {
      filterColumnIndex: 0,
      ui: {
        chartOptions: {
          backgroundColor: 'Ivory',
          color: 'Black',
          width: 1100,
          height: 50,
          chartArea: {
            width: '75%'
          }
        }
      }
    }
  });

  var dashboard = new google.visualization.Dashboard(document.querySelector('#dashboard_div'));
  dashboard.bind([control], [chart]);
  // use data view
  dashboard.draw(view);
  ...

关于javascript - 加载 CSV 的连续轴 Google 图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44333372/

相关文章:

javascript - 根据匹配过滤嵌套数组数据

html - Bootstrap 网格系统行内容与其他行重叠

python - 使用 python 将 CSV 转换为 AVRO

javascript - html注入(inject)中的jquery

javascript - 观察 ES6 模块属性

html - 响应式幻灯片 - 调整大小时与另一个 div 重叠

javascript - 通过 javascript 更改 html DOM 没有响应

javascript - 在使用 javascript(d3 库)加载之前从 CSV 中选择数据

php - 需要通过 PHP 将大型 CSV 文件导入多个 MySQL 表的时间高效方法

javascript - PHP 表单 : the server responded with a status of 400 (Bad Request)