AmChart:隐藏事件

时间:2018-11-07 12:36:25

标签: javascript jquery amcharts

我正在将amChart与插件dataLoader配合使用来加载数据和eventData,所以我有这样的东西:

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'的事件。

如何访问图表中的事件并按照其类型隐藏它们?

2 个答案:

答案 0 :(得分:1)

一种更好的方法是直接修改事件数据,并将每个元素的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>												

答案 1 :(得分:0)

我没有找到使用AmChart的方法,所以我用javascript做到了(不是按类型,而是只需要检查值)

首先,我需要此功能:

function hideShowGraphEvent()
    {
        if($("#chxEventA").prop("checked")) 
        {
            $("g.amcharts-graph-bullet").show();
        }
        else
        {
            $("g.amcharts-graph-bullet").hide();
        }
    }

并在每次选中或取消选中此框时调用它:

$("#chxEventA").change(function() 
    {
        hideShowGraphEvent();
    });

但是,如果您像我一样使用zoom,它将在缩放时停止工作,因此您需要在每次缩放时调用该函数:

 "listeners" : [
            {
                "event": "zoomed",
                "method": function()
                {
                    hideShowGraphEvent();
                }
            },
...
]