【问题标题】:Highcharts : selectionHighcharts : 选择
【发布时间】:2016-07-18 13:18:51
【问题描述】:

我制作了一个带有日期的条形图。目前,要删除日期,您必须单击图例中的日期。我希望一次删除多个日期。 让我们举个例子。我的日期范围从 1960 年到 2015 年。如果我的图表上有 2000 年到 2005 年的日期,那么我希望如果您单击 1960 年和 1999 年,那么之间的所有日期都将被删除/隐藏。很多日期时它会更快。 怎么办?

这是我的代码:

$(function () {
    $('#container').highcharts({
        chart: {
            type: 'column'
        },
        colors:[
            '#7cb5ec',
            '#434348',
            '#90ed7d',
            '#f7a35c',
            '#8085e9',
            '#f15c80',
            '#e4d354',
            '#2b908f',
            '#f45b5b',
            '#91e8e1',
            '#DA70D6',
            '#1E90FF',
            '#E0F000'
            ],
        legend:{
            itemStyle:{
            fontSize:'10px',
            font:'10pt',
            color:'#000000'
          }
        },
        title:{
            style:{
                fontSize:'0px'
           }
        },
        subtitle:{
            style:{
            fontSize:'0px'
          }
        },
        xAxis: {
            categories: [
                '',
            ],
        },
        yAxis: {
            min: 15,
            title: {
                text: 'Number',
                style:{
                    fontSize:'0px'
                }
            }
        },
        tooltip: {        
            shared: false,
            useHTML: true
        },
        plotOptions: {
            column: {
                pointPadding: 0.2,
                borderWidth: 0
            }
        },
        series: [{
            name: '2004',
            data: [49.9],

        }, 
        {
            name: '2005',
            data: [83.6]

        }, 
        {
            name: '2006',
            data: [48.9]

        }, 
        {
            name: '2007',
            data: [69.1]

        }, 
        {
            name: '2008',
            data: [83.6]

        }, 
        {
            name: '2009',
            data: [40.9]

        },
        {
            name: '2010',
            data: [69.9]

        }, 
        {
            name: '2011',
            data: [83]

        }, 
        {
            name: '2012',
            data: [28.9]

        },
        {
            name: '2013',
            data: [40.9]

        }, 
        {
            name: '2014',
            data: [81.6]

        }, 
        {
            name: '2015',
            data: [24.9]

        },
        {
            name: '2016',
            data: [46.4]

        }]
    });
});

谢谢

【问题讨论】:

  • 我认为您可以在图表中使用 legendItemClick。请参阅此示例:jsfiddle.net/u3cvfgLq/28
  • 是否可以同时选择条形“限制”(例如,如果您单击 2010 和 2012,删除 3 个日期,而不仅仅是 2011)?同样,是否可以同时选择多个曲目(例如2005-2007和2010-2013)?
  • 这是可能的,但我不确定在这种情况下单击图例是否是最好的主意。在这里你可以看到一个例子:jsfiddle.net/u3cvfgLq/29
  • 这就是我问的原因,谢谢。当然,我更喜欢 Mike Zavarello 给我的下面的方法。对于大量的术语来说更方便。谢谢

标签: highcharts


【解决方案1】:

我建议您将年份作为 x 轴中的值(作为类别)而不是每年都作为自己的系列,然后使用 Highcharts 的原生缩放功能来允许用户选择特定的日期范围.

我已经更新了您的小提琴并进行了一些更改,我将在下面解释:https://jsfiddle.net/brightmatrix/hr28s27L/

首先,在您的chart 选项中,我添加了zoomType: 'x' 以允许用户使用鼠标放大特定年份。 x 的值意味着它们只能水平(横向)缩放,这使得交互更加“清晰”。

chart: {
  type: 'column',
  zoomType: 'x'
},

其次,我用年份作为类别/值更新了您的 x 轴:

xAxis: {
  categories: ['2004','2005','2006','2007','2008','2009','2010','2011','2012','2013','2014','2015','2016']
},

最后,我更新了您的系列以仅显示数据点,然后将其绘制在 y 轴上:

series: [{
  name: 'data by year',
  data: [49.9,83.6,48.9,69.1,83.6,40.9,69.9,83,28.9,40.9,81.6,24.9,46.4]
}]

当用户单击并拖动鼠标光标时会发生以下情况:

阴影框是他们选择的。一旦他们释放光标,图表将自动调整以仅显示他们选择的内容。右上角会出现一个“重置缩放”按钮,让他们可以回到所有年份:

更新(2016 年 7 月 19 日):我做了一些研究,想在此图表中添加一个简单的滑块元素,让用户可以从一系列年份中进行选择。

可以在这里找到我的小提琴的更新版本,它显示了这个带有滑块的示例图表:https://jsfiddle.net/brightmatrix/uvat8u05/

处理滑块的代码如下所示。我发现使用parseInt() 函数将滑块值显式设置为整数解决了几个问题:

  • 您可以正确比较滑块值,以确保用户不能选择早于开始年份的结束年份。
  • 当用户选择相同的开始和结束年份时,setExtremes() 函数会正确显示单个年份。
  • 始终显示所有 x 轴标签。在我添加parseInt() 之前,当用户在滑块中选择不同的值时,一些标签会消失。

请务必阅读我在 HTML 和 Javascript 窗格中留下的 cmets,因为我已包含有关我做出某些代码决策的原因的更多详细信息。

// on change handler for both sliders
$('.mySlider').bind('change', function(e) {

    e.preventDefault();
    var chart = $('#container').highcharts();

    // convert the slider values to integers to make sure setExtremes() works as expected
    var slider1Val = parseInt($('input[name="slider1"]').val());
    var slider2Val = parseInt($('input[name="slider2"]').val());

    if (slider2Val < slider1Val) {
        // warn the user if they try to choose an end year that is later than the start year
        alert("You can't choose an end year that is earlier than your start year.");
    } else {
        // use setExtremes to set the x-axis ranges based on the values in the sliders
        chart.xAxis[0].setExtremes(slider1Val, slider2Val);
    }

});

希望这些信息对您有所帮助。

【讨论】:

  • 这个解决方案很棒!但是当我们缩放时,我们可以只显示选定的日期吗?例如,如果选择 1960 和 1961,则显示年份 1960、1961、1962、1963、1964 和 1965。是否可以只显示 1960 和 1961?
  • 当然!用户所做的只是将光标拖到这些列上。现在,如果您的图表将有很多年(我会说,超过 10 年),我可以为您指出另一个演示。
  • 是的,在我的图表上大约有 40 年。请您帮忙确保只显示选定的年份吗?
  • @Lucile 我制作了一个不同版本的小提琴,其中包括一些简单的滑块元素。请务必阅读该小提琴中的 cmets,了解有关我如何完成这项工作的一些详细信息。
  • 我阅读了 cmets,但我不知道如何。我认为一切都在第 44 行播放。例如,对于光标,如果两个光标的值相同,则图表显示仍然是两年,而不仅仅是选定的。请问这个怎么改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多