是否可以在不添加系列的情况下使用堆积柱形图?
Is it possible to use stacked column chart without the series adding up?
首先,我不确定我要找的是堆积柱形图还是其他。
库是 Google Charts 或 amCharts。
我有一系列过去 28 天的值,代表发送的电子邮件、打开的电子邮件和点击链接的电子邮件。对于每个日期,该列的最大值。值应该是发送的电子邮件数。然后根据其他两个值划分此列。基本上图表应该显示的是,在发送的 20 封邮件中,有 17 封被打开,5 封甚至有人点击了邮件中的链接。
使用常规的堆叠柱方法和数字 20、17 和 5,这将使柱达到 42 的峰值,其中一个部分涵盖 0-20、一个 20-37 和一个 37-42。
我想要的是一个峰值为 20 的列,在它前面的列峰值为 17,前面的列峰值为 5。类似于 diff 图表。
我理论上可以通过修改我的数据来实现这一点,点击5封邮件,打开的邮件是17减5 = 12,发送的邮件是20减17 = 3。然后5 + 12 + 3 = 20什么我想了。但是,将鼠标悬停在堆叠列上会在工具提示中显示错误的值 5、12 和 3,而不是 5、17 和 20。因此我必须呈现自定义工具提示。
你们知道我的问题是否有简单的解决方案吗?
对于您理论上描述的场景,
您不需要自定义工具提示。
加载google数据时table,我们可以使用对象表示法。
我们可以提供值 (v:
) 和格式化值 (f:
)
{v: 12, f: '17'}
工具提示将默认使用格式化值。
此外,您可以使用 DataView
来执行计算。
这将允许您正常加载数据。
此处,计算列用于调整绘制的值,
但显示原始值。
请参阅以下工作片段...
google.charts.load('current', {
packages: ['corechart']
}).then(function () {
// create data table
var data = new google.visualization.DataTable();
data.addColumn('string', 'Date');
data.addColumn('number', 'Emails with Clicks');
data.addColumn('number', 'Emails Opened');
data.addColumn('number', 'Emails Sent');
// add data
data.addRow(['06/2020', 5, 17, 20]);
// create number format
var formatNumber = new google.visualization.NumberFormat({
pattern: '#,##0'
});
// create data view
var view = new google.visualization.DataView(data);
// build view columns
var viewColumns = [0];
for (var i = 1; i < data.getNumberOfColumns(); i++) {
addColumn(i);
}
function addColumn(index) {
viewColumns.push({
calc: function (dt, row) {
var currentColumnValue = dt.getValue(row, index);
var previousColumnValue = 0;
if (index > 1) {
previousColumnValue = dt.getValue(row, index - 1);
}
var adjusttedColumnValue = currentColumnValue - previousColumnValue;
var formattedColumnValue = formatNumber.formatValue(currentColumnValue);
return {
v: adjusttedColumnValue,
f: formattedColumnValue
};
},
label: data.getColumnLabel(index),
type: data.getColumnType(index),
});
}
// set view columns
view.setColumns(viewColumns);
// create options
var options = {
chartArea: {
left: 64,
top: 40,
right: 32,
bottom: 40,
height: '100%',
width: '100%'
},
height: '100%',
isStacked: true,
legend: {
alignment: 'end',
position: 'top'
},
width: '100%'
};
// create, draw chart with view
var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
chart.draw(view, options);
window.addEventListener('resize', function () {
chart.draw(view, options);
});
});
html, body {
height: 100%;
margin: 0px 0px 0px 0px;
overflow: hidden;
padding: 0px 0px 0px 0px;
}
.chart {
height: 100%;
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div class="chart" id="chart_div"></div>
注意:如果你想堆叠列,一个在另一个前面,类似于差异图表,
检查这个答案...
首先,我不确定我要找的是堆积柱形图还是其他。
库是 Google Charts 或 amCharts。
我有一系列过去 28 天的值,代表发送的电子邮件、打开的电子邮件和点击链接的电子邮件。对于每个日期,该列的最大值。值应该是发送的电子邮件数。然后根据其他两个值划分此列。基本上图表应该显示的是,在发送的 20 封邮件中,有 17 封被打开,5 封甚至有人点击了邮件中的链接。 使用常规的堆叠柱方法和数字 20、17 和 5,这将使柱达到 42 的峰值,其中一个部分涵盖 0-20、一个 20-37 和一个 37-42。 我想要的是一个峰值为 20 的列,在它前面的列峰值为 17,前面的列峰值为 5。类似于 diff 图表。
我理论上可以通过修改我的数据来实现这一点,点击5封邮件,打开的邮件是17减5 = 12,发送的邮件是20减17 = 3。然后5 + 12 + 3 = 20什么我想了。但是,将鼠标悬停在堆叠列上会在工具提示中显示错误的值 5、12 和 3,而不是 5、17 和 20。因此我必须呈现自定义工具提示。
你们知道我的问题是否有简单的解决方案吗?
对于您理论上描述的场景,
您不需要自定义工具提示。
加载google数据时table,我们可以使用对象表示法。
我们可以提供值 (v:
) 和格式化值 (f:
)
{v: 12, f: '17'}
工具提示将默认使用格式化值。
此外,您可以使用 DataView
来执行计算。
这将允许您正常加载数据。
此处,计算列用于调整绘制的值,
但显示原始值。
请参阅以下工作片段...
google.charts.load('current', {
packages: ['corechart']
}).then(function () {
// create data table
var data = new google.visualization.DataTable();
data.addColumn('string', 'Date');
data.addColumn('number', 'Emails with Clicks');
data.addColumn('number', 'Emails Opened');
data.addColumn('number', 'Emails Sent');
// add data
data.addRow(['06/2020', 5, 17, 20]);
// create number format
var formatNumber = new google.visualization.NumberFormat({
pattern: '#,##0'
});
// create data view
var view = new google.visualization.DataView(data);
// build view columns
var viewColumns = [0];
for (var i = 1; i < data.getNumberOfColumns(); i++) {
addColumn(i);
}
function addColumn(index) {
viewColumns.push({
calc: function (dt, row) {
var currentColumnValue = dt.getValue(row, index);
var previousColumnValue = 0;
if (index > 1) {
previousColumnValue = dt.getValue(row, index - 1);
}
var adjusttedColumnValue = currentColumnValue - previousColumnValue;
var formattedColumnValue = formatNumber.formatValue(currentColumnValue);
return {
v: adjusttedColumnValue,
f: formattedColumnValue
};
},
label: data.getColumnLabel(index),
type: data.getColumnType(index),
});
}
// set view columns
view.setColumns(viewColumns);
// create options
var options = {
chartArea: {
left: 64,
top: 40,
right: 32,
bottom: 40,
height: '100%',
width: '100%'
},
height: '100%',
isStacked: true,
legend: {
alignment: 'end',
position: 'top'
},
width: '100%'
};
// create, draw chart with view
var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
chart.draw(view, options);
window.addEventListener('resize', function () {
chart.draw(view, options);
});
});
html, body {
height: 100%;
margin: 0px 0px 0px 0px;
overflow: hidden;
padding: 0px 0px 0px 0px;
}
.chart {
height: 100%;
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div class="chart" id="chart_div"></div>
注意:如果你想堆叠列,一个在另一个前面,类似于差异图表,
检查这个答案...