google 个图表将注释位置移动到堆叠图表的中心
google charts move annotation position to center of stacked chart
我正在使用 Google Chart 的柱形图。该图表是一个堆叠柱形图,其中为堆叠柱的每个数据点提供了注释。注释位于栏内的顶部,但我希望它们在栏内居中。我找到的最接近的解决方案是将非堆积柱形 google 图表的注释移动到底部 。
此解决方案的问题在于代码会查找白色注释并将其移至底部。我正在处理的图表具有多种颜色的注释,并且该颜色的所有注释移动到顶部而不是堆叠列子集的中心。
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Range', 'score range A',{role: 'style'},{ role: 'annotation' }, 'score range B',{role: 'style'},{ role: 'annotation' }, 'score range C', {role: 'style'},{ role: 'annotation' },'score range D', {role: 'style'},{ role: 'annotation' }],
['Range', 4,'#D7F0B4','0-4',6,'#00B050','5-10',9,'#92D050','11-19',6, '#AAE182','20-25']
]);
var options = {
vAxis:{ ticks: [0,4,10,19], viewWindow: { max: 25} },
isStacked: true,
title: 'Score',
legend: {position: 'none'}
};
var chart = new google.visualization.ColumnChart(document.getElementById('idealchartA'));
chart.draw(data, options);
}
@Whitehat 解决了上述问题,但是当我在另一列中将一些注释值设置为 null 时,定位被取消了。
这是我尝试添加的新数据系列
['Range', 4,'#D7F0B4','0-4',6,'#00B050','5-10',9,'#92D050','11-19',6, '#AAE182','20-25'], ['Yours', 4,'white; fill-opacity: 0',null,6, '#00B050',10, 9,'white; fill-opacity: 0',null,6,'white; fill-opacity: 0',null]
.
我们的想法是制作如下图所示的图表,但注释居中。
与其他问题类似,只是需要一种查找注释的方法。
在这里,我们使用 text-anchor
属性,假设它不是 x 轴标签。
然后我们可以使用图表方法getChartLayoutInterface
来计算新的位置。
请参阅以下工作片段...
google.charts.load('current', {
packages:['corechart']
}).then(function () {
var data = google.visualization.arrayToDataTable([
['Range', 'score range A',{role: 'style'},{ role: 'annotation' }, 'score range B',{role: 'style'},{ role: 'annotation' }, 'score range C', {role: 'style'},{ role: 'annotation' },'score range D', {role: 'style'},{ role: 'annotation' }],
['Range', 4,'#D7F0B4','0-4',6,'#00B050','5-10',9,'#92D050','11-19',6, '#AAE182','20-25']
]);
var options = {
vAxis:{ ticks: [0,4,10,19], viewWindow: { max: 25} },
isStacked: true,
title: 'Score',
legend: {position: 'none'}
};
var container = document.getElementById('idealchartA');
var chart = new google.visualization.ColumnChart(container);
google.visualization.events.addListener(chart, 'ready', function () {
var observer = new MutationObserver(moveAnnotations);
observer.observe(container, {
childList: true,
subtree: true
});
});
function moveAnnotations() {
var chartLayout = chart.getChartLayoutInterface();
var barBounds;
var labelBounds;
var yAdj;
var labels = container.getElementsByTagName('text');
var index = 0;
Array.prototype.forEach.call(labels, function(label) {
if ((label.getAttribute('text-anchor') === 'middle') && (label.textContent !== data.getValue(0, 0))) {
barBounds = chartLayout.getBoundingBox('bar#' + index + '#0');
labelBounds = chartLayout.getBoundingBox('annotationtext#' + index + '#0#0');
yAdj = (barBounds.height / 2) + (parseFloat(label.getAttribute('font-size')) / 2) - 2;
label.setAttribute('y', barBounds.top + yAdj);
index++;
}
});
}
chart.draw(data, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="idealchartA"></div>
我正在使用 Google Chart 的柱形图。该图表是一个堆叠柱形图,其中为堆叠柱的每个数据点提供了注释。注释位于栏内的顶部,但我希望它们在栏内居中。我找到的最接近的解决方案是将非堆积柱形 google 图表的注释移动到底部
此解决方案的问题在于代码会查找白色注释并将其移至底部。我正在处理的图表具有多种颜色的注释,并且该颜色的所有注释移动到顶部而不是堆叠列子集的中心。
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Range', 'score range A',{role: 'style'},{ role: 'annotation' }, 'score range B',{role: 'style'},{ role: 'annotation' }, 'score range C', {role: 'style'},{ role: 'annotation' },'score range D', {role: 'style'},{ role: 'annotation' }],
['Range', 4,'#D7F0B4','0-4',6,'#00B050','5-10',9,'#92D050','11-19',6, '#AAE182','20-25']
]);
var options = {
vAxis:{ ticks: [0,4,10,19], viewWindow: { max: 25} },
isStacked: true,
title: 'Score',
legend: {position: 'none'}
};
var chart = new google.visualization.ColumnChart(document.getElementById('idealchartA'));
chart.draw(data, options);
}
@Whitehat 解决了上述问题,但是当我在另一列中将一些注释值设置为 null 时,定位被取消了。
这是我尝试添加的新数据系列
['Range', 4,'#D7F0B4','0-4',6,'#00B050','5-10',9,'#92D050','11-19',6, '#AAE182','20-25'], ['Yours', 4,'white; fill-opacity: 0',null,6, '#00B050',10, 9,'white; fill-opacity: 0',null,6,'white; fill-opacity: 0',null]
.
我们的想法是制作如下图所示的图表,但注释居中。
与其他问题类似,只是需要一种查找注释的方法。
在这里,我们使用 text-anchor
属性,假设它不是 x 轴标签。
然后我们可以使用图表方法getChartLayoutInterface
来计算新的位置。
请参阅以下工作片段...
google.charts.load('current', {
packages:['corechart']
}).then(function () {
var data = google.visualization.arrayToDataTable([
['Range', 'score range A',{role: 'style'},{ role: 'annotation' }, 'score range B',{role: 'style'},{ role: 'annotation' }, 'score range C', {role: 'style'},{ role: 'annotation' },'score range D', {role: 'style'},{ role: 'annotation' }],
['Range', 4,'#D7F0B4','0-4',6,'#00B050','5-10',9,'#92D050','11-19',6, '#AAE182','20-25']
]);
var options = {
vAxis:{ ticks: [0,4,10,19], viewWindow: { max: 25} },
isStacked: true,
title: 'Score',
legend: {position: 'none'}
};
var container = document.getElementById('idealchartA');
var chart = new google.visualization.ColumnChart(container);
google.visualization.events.addListener(chart, 'ready', function () {
var observer = new MutationObserver(moveAnnotations);
observer.observe(container, {
childList: true,
subtree: true
});
});
function moveAnnotations() {
var chartLayout = chart.getChartLayoutInterface();
var barBounds;
var labelBounds;
var yAdj;
var labels = container.getElementsByTagName('text');
var index = 0;
Array.prototype.forEach.call(labels, function(label) {
if ((label.getAttribute('text-anchor') === 'middle') && (label.textContent !== data.getValue(0, 0))) {
barBounds = chartLayout.getBoundingBox('bar#' + index + '#0');
labelBounds = chartLayout.getBoundingBox('annotationtext#' + index + '#0#0');
yAdj = (barBounds.height / 2) + (parseFloat(label.getAttribute('font-size')) / 2) - 2;
label.setAttribute('y', barBounds.top + yAdj);
index++;
}
});
}
chart.draw(data, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="idealchartA"></div>