【问题标题】:Google line chart month label in hAxis not correcthAxis 中的 Google 折线图月份标签不正确
【发布时间】:2020-03-18 09:16:35
【问题描述】:

我有一个 3 条线的动画折线图。

小提琴:

https://jsfiddle.net/8b3czfuq/

我在折线图上显示每日明智的数据,h 轴带有月-年标签。

google.charts.load('current', {
  packages: ['corechart']
});
google.setOnLoadCallback(prepareChartData);

function prepareChartData(){
  var chartData = new google.visualization.DataTable();
  chartData.addColumn('date', 'Date');
  chartData.addColumn('number', 'Total');
  chartData.addColumn('number', 'Dogs');
  chartData.addColumn('number', 'Cats');
  title = 'My Chart';

  var options = {
    title: title,
    curveType: 'function',
    legend: {position: 'bottom', alignment: 'start'},
    colors: ['#003f5c', '#ffa600', '#665191', '#f95d6a'],

    annotations: {
      alwaysOutside: true,
      textStyle: {
        color: 'black',
        fontSize: 11
      },
    },
    hAxis: {
      format: 'MMM yy',
      viewWindowMode: "explicit",
    },
    vAxis: {
      minValue: 0,
      viewWindowMode: "explicit",
      viewWindow: { min: 0 },
      title: ''
    },
    titleTextStyle: {
      color:'#3a3a3a',
      fontSize:24,
      bold:false
      // fontName: "Segoe UI"
      },
    bar: {groupWidth: '95%'},
    bars: 'horizontal'
  };

  var chartDivId = "chart_div";
  var chart = new google.visualization.LineChart(document.getElementById(chartDivId));
  var rawData =[];

   var chart_object = { "Feb 20": {monthLabel: "Feb", chartArray:[{'date': "2020-2-12", 'total': "5", 'cats': "10", 'dogs': "10"},{'date': "2020-2-13", 'total': "15", 'cats': "20", 'dogs': "20"}]}, "Mar 20": {monthLabel: "Mar", chartArray:[{'date': "2020-3-10", 'total': "5", 'cats': "10", 'dogs': "10"},{'date': "2020-03-11", 'total': "15", 'cats': "30", 'dogs': "30"}]}};

  $.each(chart_object, function(i, chartobject) {
 	$.each(  chartobject.chartArray, function( chartIndex , chartValue ){

    date = chartValue['date'];
    total = parseInt(chartValue['total']);
    catscount = parseInt(chartValue['cats']);
    dogscount = parseInt(chartValue['dogs']);
    catspercentage = 0;
    catspercentageAnnotation = catscount+",  percent "+catspercentage+"%";
    dogsspercentage = 0;
    dogsspercentageAnnotation = dogscount+",  percent "+dogsspercentage+"%";

    rawData.push([ new Date(date), total, {v: catscount, f: catspercentageAnnotation}, {v: dogscount, f: dogsspercentageAnnotation}]);
	  });
  });

  var counter = 0;
  drawChart();

  function drawChart() {
    if(counter < rawData.length){
      chartData.addRow(rawData[counter]);

      // build x-axis ticks to prevent repeated labels
      var dateRange = chartData.getColumnRange(0);
      var ticks = [];
      var dateTick = dateRange.min;
      while (dateTick.getTime() <= dateRange.max.getTime()) {
        ticks.push(dateTick);
        dateTick = new Date(dateTick.getFullYear(), dateTick.getMonth() + 2, 0);
      }
      options.hAxis.ticks = ticks;

      chart.draw(chartData, options);
      counter++;
      window.setTimeout(drawChart, 1000);
    }
  }
}
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js" type="text/javascript" ></script>
   <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
   <div id="chart_div"></div>

      

我对这张图表有一些疑问。

  1. 我有 2 月和 3 月的数据。但只有二月标签出现在 hAxis 标签中。预期的结果是它应该显示与对象中的日期相对应的所有月份标签。

  2. haxis 月份标签从左端开始,最后一个月从最右端开始。我想在折线图中显示该月数据开始的标签。即假设我有数据到 4 月,在 haxis 中,4 月标签显示在右端,即使折线图中的 4 月数据在标签位置之前开始。

  3. 对于 haxis 中的第一个标签,我也想显示日期。在这种情况下,2020-2-12 是最小数据。所以在 haxis 中它应该显示 20 年 2 月 12 日,所有其他标签应该只是 MMM yy。

谁能帮我完成上述 3 个修复?

提前致谢。

