API визуализации Google - JQuery - увеличивайте интервал каждые два столбца в ColumnChart - PullRequest
2 голосов
/ 27 июня 2019

Я хочу добавить большее пространство между каждыми двумя столбцами в Google Visualization ColumnChart и использую свойство bar groupWidth для реализации этого кода, показанного ниже:

<script type="text/javascript">
    google.charts.load('current', {
        packages: ['corechart', 'controls', 'charteditor']
    }).then(function () {
        var data = google.visualization.arrayToDataTable([@Html.Raw(ViewBag.ChartOutput)]);
        var width = Math.min(document.documentElement.clientWidth, window.innerWidth || 0) + 'px';

        // define bars series colors
        var colors = ["#FF9900", "#FF6400", "#FF0000", "#9A0033"];
        var lineColors = ['#4422EE', '#0F1657'];

        // define filter columns
        var columnsTable = new google.visualization.DataTable();
        columnsTable.addColumn('number', 'Series #');
        columnsTable.addColumn('string', 'Select series: ');
        var initState = { selectedValues: [] };
        for (var i = 1; i < data.getNumberOfColumns(); i++) {
            var colIndex = columnsTable.addRow([i, data.getColumnLabel(i)]);
            initState.selectedValues.push(data.getColumnLabel(i));

            // assign series type, axis, and color -- store using row properties
            switch (data.getColumnLabel(i)) {
                    case 'Baseline - Acute':
                    case 'Baseline - Risk':
                    case 'Baseline - Any':
                    case 'Review - Acute':
                    case 'Review - Risk':
                    case 'Review - Any':
                        columnsTable.setRowProperty(colIndex, 'type', 'bars');
                        columnsTable.setRowProperty(colIndex, 'targetAxisIndex', 0);
                        columnsTable.setRowProperty(colIndex, 'color', colors[colIndex]);
                break;
            }
        }

        // define chart
        var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));

        // define filter
        var filter = new google.visualization.ControlWrapper({
            controlType: 'CategoryFilter',
            containerId: 'filter_div',
            dataTable: columnsTable,
            options: {
                filterColumnIndex: 1,
                ui: {
                    caption: 'Series',
                    sortValues: false
                }
            },
            state: initState
        });

        // draw chart when filter is ready or changed
        google.visualization.events.addListener(filter, 'ready', drawChart);
        google.visualization.events.addListener(filter, 'statechange', drawChart);


        // draw filter
        filter.draw();

        // draw chart
        function drawChart() {
            var options = {

                hAxis: {
                    slantedText: true,
                    slantedTextAngle: 30,
                    title: 'Reporting Period'
                },
                vAxes: {
                    0: { logScale: false, title: '@Model.XAxis', minValue: 0 }
                },
                series: {},
                chartArea: {
                    top: 40,
                    left: 100,
                    width: '80%'
                },
                pointSize: 5,
                legend: { position: 'top' },
                width: width,
                height: '300px',
                colors: lineColors,
                lineWidth: 3.5
            };

            // define data view column and series options based on filter columns
            var viewColumns = [0];
            var state = filter.getState().selectedValues;
            state.forEach(function (column, index) {
                var colIndex;

                // find filter column index
                for (var i = 0; i < columnsTable.getNumberOfRows(); i++) {
                    if (columnsTable.getValue(i, 1) === column) {
                        colIndex = i;
                    }
                }
                viewColumns.push(colIndex + 1);

                // define series option
                options.series[index] = {
                    type: columnsTable.getRowProperty(colIndex, 'type'),
                    targetAxisIndex: columnsTable.getRowProperty(colIndex, 'targetAxisIndex')
                };
                if (colIndex < 6) {
                    options.series[index].color = columnsTable.getRowProperty(colIndex, 'color');
                    if (colIndex % 2 === 0) {
                        options.series[index] = { bar: {groupWidth: '100%'}}
                    }
                }
            });

            // define data view
            var dataView = new google.visualization.DataView(data);
            dataView.setColumns(viewColumns);

            // ensure enough columns selected to draw chart
            if (viewColumns.length > 1) {
                chart.draw(dataView, options);
            } else {
                chart.clearChart();
            }
        }

        var chart1 = "done";

        $(window).resize(function() {
            if(chart1 === "done"){
                chart1 = "waiting";
                setTimeout(function(){drawChart();chart1 = "done"},0);
            }
        });
    });
</script>

Ниже приведен разделjavascript, который я использую для этого:

if (colIndex < 6) {
                    options.series[index].color = columnsTable.getRowProperty(colIndex, 'color');
                    if (colIndex % 2 === 0) {
                        options.series[index] = { bar: {groupWidth: '100%'}}
                    }

Пока настройки не повлияли на представление ColumnChart, которое в настоящее время выглядит следующим образом:

enter image description here

Как бы изменить код для достижения желаемого стиля для ColumnChart, показанного на изображении выше, вероятно, потребуется ширина столбца между каждым набором из двух столбцов?

Готовостиль должен эмулировать столбцы в 2015/16 г. для всех отчетных периодов, показанных на рисунке ниже:

enter image description here

Я предоставил рабочий пример выводав JSFiddle:

https://jsfiddle.net/gd96aLb4/2/

1 Ответ

1 голос
/ 02 июля 2019

нет опций, которые добавят интервал между сериями,
но вы можете добавить пустую серию данных между ними.

тогда мы можем скрыть серию из диаграммы, используя следующие опции серии ...

    color: 'transparent',        // <-- ensure bar is not visible
    enableInteractivity: false,  // <-- prevent tooltip, etc.
    visibleInLegend: false       // <-- hide from legend

см. Следующий рабочий фрагмент ...

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
  var options = {
    hAxis: {
        slantedText: true,
        slantedTextAngle: 30,
        title: 'Reporting Period'
    },
    vAxes: {
        0: { logScale: false, title: 'No. of clients', minValue: 0 },
        1: { logScale: false, title: 'Average no. of days use', maxValue: 28, minValue: 0 }
    },
    series: {
      2: {
        color: 'transparent',
        enableInteractivity: false,
        visibleInLegend: false
      },
      5: {
        color: 'transparent',
        enableInteractivity: false,
        visibleInLegend: false
      }
    },
    chartArea: {
        top: 40,
        left: 100,
        width: '80%'
    },
    pointSize: 5,
    legend: { position: 'top' },
    height: '300px',
    lineWidth: 3.5
  };
  var data = google.visualization.arrayToDataTable([
    ['Outcomes','Baseline - Acute','Review - Acute','blank','Baseline - Risk','Review - Risk','blank','Baseline - Any','Review - Any'],
    ['2015/16',5794,4096,0,2323,1785,0,6073,4281],
    ['2016/17',5692,4140,0,2178,1785,0,5909,4323],
    ['2017/18',5680,4131,0,2479,1946,0,5989,4396]
  ]);
  var container = document.getElementById('chart_div');
  var chart = new google.visualization.ColumnChart(container);
  chart.draw(data, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>
...