import { col } from '../csv.js'; import { PALETTE, FONT, axisCommon, periodAxis, titleStyle, legendStyle, footnote, watermarks, LAYOUT, } from '../theme.js'; /** * 泡泡玛特品类收入结构图 * 堆叠柱状图展示各品类的收入占比和增长 */ export function categoryChart(rows, { width, height }) { // 过滤掉表头行("品类"那一行) const dataRows = rows.filter(r => r.period && r.period !== '品类'); const periods = col(dataRows, 'period'); return { backgroundColor: '#fff', title: { ...titleStyle, text: '泡泡玛特品类收入结构(2024H1-2025H2)', subtext: '单位:亿元', }, legend: { ...legendStyle, top: LAYOUT.legendTop, data: ['毛绒', '手办', 'MEGA', '衍生品及其他'].map(name => ({ name, icon: 'rect', // 全部是堆叠柱状图 })), }, grid: { left: 78, right: 56, top: LAYOUT.gridTop, bottom: 90 }, tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' }, textStyle: { fontFamily: FONT }, formatter: (params) => { let result = `${params[0].axisValue}
`; let total = 0; params.forEach(p => { total += p.value; result += `${p.marker}${p.seriesName}: ${p.value.toFixed(2)} 亿元
`; }); result += `合计: ${total.toFixed(2)} 亿元`; return result; }, }, xAxis: { ...periodAxis, data: periods }, yAxis: { ...axisCommon, type: 'value', name: '收入(亿元)', nameLocation: 'middle', nameGap: 52, nameTextStyle: { color: PALETTE.grey, fontSize: 13, fontFamily: FONT }, min: 0, max: 250, interval: 50, }, series: [ { name: '毛绒', type: 'bar', stack: 'category', data: col(dataRows, 'plush'), itemStyle: { color: PALETTE.coral }, emphasis: { focus: 'series' }, label: { show: true, position: 'inside', color: '#fff', fontSize: 12, fontFamily: FONT, formatter: (p) => (p.value > 15 ? p.value.toFixed(1) : ''), }, }, { name: '手办', type: 'bar', stack: 'category', data: col(dataRows, 'figure'), itemStyle: { color: PALETTE.blue }, emphasis: { focus: 'series' }, label: { show: true, position: 'inside', color: '#fff', fontSize: 12, fontFamily: FONT, formatter: (p) => (p.value > 15 ? p.value.toFixed(1) : ''), }, }, { name: 'MEGA', type: 'bar', stack: 'category', data: col(dataRows, 'mega'), itemStyle: { color: PALETTE.purple }, emphasis: { focus: 'series' }, label: { show: true, position: 'inside', color: '#fff', fontSize: 12, fontFamily: FONT, formatter: (p) => (p.value > 8 ? p.value.toFixed(1) : ''), }, }, { name: '衍生品及其他', type: 'bar', stack: 'category', data: col(dataRows, 'other'), itemStyle: { color: PALETTE.sage }, emphasis: { focus: 'series' }, label: { show: true, position: 'inside', color: '#fff', fontSize: 12, fontFamily: FONT, formatter: (p) => (p.value > 8 ? p.value.toFixed(1) : ''), }, }, ], graphic: [ ...watermarks(width, height), footnote('数据来源:泡泡玛特财报 | @思考的Joey'), ], }; }