【问题讨论】:

    标签: javascript charts google-visualization linechart


    【解决方案1】:

    在月初显示日期标签,
    需要使用当月的第一天...

    dateTick = new Date(dateTick.getFullYear(), dateTick.getMonth() + 1, 1);  // first day
    

    当前代码使用月份的最后一天(基于另一个问题的数据)

    dateTick = new Date(dateTick.getFullYear(), dateTick.getMonth() + 2, 0);  // last day
    

    接下来,为了以不同的格式显示第一个日期,
    我们可以使用对象表示法 ({}) 来表示刻度,
    其中v: 是刻度值,f: 是格式化值

    这里,我们使用日期格式化器来改变第一个刻度的格式

      // build x-axis ticks to prevent repeated labels
      var dateFormat = new google.visualization.DateFormat({
        pattern: 'yyyy-MM-dd'
      });
      var dateRange = chartData.getColumnRange(0);
      var ticks = [];
      var dateTick = dateRange.min;
      while (dateTick.getTime() <= dateRange.max.getTime()) {
        if (ticks.length === 0) {
          // format first tick
          ticks.push({
            v: dateTick,
            f: dateFormat.formatValue(dateTick)
          });
        } else {
          ticks.push(dateTick);
        }
        dateTick = new Date(dateTick.getFullYear(), dateTick.getMonth() + 1, 1);
      }
    

    请参阅以下工作 sn-p...

    google.charts.load('current', {
      packages: ['corechart']
    });
    google.setOnLoadCallback(prepareChartData);
    
    function prepareChartData(){
      var chartData = new google.visualization.DataTable();
      chartData.addColumn('date', 'Date');
      chartData.addColumn('number', 'Total');
      chartData.addColumn('number', 'Dogs');
      chartData.addColumn('number', 'Cats');
      title = 'My Chart';
    
      var options = {
        title: title,
        curveType: 'function',
        legend: {position: 'bottom', alignment: 'start'},
        colors: ['#003f5c', '#ffa600', '#665191', '#f95d6a'],
    
        annotations: {
          alwaysOutside: true,
          textStyle: {
            color: 'black',
            fontSize: 11
          },
        },
        hAxis: {
          format: 'MMM yy',
          viewWindowMode: "explicit",
        },
        vAxis: {
          minValue: 0,
          viewWindowMode: "explicit",
          viewWindow: { min: 0 },
          title: ''
        },
        titleTextStyle: {
          color:'#3a3a3a',
          fontSize:24,
          bold:false
          // fontName: "Segoe UI"
          },
        bar: {groupWidth: '95%'},
        bars: 'horizontal'
      };
    
      var chartDivId = "chart_div";
      var chart = new google.visualization.LineChart(document.getElementById(chartDivId));
      var rawData =[];
    
       var chart_object = { "Feb 20": {monthLabel: "Feb", chartArray:[{'date': "2020-2-12", 'total': "5", 'cats': "10", 'dogs': "10"},{'date': "2020-2-13", 'total': "15", 'cats': "20", 'dogs': "20"}]}, "Mar 20": {monthLabel: "Mar", chartArray:[{'date': "2020-3-10", 'total': "5", 'cats': "10", 'dogs': "10"},{'date': "2020-03-11", 'total': "15", 'cats': "30", 'dogs': "30"}]}};
    
      $.each(chart_object, function(i, chartobject) {
     	$.each(  chartobject.chartArray, function( chartIndex , chartValue ){
    
        date = chartValue['date'];
        total = parseInt(chartValue['total']);
        catscount = parseInt(chartValue['cats']);
        dogscount = parseInt(chartValue['dogs']);
        catspercentage = 0;
        catspercentageAnnotation = catscount+",  percent "+catspercentage+"%";
        dogsspercentage = 0;
        dogsspercentageAnnotation = dogscount+",  percent "+dogsspercentage+"%";
    
        rawData.push([ new Date(date), total, {v: catscount, f: catspercentageAnnotation}, {v: dogscount, f: dogsspercentageAnnotation}]);
    	  });
      });
    
      var counter = 0;
      drawChart();
    
      function drawChart() {
        if(counter < rawData.length){
          chartData.addRow(rawData[counter]);
    
          // build x-axis ticks to prevent repeated labels
          var dateFormat = new google.visualization.DateFormat({
            pattern: 'yyyy-MM-dd'
          });
          var dateRange = chartData.getColumnRange(0);
          var ticks = [];
          var dateTick = dateRange.min;
          while (dateTick.getTime() <= dateRange.max.getTime()) {
            if (ticks.length === 0) {
              // format first tick
              ticks.push({
                v: dateTick,
                f: dateFormat.formatValue(dateTick)
              });
            } else {
              ticks.push(dateTick);
            }
            dateTick = new Date(dateTick.getFullYear(), dateTick.getMonth() + 1, 1);
          }
          options.hAxis.ticks = ticks;
    
          chart.draw(chartData, options);
          counter++;
          window.setTimeout(drawChart, 1000);
        }
      }
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js" type="text/javascript" ></script>
       <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
       <div id="chart_div"></div>

    【讨论】:

    • 感谢您的回复。正在实施更新。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多