【问题标题】:Highcharts set xAxis values starting 12am and ends in 11pmHighcharts 设置 xAxis 值从上午 12 点开始到晚上 11 点结束
【发布时间】:2019-06-24 04:41:20
【问题描述】:

我正在使用一个 highcharts 插件,我的目标是按小时绘制一整天的图表。

如何将 xAxis 设置为使用 12 小时格式(带上午和下午),开始 => 一天结束。或者一些选项有 3 小时的间隔。

例如,我有 todayyesterday 的过滤器

我的数据,如下所示(时间戳和值):

[ [1561593600000, 102.5], [1561658400000, 177.45] ]

这是我的完整脚本:

  $(function(){
    var moneySign = "$";

    Highcharts.setOptions({
      lang: {
        thousandsSep: ','
      }
    });        

    // Sales Chart
    var SalesChart = Highcharts.chart('ba-chart-sales', {
      title: { text: '' },
      exporting: { enabled: false },
      subtitle: { text: '' },
      yAxis: {
        title: { text: '' },            
        useHTML: true,
        labels: {
          formatter: function() {
            return moneySign + this.axis.defaultLabelFormatter.call({
              axis: this.axis,
              value: this.value
            });
          }
        }
      },
      xAxis: {
        // Default for 7days & 30days (will change for today||yesterday)
        type: 'datetime',
        dateTimeLabelFormats: { day: '%b %e' },
        tickInterval: 24 * 3600 * 1000 // interval of 1 day      
      },
      legend: {
        layout: 'vertical',
        align: 'right',
        verticalAlign: 'middle',
        enabled:false
      },
      tooltip: {
        dateTimeLabelFormats: { day: '%B %e, %Y' },
        shared: true,
        useHTML: true,
        headerFormat: '{point.key}<div>',
        pointFormat: '<div style="background-color: #0549d1; height: 10px; width: 10px; border-radius: 50%; display: inline-block;"></div>' +
                     '<div style="margin-left: 5px; margin-top: 8px; width:30px; display: inline-block;"><b> ' + moneySign + '{point.y}</b></div>',
        footerFormat: '</div>',
        crosshairs: {
          color: '#ccc',
          className: 'chart-crosshair',
          dashStyle: 'solid',
          width: 1
        }
      },
      plotOptions: {
        series: {
          label: {
            connectorAllowed: false
          },
          marker: {
            enabled: false,
            symbol: 'circle'
          }
        }
      },
      series: [{
        tooltip: { xDateFormat: '%B %e, %Y' },
        showInLegend: false,
        name: '',
        data: []
      }],
      responsive: rules: [{
        condition: {
          maxWidth: 600
        },
        chartOptions: {
          legend: {
            layout: 'horizontal',
            align: 'center',
            verticalAlign: 'bottom'
          }
        }
      }],
      credits: { enabled: false }
    });


    // Initial
    var SalesChartExtremes = SalesChart.yAxis[0].getExtremes();

    // Change Cart Type `line` || `column`
    function reDrawChart(filter, chart) {
      var series  = SalesChart.series[0];
      var newType = ['today', 'yesterday'].includes(filter) ? 'column' : 'line';      
      series.chart.addSeries({
        type: newType,
        name: series.name,
        color: series.color,
        data: series.options.data,
      }, false);
      series.remove();
    }

    // Get Offer Analytics Data
    function getAnalytics(filter=''){
      $.ajax({
        type: "GET",
        url: "<%= analytics_url %>",
        data: {chart_filter: filter},
        dataType: "JSON",
        success: function(data){
          var todayLocalDate = "<%= @local_time.strftime("%Y-%m-%d") %>".split('-').map(Number);
          var yesterdayLocalDate = "<%= @local_time.yesterday.strftime("%Y-%m-%d") %>".split('-').map(Number);

          if( ['30', '7', ''].includes(filter) ){
            var toolTipProp = { xDateFormat: '%B %e, %Y' };
            var pointIntervalProp = 24 * 3600 * 1000; // one day
            var pointStartProp = '';
            var chartType = 'line';
          }else{
            if (filter == 'today'){
              var pointStartProp = Date.UTC(todayLocalDate[0], todayLocalDate[1], todayLocalDate[2]);
            }else if (filter == 'yesterday'){
              var pointStartProp = Date.UTC(yesterdayLocalDate[0], yesterdayLocalDate[1], yesterdayLocalDate[2]);
            }
            var toolTipProp = { xDateFormat: '%B %e, %Y %I:%M%p' };
            var pointIntervalProp = 3600000 * 3; // 3 hours
            var chartType = 'column';
          }

          var markerEnabled = data.sales.length == 1
          var salesOpts = {
            tooltip: toolTipProp,
            data: data.sales,
            animation: { duration: 1000 },
            pointInterval: pointIntervalProp,
            pointStart: pointStartProp,
            crosshair: true,
            marker: {
              enabled: markerEnabled
            }
          }

          // Sets yAxis min & max values for empty result
          if(data.sales.length == 0){
            SalesChart.yAxis[0].setExtremes(0,100);
            SalesChart.yAxis[0].update({tickInterval: 20});
          }else{
            // return to previous categories based on data
            SalesChart.yAxis[0].setExtremes(SalesChartExtremes.min, SalesChartExtremes.max);
            SalesChart.yAxis[0].update({tickInterval: 500});
          }        

          if(filter == 'today' || filter == 'yesterday'){
            var defaultTimeOpt = {
              tickInterval: 1,
              type: 'datetime',
              dateTimeLabelFormats: {
                millisecond: '%l:%M:%S.%L %P',
                second: '%l:%M:%S %P',
                minute: '%l:%M %P',
                hour: '%l:%M %P',
                day: '(%e. %b) %l:%M %P'
              }
            }
            SalesChart.xAxis[0].update(defaultTimeOpt, true);

          }else{
            // return to day options
            var defaultDayOpt = {
              type: 'datetime',
              dateTimeLabelFormats: { day: '%b %e' },
              tickInterval: 24 * 3600 * 1000 // interval of 1 day
            }

            SalesChart.xAxis[0].update(defaultDayOpt, false);            
          }


          SalesChart.series[0].update(salesOpts, true);          
          reDrawChart(filter, 'sales');

        },
        error: function(data) {
          flashError("Error getting analytics");          
        }
      });
      return false;
    }

  });

