英文:
Calculate years based on months in 17 months graph in TypeScript (Highcharts)
问题
我有一个困扰了我很久的问题。
我有这样一个柱状图,横跨17个月 - 12个月前和6个月后。
目前是五月,往回推12个月也是五月。此外,往后推6个月是十一月。
在工具提示中,我需要显示每个月的特定年份。
我有两根并排的柱子,其中一根应显示该年份之前的年份。
例如,左边柱子 -> 2022,右边柱子 -> 2023,依此类推。
英文:
I have an issue I've been struggling with.
I have this column chart that spans 17 months - 12 months back and 6 months ahead.
Currently, it's May, and 12 months back is also May. Additionally, 6 months ahead is November.
In the tooltip, I need to show the specific year for each month.
I have two columns side by side, where one column should display the year prior to that particular year.
Ex. left bar->2022 right bar->2023 and so on.
It has to be beside the header text here in the tooltip:
Tooltip hover image
My code:
private getSeriesDataFromGraphData(graphData: GetPreviousYearGraphData[]): Highcharts.PointOptionsObject[] {
return graphData.map(({y, b2b, b2c, normal}) => ({y, b2b, b2c, normal}));
}
// Using the search-filters does not affect this graph. This graph is only affected when filtering between brands.
private renderOrderAmountCompareOnBrand(
strCurrencyCode: string,
arrCategories: string[],
arrPrevSeriesDataStock: GetPreviousYearGraphData[],
arrPrevSeriesDataPre: GetPreviousYearGraphData[],
arrSeriesDataStock: GetPreviousYearGraphData[],
arrSeriesDataPre: GetPreviousYearGraphData[]
) {
// Get the series data for each set of graph data
const prevSeriesDataStock = this.getSeriesDataFromGraphData(arrPrevSeriesDataStock);
const prevSeriesDataPre = this.getSeriesDataFromGraphData(arrPrevSeriesDataPre);
const seriesDataStock = this.getSeriesDataFromGraphData(arrSeriesDataStock);
const seriesDataPre = this.getSeriesDataFromGraphData(arrSeriesDataPre);
this.OrderAmountComparedOnBrandChart = Highcharts.chart('claimsOrderAmountPerSalesChannel', {
chart: {
type: 'column'
},
title: {
text: 'Order amount compared on brand'
},
xAxis: {
categories: arrCategories
},
yAxis: {
allowDecimals: false,
min: 0,
title: {
text: 'Brand order statistics'
}
},
tooltip: {
formatter: function () {
let strStyling = "display: flex; justify-content: space-between; gap: 20px;";
let startDate: Date = new Date();
startDate.setMonth(startDate.getMonth() - 12);
let year = startDate.getFullYear();
if (!this.series.name.includes('Previous year')) {
year += 1;
}
const GetPreviousYearGraphData = this.point as GetPreviousYearGraphData;
return `
<b>${this.point.category} | ${this.series.name} | ${year}</b><br><br>
<div style="${strStyling}">
<span><b>Sales staff:</b></span> ${Highcharts.numberFormat(GetPreviousYearGraphData.normal || 0, 0)} ${strCurrencyCode ?? ''}<br>
</div>
<div style="${strStyling}">
<span><b>B2B:</b></span> ${Highcharts.numberFormat(GetPreviousYearGraphData.b2b || 0, 0)} ${strCurrencyCode ?? ''}<br>
</div>
<div style="${strStyling}">
<span><b>B2C:</b></span> ${Highcharts.numberFormat(GetPreviousYearGraphData.b2c || 0, 0)} ${strCurrencyCode ?? ''}<br>
</div>
<div style="${strStyling}">
<span><b>Total:</b></span> ${Highcharts.numberFormat(this.y || 0, 0)} ${strCurrencyCode ?? ''}
</div>
`;
},
useHTML: true
},
plotOptions: {
column: {
stacking: 'normal',
dataLabels: {
enabled: false
}
}
},
series: [
{
name: 'Stock Previous year',
data: prevSeriesDataStock,
stack: 'Stock1'
},
{
name: 'Pre Previous year',
data: prevSeriesDataPre,
stack: 'Stock1'
},
{
name: 'Stock',
data: seriesDataStock,
stack: 'Stock'
},
{
name: 'Pre',
data: seriesDataPre,
stack: 'Stock'
}
] as SeriesOptionsType[]
} as Options
);
}
I tried a whole bunch of things, but i cant get it to calculate correctly.
答案1
得分: 0
我明白最大的问题是计算去年月份的适当年份。为此,您可以检查this.point.x - 12
和currentDate.getMonth() + 1
的总和是否大于0
,并根据计算设置月份。
例如:
tooltip: {
formatter: function() {
let strStyling = "display: flex; justify-content: space-between; gap: 20px;";
const strCurrencyCode = '';
const currentDate = new Date();
const isCurrentYear = this.point.x - 12 + currentDate.getMonth() + 1 > 0;
currentDate.setMonth(currentDate.getMonth() - (isCurrentYear ? 12 : 24));
let year = currentDate.getFullYear();
if (!this.series.name.includes('Previous year')) {
year += 1;
}
return `...`;
},
useHTML: true
}
实时演示: 链接
API 参考文档: 链接
英文:
I understand that the biggest problem is to calculate the proper year for the last year's months. To do that, you can check if a sum of this.point.x - 12
and currentDate.getMonth() + 1
is greater than 0
and set month depending on the calculations.
For example:
tooltip: {
formatter: function() {
let strStyling = "display: flex; justify-content: space-between; gap: 20px;";
const strCurrencyCode = '';
const currentDate = new Date();
const isCurrentYear = this.point.x - 12 + currentDate.getMonth() + 1 > 0;
currentDate.setMonth(currentDate.getMonth() - (isCurrentYear ? 12 : 24));
let year = currentDate.getFullYear();
if (!this.series.name.includes('Previous year')) {
year += 1;
}
return `...`;
},
useHTML: true
}
Live demo: http://jsfiddle.net/BlackLabel/xf3Lu7qp/
API Reference: https://api.highcharts.com/highcharts/tooltip.formatter
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论