试图合并两个 amcharts 图,但出现 "Data fields for series are not properly defined." 错误
Trying to combine two amcharts graphs, but getting "Data fields for series are not properly defined." error
我正在尝试将两张 amcharts 图表合并为一张,包括滑块。但我收到“未正确定义系列的数据字段”。错误。
这些是每个图表的单独 fiddle 代码。
这就是我想要实现的。
这是我的代码:
am4core.useTheme(am4themes_animated);
// Themes end
var chart = am4core.create("chartdiv", am4charts.XYChart);
chart.hiddenState.properties.opacity = 0; // this creates initial fade-in
chart.paddingRight = 30;
chart.dateFormatter.inputDateFormat = "mm:ss";
var colorSetAgent = new am4core.ColorSet();
colorSetAgent.saturation = 0.4;
var colorSetCustomer = new am4core.ColorSet();
colorSetCustomer.saturation = 0.4;
chart.data = [ {
"category": "Module #1",
"start": "0",
"end": "10",
"color": colorSetAgent.getIndex(2),
"task": "Agent",
"value": 4500
}, {
"category": "Module #1",
"start": "12",
"end": "17",
"color": colorSetCustomer.getIndex(1),
"task": "Customer",
"value": 2690
}, {
"category": "Module #1",
"start": "25",
"end": "38",
"color": colorSetAgent.getIndex(2),
"task": "Agent",
"value": 3370
}, {
"category": "Module #1",
"start": "42",
"end": "50",
"color": colorSetCustomer.getIndex(1),
"task": "Customer",
"value": 4510
}];
chart.dateFormatter.dateFormat = "ss";
chart.dateFormatter.inputDateFormat = "ss";
var categoryAxis = chart.yAxes.push(new am4charts.CategoryAxis());
categoryAxis.dataFields.category = "category";
categoryAxis.renderer.grid.template.location = 0;
categoryAxis.renderer.inversed = true;
var dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.renderer.minGridDistance = 70;
dateAxis.baseInterval = { count: 1, timeUnit: "second" };
dateAxis.renderer.tooltipLocation = 0;
var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
function createSeries(field, name) {
var series = chart.series.push(new am4charts.LineSeries());
series.dataFields.valueY = field;
series.dataFields.dateX = "end";
series.name = name;
series.tooltipText = "{dateX}: [b]{valueY}[/]";
series.strokeWidth = 2;
var bullet = series.bullets.push(new am4charts.CircleBullet());
bullet.circle.stroke = am4core.color("#fff");
bullet.circle.strokeWidth = 2;
}
createSeries("value", "Series #1");
chart.cursor = new am4charts.XYCursor();
var series1 = chart.series.push(new am4charts.ColumnSeries());
series1.columns.template.height = am4core.percent(70);
series1.columns.template.tooltipText = "{task}";
series1.dataFields.openDateX = "start";
series1.dataFields.dateX = "end";
series1.dataFields.categoryY = "category";
series1.columns.template.propertyFields.fill = "color"; // get color from data
series1.columns.template.propertyFields.stroke = "color";
series1.columns.template.strokeOpacity = 1;
chart.scrollbarX = new am4core.Scrollbar();
这是我的 fiddle,但我收到“系列的数据字段未正确定义。”错误。请在这里帮助我。
更新:经过kelvin的建议,我没有再报错了,但是现在两个图表都整合到了一个图表中。像这样:
已更新JSFIDDLE
更新:现在,在 kelvin 提供的 demo link 之后,我的图表如下所示:
更新JSFIDDLE
尝试添加 series.yAxis = valueAxis;到你的 createSeries()
添加这个以供将来参考。
// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end
var chart = am4core.create("chartdiv", am4charts.XYChart);
var data = [];
var price = 100;
var quantity = 1000;
for (var i = 0; i < 300; i++) {
price += Math.round((Math.random() < 0.5 ? 1 : -1) * Math.random() * 100);
quantity += Math.round((Math.random() < 0.5 ? 1 : -1) * Math.random() * 1000);
data.push({ date: new Date(2000, 1, i), price: price, quantity: quantity });
}
var interfaceColors = new am4core.InterfaceColorSet();
chart.data = data;
// the following line makes value axes to be arranged vertically.
chart.leftAxesContainer.layout = "vertical";
// uncomment this line if you want to change order of axes
//chart.bottomAxesContainer.reverseOrder = true;
var dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.renderer.grid.template.location = 0;
dateAxis.renderer.ticks.template.length = 8;
dateAxis.renderer.ticks.template.strokeOpacity = 0.1;
//dateAxis.renderer.grid.template.disabled = true;
dateAxis.renderer.ticks.template.disabled = false;
dateAxis.renderer.ticks.template.strokeOpacity = 0.2;
chart.leftAxesContainer.pixelPerfect = true;
dateAxis.pixelPerfect = true;
dateAxis.renderer.pixelPerfect = true;
dateAxis.renderer.gridContainer.layout = "absolute";
// these two lines makes the axis to be initially zoomed-in
//dateAxis.start = 0.7;
//dateAxis.keepSelection = true;
var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.tooltip.disabled = true;
valueAxis.zIndex = 1;
valueAxis.renderer.baseGrid.disabled = true;
// height of axis
valueAxis.height = am4core.percent(60);
valueAxis.renderer.inside = true;
valueAxis.renderer.labels.template.verticalCenter = "bottom";
valueAxis.renderer.labels.template.padding(2,2,2,2);
//valueAxis.renderer.maxLabelPosition = 0.95;
valueAxis.renderer.fontSize = "0.8em"
// uncomment these lines to fill plot area of this axis with some color
valueAxis.renderer.gridContainer.background.fill = interfaceColors.getFor("alternativeBackground");
valueAxis.renderer.gridContainer.background.fillOpacity = 0.05;
var series = chart.series.push(new am4charts.LineSeries());
series.dataFields.dateX = "date";
series.dataFields.valueY = "price";
series.tooltipText = "{valueY.value}";
series.name = "Series 1";
var valueAxis2 = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis2.tooltip.disabled = true;
// height of axis
valueAxis2.height = am4core.percent(40);
valueAxis2.zIndex = 3
// this makes gap between panels
valueAxis2.marginTop = 30;
valueAxis2.renderer.baseGrid.disabled = true;
valueAxis2.renderer.inside = true;
valueAxis2.renderer.labels.template.verticalCenter = "bottom";
valueAxis2.renderer.labels.template.padding(2,2,2,2);
//valueAxis2.renderer.maxLabelPosition = 0.95;
valueAxis2.renderer.fontSize = "0.8em"
// uncomment these lines to fill plot area of this axis with some color
valueAxis2.renderer.gridContainer.background.fill = interfaceColors.getFor("alternativeBackground");
valueAxis2.renderer.gridContainer.background.fillOpacity = 0.05;
var series2 = chart.series.push(new am4charts.ColumnSeries());
series2.columns.template.width = am4core.percent(50);
series2.dataFields.dateX = "date";
series2.dataFields.valueY = "quantity";
series2.yAxis = valueAxis2;
series2.tooltipText = "{valueY.value}";
series2.name = "Series 2";
chart.cursor = new am4charts.XYCursor();
chart.cursor.xAxis = dateAxis;
var scrollbarX = new am4charts.XYChartScrollbar();
scrollbarX.series.push(series);
scrollbarX.marginBottom = 20;
chart.scrollbarX = scrollbarX;
let rectangle = chart.plotContainer.createChild(am4core.Rectangle)
rectangle.fillOpacity = 1;
rectangle.width = am4core.percent(100);
rectangle.fill = am4core.color("#ffffff")
rectangle.isMeasured = false;
rectangle.height = 29;
rectangle.zIndex = 1000;
valueAxis2.events.on("positionchanged", function(){
rectangle.y = valueAxis2.pixelY - rectangle.pixelHeight - 1;
})
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
#chartdiv {
width: 100%;
height: 600px;
}
<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>
<div id="chartdiv"></div>
我正在尝试将两张 amcharts 图表合并为一张,包括滑块。但我收到“未正确定义系列的数据字段”。错误。
这些是每个图表的单独 fiddle 代码。
这就是我想要实现的。
这是我的代码:
am4core.useTheme(am4themes_animated);
// Themes end
var chart = am4core.create("chartdiv", am4charts.XYChart);
chart.hiddenState.properties.opacity = 0; // this creates initial fade-in
chart.paddingRight = 30;
chart.dateFormatter.inputDateFormat = "mm:ss";
var colorSetAgent = new am4core.ColorSet();
colorSetAgent.saturation = 0.4;
var colorSetCustomer = new am4core.ColorSet();
colorSetCustomer.saturation = 0.4;
chart.data = [ {
"category": "Module #1",
"start": "0",
"end": "10",
"color": colorSetAgent.getIndex(2),
"task": "Agent",
"value": 4500
}, {
"category": "Module #1",
"start": "12",
"end": "17",
"color": colorSetCustomer.getIndex(1),
"task": "Customer",
"value": 2690
}, {
"category": "Module #1",
"start": "25",
"end": "38",
"color": colorSetAgent.getIndex(2),
"task": "Agent",
"value": 3370
}, {
"category": "Module #1",
"start": "42",
"end": "50",
"color": colorSetCustomer.getIndex(1),
"task": "Customer",
"value": 4510
}];
chart.dateFormatter.dateFormat = "ss";
chart.dateFormatter.inputDateFormat = "ss";
var categoryAxis = chart.yAxes.push(new am4charts.CategoryAxis());
categoryAxis.dataFields.category = "category";
categoryAxis.renderer.grid.template.location = 0;
categoryAxis.renderer.inversed = true;
var dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.renderer.minGridDistance = 70;
dateAxis.baseInterval = { count: 1, timeUnit: "second" };
dateAxis.renderer.tooltipLocation = 0;
var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
function createSeries(field, name) {
var series = chart.series.push(new am4charts.LineSeries());
series.dataFields.valueY = field;
series.dataFields.dateX = "end";
series.name = name;
series.tooltipText = "{dateX}: [b]{valueY}[/]";
series.strokeWidth = 2;
var bullet = series.bullets.push(new am4charts.CircleBullet());
bullet.circle.stroke = am4core.color("#fff");
bullet.circle.strokeWidth = 2;
}
createSeries("value", "Series #1");
chart.cursor = new am4charts.XYCursor();
var series1 = chart.series.push(new am4charts.ColumnSeries());
series1.columns.template.height = am4core.percent(70);
series1.columns.template.tooltipText = "{task}";
series1.dataFields.openDateX = "start";
series1.dataFields.dateX = "end";
series1.dataFields.categoryY = "category";
series1.columns.template.propertyFields.fill = "color"; // get color from data
series1.columns.template.propertyFields.stroke = "color";
series1.columns.template.strokeOpacity = 1;
chart.scrollbarX = new am4core.Scrollbar();
这是我的 fiddle,但我收到“系列的数据字段未正确定义。”错误。请在这里帮助我。
更新:经过kelvin的建议,我没有再报错了,但是现在两个图表都整合到了一个图表中。像这样:
已更新JSFIDDLE
更新:现在,在 kelvin 提供的 demo link 之后,我的图表如下所示:
更新JSFIDDLE
尝试添加 series.yAxis = valueAxis;到你的 createSeries()
添加这个以供将来参考。
// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end
var chart = am4core.create("chartdiv", am4charts.XYChart);
var data = [];
var price = 100;
var quantity = 1000;
for (var i = 0; i < 300; i++) {
price += Math.round((Math.random() < 0.5 ? 1 : -1) * Math.random() * 100);
quantity += Math.round((Math.random() < 0.5 ? 1 : -1) * Math.random() * 1000);
data.push({ date: new Date(2000, 1, i), price: price, quantity: quantity });
}
var interfaceColors = new am4core.InterfaceColorSet();
chart.data = data;
// the following line makes value axes to be arranged vertically.
chart.leftAxesContainer.layout = "vertical";
// uncomment this line if you want to change order of axes
//chart.bottomAxesContainer.reverseOrder = true;
var dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.renderer.grid.template.location = 0;
dateAxis.renderer.ticks.template.length = 8;
dateAxis.renderer.ticks.template.strokeOpacity = 0.1;
//dateAxis.renderer.grid.template.disabled = true;
dateAxis.renderer.ticks.template.disabled = false;
dateAxis.renderer.ticks.template.strokeOpacity = 0.2;
chart.leftAxesContainer.pixelPerfect = true;
dateAxis.pixelPerfect = true;
dateAxis.renderer.pixelPerfect = true;
dateAxis.renderer.gridContainer.layout = "absolute";
// these two lines makes the axis to be initially zoomed-in
//dateAxis.start = 0.7;
//dateAxis.keepSelection = true;
var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.tooltip.disabled = true;
valueAxis.zIndex = 1;
valueAxis.renderer.baseGrid.disabled = true;
// height of axis
valueAxis.height = am4core.percent(60);
valueAxis.renderer.inside = true;
valueAxis.renderer.labels.template.verticalCenter = "bottom";
valueAxis.renderer.labels.template.padding(2,2,2,2);
//valueAxis.renderer.maxLabelPosition = 0.95;
valueAxis.renderer.fontSize = "0.8em"
// uncomment these lines to fill plot area of this axis with some color
valueAxis.renderer.gridContainer.background.fill = interfaceColors.getFor("alternativeBackground");
valueAxis.renderer.gridContainer.background.fillOpacity = 0.05;
var series = chart.series.push(new am4charts.LineSeries());
series.dataFields.dateX = "date";
series.dataFields.valueY = "price";
series.tooltipText = "{valueY.value}";
series.name = "Series 1";
var valueAxis2 = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis2.tooltip.disabled = true;
// height of axis
valueAxis2.height = am4core.percent(40);
valueAxis2.zIndex = 3
// this makes gap between panels
valueAxis2.marginTop = 30;
valueAxis2.renderer.baseGrid.disabled = true;
valueAxis2.renderer.inside = true;
valueAxis2.renderer.labels.template.verticalCenter = "bottom";
valueAxis2.renderer.labels.template.padding(2,2,2,2);
//valueAxis2.renderer.maxLabelPosition = 0.95;
valueAxis2.renderer.fontSize = "0.8em"
// uncomment these lines to fill plot area of this axis with some color
valueAxis2.renderer.gridContainer.background.fill = interfaceColors.getFor("alternativeBackground");
valueAxis2.renderer.gridContainer.background.fillOpacity = 0.05;
var series2 = chart.series.push(new am4charts.ColumnSeries());
series2.columns.template.width = am4core.percent(50);
series2.dataFields.dateX = "date";
series2.dataFields.valueY = "quantity";
series2.yAxis = valueAxis2;
series2.tooltipText = "{valueY.value}";
series2.name = "Series 2";
chart.cursor = new am4charts.XYCursor();
chart.cursor.xAxis = dateAxis;
var scrollbarX = new am4charts.XYChartScrollbar();
scrollbarX.series.push(series);
scrollbarX.marginBottom = 20;
chart.scrollbarX = scrollbarX;
let rectangle = chart.plotContainer.createChild(am4core.Rectangle)
rectangle.fillOpacity = 1;
rectangle.width = am4core.percent(100);
rectangle.fill = am4core.color("#ffffff")
rectangle.isMeasured = false;
rectangle.height = 29;
rectangle.zIndex = 1000;
valueAxis2.events.on("positionchanged", function(){
rectangle.y = valueAxis2.pixelY - rectangle.pixelHeight - 1;
})
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
#chartdiv {
width: 100%;
height: 600px;
}
<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>
<div id="chartdiv"></div>