// Call getAnalytics when select dropdown filter change (e.g. today, yesterday, lastweek ...)
getAnalytics();

目前的进展,

TODO 1:如果只有少量数据,NO数据的时间应该是0值(所以图表还有进度)。

TODO 2:在 xAxis 中设置时间/小时,并可选择小时间隔/时间间隔,例如 3 小时 ... 12AM、3AM、6AM ....

【问题讨论】:

  • 如果您有多个问题,我建议您尝试将它们分成单独的问题,因为很难充分解决所有子问题,因为每个子问题都可能有几个可行的解决方案。此外,它还使那些有类似问题的人更容易找到该特定问题的单一事实来源。

标签: javascript jquery highcharts


【解决方案1】:

如果你已经有了价值,那么你可以做类似的事情

xAxis: {
    labels: {
        //isPm() is a function that checks for am and pm of your timestamp
        format: '{value} ' + (isPm() ? "pm":"am")
    }
}

您还需要展示您是如何绘制图表的,以便了解最佳实施方式

【讨论】:

    【解决方案2】:

    您可以更改日期时间标签格式 (API):

    xAxis: {
        type: 'datetime',
        dateTimeLabelFormats: {
          millisecond: '%l:%M:%S.%L %P',
          second: '%l:%M:%S %P',
          minute: '%l:%M %P',
          hour: '%l:%M %P',
          day: '(%e. %b) %l:%M %P',
        }
    }
    

    this JSFiddle demonstration

    dateTimeLabelFormats 中设置的值是PHPs strftime 的子集。在这种情况下:

    • %l:12 小时格式的小时,单个数字前有一个空格。 1 到 12
    • %P:基于给定时间的小写“am”或“pm”。示例:上午 00:31,下午 22:23

    【讨论】:

    • 嗨@Halvor,我看到它的工作,但在我的情况下,我切换图表类型(线,列)取决于选定的过滤器。如何动态应用该选项。前任。 chart.series[0].setData({ pointStart: date_beginning_of_time_here, pointInterval: 3600 * 1000 * 3, // 3 小时 });但这没有用。
    • 嗨@aldrien.h,你需要使用update方法:api.highcharts.com/class-reference/Highcharts.Series#update
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多