可以通过图例隐藏带有 Amcharts 的列吗?
Hiding columns with Amcharts possible via legend?
我目前正在制作一个图表来显示我拥有的一些数据,我设置了一个图例,可以 show/not 在图表中显示某些值。但是,我想知道是否可以将相同的方法应用于图表的列。使用下面的代码 ;
<html>
<body>
<!-- Styles -->
<style>
#chartdiv {
width : 100%;
height : 500px;
font-size : 11px;
}
</style>
<!-- Resources -->
<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/plugins/export/export.min.js"></script>
<link rel="stylesheet" href="https://www.amcharts.com/lib/3/plugins/export/export.css" type="text/css" media="all" />
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>
<!-- Chart code -->
<script>
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"theme": "light",
"categoryField": "year",
"rotate": false,
"legend": {
"useGraphSettings": true
},
"startDuration": 1,
"categoryAxis": {
"gridPosition": "start",
"position": "left"
},
"trendLines": [],
"graphs": [
{
"balloonText": "Income:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-1",
"lineAlpha": 0.2,
"title": "Income",
"type": "column",
"valueField": "income"
},
{
"balloonText": "Expenses:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-2",
"lineAlpha": 0.2,
"title": "Expenses",
"type": "column",
"valueField": "expenses"
}
],
"guides": [],
"valueAxes": [
{
"id": "ValueAxis-1",
"position": "top",
"axisAlpha": 0
}
],
"allLabels": [],
"balloon": {},
"titles": [],
"dataProvider": [
{
"year": 2005,
"income": 23.5,
"expenses": 18.1
},
{
"year": 2006,
"income": 26.2,
"expenses": 22.8
},
{
"year": 2007,
"income": 30.1,
"expenses": 23.9
},
{
"year": 2008,
"income": 29.5,
"expenses": 25.1
},
{
"year": 2009,
"income": 24.6,
"expenses": 25
}
],
"export": {
"enabled": true
}
});
</script>
<!-- HTML -->
<div id="chartdiv"></div>
</body>
</html>
(基于聚类条形图示例)可以 (de)select 收入或支出,但是否也可以有 (de)select 单独的图例年?例如。完全隐藏 2006 而显示其他年份或仅显示 2005 和 2009。?
我环顾四周,发现 some discussions 与我遇到的问题相似,但它们与我正在寻找的问题并不完全匹配。
有什么想法吗?
这不能使用 amCharts 的图例来完成。相反,您应该更改 dataProvider 并刷新图表。
例如,如果您想从图表中隐藏 2007 年:
HTML
<button type="button" onclick="hideYear(2007)">hide 2007</button>
JS
var my_data = [
{
"year": 2005,
"income": 23.5,
"expenses": 18.1
},
{
"year": 2006,
"income": 26.2,
"expenses": 22.8
},
{
"year": 2007,
"income": 30.1,
"expenses": 23.9
},
{
// ...
}
];
// create your chart initially using all data
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"dataProvider": my_data,
// ...
});
function hideYear(year){
var new_dataprovider = [];
// loop over my_data
my_data.forEach(function(item){
if(item.year != year){
new_dataprovider.push(item);
}
});
// now that we have our new dataprovider
// excluding a certain year,
// update our chart
chart.dataProvider = new_dataprovider;
// validateData will refresh the chart
chart.validateData();
}
根据您的图表配置,这将完全隐藏 2007 年(从类别轴)。您可能不想遗漏数据项,而是希望将 "income" 和 "expenses" 字段设置为 null
,这样年份(类别)本身将保持可见。
希望这是有道理的。
感谢@Robbert 提供隐藏列的代码。我进一步解决了这个问题,现在您可以一次隐藏多个列,还可以使用选择菜单和两个按钮再次显示它们。完整代码在下面或可以在工作示例中找到 here.
<html>
<body>
<style>
#chartdiv {
width : 100%;
height : 500px;
font-size : 11px;
}
</style>
<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/plugins/export/export.min.js"></script>
<link rel="stylesheet" href="https://www.amcharts.com/lib/3/plugins/export/export.css" type="text/css" media="all" />
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>
<script>
var my_data = [
{
"year": 2005,
"income": 23.5,
"expenses": 18.1
},
{
"year": 2006,
"income": 26.2,
"expenses": 22.8
},
{
"year": 2007,
"income": 30.1,
"expenses": 23.9
},
{
"year": 2008,
"income": 26.1,
"expenses": 24.4
},
{
"year": 2009,
"income": 24.1,
"expenses": 23.7
}
];
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"theme": "light",
"categoryField": "year",
"rotate": false,
"legend": {
"useGraphSettings": true
},
"startDuration": 1,
"categoryAxis": {
"gridPosition": "start",
"position": "left"
},
"trendLines": [],
"graphs": [
{
"balloonText": "Income:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-1",
"lineAlpha": 0.2,
"title": "Income",
"type": "column",
"valueField": "income"
},
{
"balloonText": "Expenses:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-2",
"lineAlpha": 0.2,
"title": "Expenses",
"type": "column",
"valueField": "expenses"
}
],
"guides": [],
"valueAxes": [
{
"id": "ValueAxis-1",
"position": "top",
"axisAlpha": 0
}
],
"allLabels": [],
"balloon": {},
"titles": [],
"dataProvider": my_data,
"export": {
"enabled": true
}
});
var hiddenYears = [];
function hideYear(){
var selection = document.getElementById("yearSelection");
var selectedYear = Number(selection.options[selection.selectedIndex].value);
hiddenYears.push(selectedYear);
var new_dataprovider = [];
// loop over my_data
my_data.forEach(function(item){
if(!hiddenYears.includes(item.year)){
new_dataprovider.push(item);
}
});
// now that we have our new dataprovider
// excluding a certain year,
// update our chart
chart.dataProvider = new_dataprovider;
// validateData will refresh the chart
chart.validateData();
}
function showYear(){
var selection = document.getElementById("yearSelection");
var selectedYear = Number(selection.options[selection.selectedIndex].value);
var index = hiddenYears.indexOf(selectedYear);
if (index > -1) {
hiddenYears.splice(index, 1);
}
var new_dataprovider = [];
my_data.forEach(function(item){
if(!hiddenYears.includes(item.year)){
new_dataprovider.push(item);
}
});
// now that we have our new dataprovider
// excluding a certain year,
// update our chart
chart.dataProvider = new_dataprovider;
// validateData will refresh the chart
chart.validateData();
}
</script>
<div id="chartdiv"></div>
<select id="yearSelection">
<option>Select a year</option>
</select>
<script>
var select = document.getElementById("yearSelection");
var options = [2005, 2006, 2007, 2008, 2009];
for(var i = 0; i < options.length; i++) {
var opt = options[i];
var el = document.createElement("option");
el.textContent = opt;
el.value = opt;
select.appendChild(el);
}
</script>
<button type="button" onclick="hideYear(document.getElementById('yearSelection'))">Hide</button>
<button type="button" onclick="showYear(document.getElementById('yearSelection'))">Show</button>
</body>
</html>
我目前正在制作一个图表来显示我拥有的一些数据,我设置了一个图例,可以 show/not 在图表中显示某些值。但是,我想知道是否可以将相同的方法应用于图表的列。使用下面的代码 ;
<html>
<body>
<!-- Styles -->
<style>
#chartdiv {
width : 100%;
height : 500px;
font-size : 11px;
}
</style>
<!-- Resources -->
<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/plugins/export/export.min.js"></script>
<link rel="stylesheet" href="https://www.amcharts.com/lib/3/plugins/export/export.css" type="text/css" media="all" />
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>
<!-- Chart code -->
<script>
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"theme": "light",
"categoryField": "year",
"rotate": false,
"legend": {
"useGraphSettings": true
},
"startDuration": 1,
"categoryAxis": {
"gridPosition": "start",
"position": "left"
},
"trendLines": [],
"graphs": [
{
"balloonText": "Income:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-1",
"lineAlpha": 0.2,
"title": "Income",
"type": "column",
"valueField": "income"
},
{
"balloonText": "Expenses:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-2",
"lineAlpha": 0.2,
"title": "Expenses",
"type": "column",
"valueField": "expenses"
}
],
"guides": [],
"valueAxes": [
{
"id": "ValueAxis-1",
"position": "top",
"axisAlpha": 0
}
],
"allLabels": [],
"balloon": {},
"titles": [],
"dataProvider": [
{
"year": 2005,
"income": 23.5,
"expenses": 18.1
},
{
"year": 2006,
"income": 26.2,
"expenses": 22.8
},
{
"year": 2007,
"income": 30.1,
"expenses": 23.9
},
{
"year": 2008,
"income": 29.5,
"expenses": 25.1
},
{
"year": 2009,
"income": 24.6,
"expenses": 25
}
],
"export": {
"enabled": true
}
});
</script>
<!-- HTML -->
<div id="chartdiv"></div>
</body>
</html>
(基于聚类条形图示例)可以 (de)select 收入或支出,但是否也可以有 (de)select 单独的图例年?例如。完全隐藏 2006 而显示其他年份或仅显示 2005 和 2009。?
我环顾四周,发现 some discussions 与我遇到的问题相似,但它们与我正在寻找的问题并不完全匹配。
有什么想法吗?
这不能使用 amCharts 的图例来完成。相反,您应该更改 dataProvider 并刷新图表。
例如,如果您想从图表中隐藏 2007 年:
HTML
<button type="button" onclick="hideYear(2007)">hide 2007</button>
JS
var my_data = [
{
"year": 2005,
"income": 23.5,
"expenses": 18.1
},
{
"year": 2006,
"income": 26.2,
"expenses": 22.8
},
{
"year": 2007,
"income": 30.1,
"expenses": 23.9
},
{
// ...
}
];
// create your chart initially using all data
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"dataProvider": my_data,
// ...
});
function hideYear(year){
var new_dataprovider = [];
// loop over my_data
my_data.forEach(function(item){
if(item.year != year){
new_dataprovider.push(item);
}
});
// now that we have our new dataprovider
// excluding a certain year,
// update our chart
chart.dataProvider = new_dataprovider;
// validateData will refresh the chart
chart.validateData();
}
根据您的图表配置,这将完全隐藏 2007 年(从类别轴)。您可能不想遗漏数据项,而是希望将 "income" 和 "expenses" 字段设置为 null
,这样年份(类别)本身将保持可见。
希望这是有道理的。
感谢@Robbert 提供隐藏列的代码。我进一步解决了这个问题,现在您可以一次隐藏多个列,还可以使用选择菜单和两个按钮再次显示它们。完整代码在下面或可以在工作示例中找到 here.
<html>
<body>
<style>
#chartdiv {
width : 100%;
height : 500px;
font-size : 11px;
}
</style>
<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/plugins/export/export.min.js"></script>
<link rel="stylesheet" href="https://www.amcharts.com/lib/3/plugins/export/export.css" type="text/css" media="all" />
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>
<script>
var my_data = [
{
"year": 2005,
"income": 23.5,
"expenses": 18.1
},
{
"year": 2006,
"income": 26.2,
"expenses": 22.8
},
{
"year": 2007,
"income": 30.1,
"expenses": 23.9
},
{
"year": 2008,
"income": 26.1,
"expenses": 24.4
},
{
"year": 2009,
"income": 24.1,
"expenses": 23.7
}
];
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"theme": "light",
"categoryField": "year",
"rotate": false,
"legend": {
"useGraphSettings": true
},
"startDuration": 1,
"categoryAxis": {
"gridPosition": "start",
"position": "left"
},
"trendLines": [],
"graphs": [
{
"balloonText": "Income:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-1",
"lineAlpha": 0.2,
"title": "Income",
"type": "column",
"valueField": "income"
},
{
"balloonText": "Expenses:[[value]]",
"fillAlphas": 0.8,
"id": "AmGraph-2",
"lineAlpha": 0.2,
"title": "Expenses",
"type": "column",
"valueField": "expenses"
}
],
"guides": [],
"valueAxes": [
{
"id": "ValueAxis-1",
"position": "top",
"axisAlpha": 0
}
],
"allLabels": [],
"balloon": {},
"titles": [],
"dataProvider": my_data,
"export": {
"enabled": true
}
});
var hiddenYears = [];
function hideYear(){
var selection = document.getElementById("yearSelection");
var selectedYear = Number(selection.options[selection.selectedIndex].value);
hiddenYears.push(selectedYear);
var new_dataprovider = [];
// loop over my_data
my_data.forEach(function(item){
if(!hiddenYears.includes(item.year)){
new_dataprovider.push(item);
}
});
// now that we have our new dataprovider
// excluding a certain year,
// update our chart
chart.dataProvider = new_dataprovider;
// validateData will refresh the chart
chart.validateData();
}
function showYear(){
var selection = document.getElementById("yearSelection");
var selectedYear = Number(selection.options[selection.selectedIndex].value);
var index = hiddenYears.indexOf(selectedYear);
if (index > -1) {
hiddenYears.splice(index, 1);
}
var new_dataprovider = [];
my_data.forEach(function(item){
if(!hiddenYears.includes(item.year)){
new_dataprovider.push(item);
}
});
// now that we have our new dataprovider
// excluding a certain year,
// update our chart
chart.dataProvider = new_dataprovider;
// validateData will refresh the chart
chart.validateData();
}
</script>
<div id="chartdiv"></div>
<select id="yearSelection">
<option>Select a year</option>
</select>
<script>
var select = document.getElementById("yearSelection");
var options = [2005, 2006, 2007, 2008, 2009];
for(var i = 0; i < options.length; i++) {
var opt = options[i];
var el = document.createElement("option");
el.textContent = opt;
el.value = opt;
select.appendChild(el);
}
</script>
<button type="button" onclick="hideYear(document.getElementById('yearSelection'))">Hide</button>
<button type="button" onclick="showYear(document.getElementById('yearSelection'))">Show</button>
</body>
</html>