javascript - AmChart : hide event

标签 javascript jquery amcharts

我正在使用 amChart使用插件 dataLoader加载数据和事件数据,所以我有这样的东西:

var defaultStockChartData = {
  "dataLoader": {
    "url": "urlToMyFile.csv",
    "format": "csv",
    "delimiter": ",",
    "useColumnNames": true
  },

  /**
   * data loader for events data
   */
  "eventDataLoader": {
    "url": urlToMyFile.scv,
    "async": true,
    "postProcess": function(data) {
      for (var x in data) {
        var color = "#85CDE6";
        switch (data[x].Type) {
          case 'A':
            color = "#85CDE6";
            break;
          case 'B':
            color = "#85C56E6";
            break;
          default:
            color = "#cccccc";
            break;
        }
        data[x] = {
          "type": "pin",
          "graph": "g1",
          "backgroundColor": color,
          "date": data[x].Date,
          "text": data[x].Type,
          "description": data[x].Description
        };
      }
      return data;
    }
  }
  ...
}

现在我需要做的是一个复选框,它在选中时显示图形上所有类型为“A”的事件,并在未选中时隐藏所有类型为“A”的事件。

我怎样才能访问我图表的事件并按照它们的类型隐藏它们?

最佳答案

更好的方法是直接修改事件数据并将每个元素的 graph 属性切换为 null 或原始图形以显示/隐藏它们,这样您就不必绕过图表的项目符号处理缩放和其他事件。例如:

HTML:

<div>
  <label>Hide Event A <input type="checkbox" class="hide-event" data-event="A"></label>
  <label>Hide Event B <input type="checkbox" class="hide-event" data-event="B"></label>
</div>

JS:

//show/hide events based on selected checkbox
Array.prototype.forEach.call(
  document.querySelectorAll('.hide-event'),
  function(checkbox) {
    checkbox.addEventListener('change', function() {
      var event = checkbox.dataset.event;
      chart.dataSets[0].stockEvents.forEach(function(eventItem) {
        if (eventItem.text === event) {
          if (checkbox.checked) {
            //copy graph reference to a dummy value and null out the original graph
            eventItem.oldGraph = eventItem.graph;
            eventItem.graph = null;
          }
          else {
            //restore original graph and null out copy/dummy reference
            eventItem.graph = eventItem.oldGraph;
            eventItem.oldGraph = null;
          }
        }
      });
      chart.validateData(); //redraw the chart
    });
  }
);

完整演示如下:

var chartData = [];
var eventData = [];
generateChartData();

//show/hide events based on selected checkbox
Array.prototype.forEach.call(
  document.querySelectorAll('.hide-event'),
  function(checkbox) {
    checkbox.addEventListener('change', function() {
      var event = checkbox.dataset.event;
      chart.dataSets[0].stockEvents.forEach(function(eventItem) {
        if (eventItem.text === event) {
          if (checkbox.checked) {
            //copy graph reference to a dummy value and null out the original graph
            eventItem.oldGraph = eventItem.graph;
            eventItem.graph = null;
          }
          else {
            //restore original graph and null out copy/dummy reference
            eventItem.graph = eventItem.oldGraph;
            eventItem.oldGraph = null;
          }
        }
      });
      chart.validateData(); //redraw the chart
    });
  }
);

function generateChartData() {
  var firstDate = new Date( 2012, 0, 1 );
  firstDate.setDate( firstDate.getDate() - 500 );
  firstDate.setHours( 0, 0, 0, 0 );

  for ( var i = 0; i < 500; i++ ) {
    var newDate = new Date( firstDate );
    newDate.setDate( newDate.getDate() + i );

    var a = Math.round( Math.random() * ( 40 + i ) ) + 100 + i;
    var b = Math.round( Math.random() * 100000000 );

    chartData.push( {
      "date": newDate,
      "value": a,
      "volume": b
    } );
    if ((i + 1) % 8 === 0) {
      eventData.push({
        "date": newDate,
        "type": "sign",
        "backgroundColor": "#85CDE6",
        "graph": "g1",
        "text": (i + 1) % 5 == 0 ? "B" : "A",
        "description": "Event " + ((i + 1) % 5 == 0 ? "B" : "A") + " at index " + i
      })
    }
  }
}

var chart = AmCharts.makeChart( "chartdiv", {
  "type": "stock",
  "theme": "light",
  "dataSets": [ {
    "color": "#b0de09",
    "fieldMappings": [ {
      "fromField": "value",
      "toField": "value"
    }, {
      "fromField": "volume",
      "toField": "volume"
    } ],
    "dataProvider": chartData,
    "categoryField": "date",
    // EVENTS
    "stockEvents": eventData
  } ],


  "panels": [ {
    "title": "Value",
    "stockGraphs": [ {
      "id": "g1",
      "valueField": "value"
    } ],
    "stockLegend": {
      "valueTextRegular": " ",
      "markerType": "none"
    }
  } ],

  "chartScrollbarSettings": {
    "graph": "g1"
  },

  "chartCursorSettings": {
    "valueBalloonsEnabled": true,
    "graphBulletSize": 1,
    "valueLineBalloonEnabled": true,
    "valueLineEnabled": true,
    "valueLineAlpha": 0.5
  }
} );
#chartdiv {
  width: 100%;
  height: 500px;
}
<script src="https://www.amcharts.com/lib/3/amcharts.js"></script>
<script src="https://www.amcharts.com/lib/3/serial.js"></script>
<script src="https://www.amcharts.com/lib/3/amstock.js"></script>
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>
<div>
  <label>Hide Event A <input type="checkbox" class="hide-event" data-event="A"></label>
  <label>Hide Event B <input type="checkbox" class="hide-event" data-event="B"></label>
</div>
<div id="chartdiv"></div>												

关于javascript - AmChart : hide event,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53189618/

相关文章:

javascript - 根据数据属性选择被点击的元素

amcharts - AmCharts.makeChart 和 new AmCharts.AmSerialChart(); 有什么区别

javascript - 如何在 Amcharts 中显示基础数据范围之外的股票事件?

javascript - 将 JSON 信息获取到 Material-UI 对话框

javascript - 在背景 div 上单击打开新窗口

javascript - 如何使用 jQuery 单击按钮时显示幻灯片?

javascript - 如果验证错误,则不允许提交 ajax url

javascript - 如何给已有的js代码添加淡入淡出效果

javascript - 如何在 IIFE 中使用 es6 导入?

amcharts - Amcharts 中轴的组类别