feat: 泡泡玛特增加年度、半年数据区分

This commit is contained in:
2026-08-30 14:49:27 +08:00
parent d010b107aa
commit d51890a450
69 changed files with 1109 additions and 258 deletions
+10 -15
View File
@@ -1,6 +1,7 @@
import { col } from '../csv.js';
import {
PALETTE, FONT, axisCommon, categoryAxis, titleStyle, labelStyle,
PALETTE, FONT, axisCommon, standalonePeriodAxis, titleStyle, labelStyle,
financialViewDisclosure, financialViewLabel,
barSeries, lineSeries, standardLegend, footnote, watermarks, LAYOUT,
} from '../theme.js';
@@ -34,13 +35,13 @@ const BAR_COLOR = '#176B52'; // 墨翡翠
const LINE_COLOR = '#7A3FE0'; // 鲜亮紫
const LINE_ON_BAR = '#DCC9FF'; // 压在翡翠柱面上时用的浅紫(对比度约 6:1)
const Y_MAX = 160; // 左轴上限
const YOY_MIN = -50; // 右轴下限
const YOY_MAX = 150; // 右轴上限
export function ppmtIpExMonstersChart(rows, { width, height }) {
export function ppmtIpExMonstersChart(rows, { width, height, view = 'all' }) {
const periods = col(rows, 'period');
const revenue = col(rows, 'revenue');
const yMax = Math.max(...revenue) > 160 ? 300 : 160;
// 前两期无同比基数,CSV 里留空;parseCSV 会给出 '',统一转成 null
const yoy = col(rows, 'yoy').map((v) => (v === '' ? null : v));
@@ -50,7 +51,7 @@ export function ppmtIpExMonstersChart(rows, { width, height }) {
const labelGap = (8 + 13) / plotH; // labelStyle 的 distance + 字高,换成占比
const yoyData = yoy.map((v, i) => {
if (v === null) return null;
const barFrac = revenue[i] / Y_MAX;
const barFrac = revenue[i] / yMax;
const lineFrac = (v - YOY_MIN) / (YOY_MAX - YOY_MIN);
// 标签整体(底边到顶边)都落在柱子高度以内 → 压在柱面上
const onBar = lineFrac + labelGap < barFrac;
@@ -61,8 +62,8 @@ export function ppmtIpExMonstersChart(rows, { width, height }) {
backgroundColor: '#fff',
title: {
...titleStyle,
text: '泡泡玛特除 THE MONSTERS 外的IP收入及同比(21H1-26H1)',
subtext: 'IP收入合计 − THE MONSTERS,单位:亿元;H2 为下半年单期,非全年累计',
text: `泡泡玛特除 THE MONSTERS 外的IP收入及同比(${financialViewLabel(view)})`,
subtext: ['IP收入合计 − THE MONSTERS,单位:亿元;H2为下半年单期,非全年累计', financialViewDisclosure(view)].filter(Boolean).join('\n'),
},
legend: standardLegend(['除MONSTERS外收入', '同比增速'], { itemGap: 32 }),
grid: { left: 78, right: 128, top: LAYOUT.gridTop, bottom: 90 },
@@ -82,12 +83,7 @@ export function ppmtIpExMonstersChart(rows, { width, height }) {
return out;
},
},
xAxis: {
...categoryAxis,
data: periods,
// 只去世纪前缀:这张表的 H2 是单半年,不能简写成「全年」
axisLabel: { ...categoryAxis.axisLabel, formatter: (v) => v.replace(/^20/, '') },
},
xAxis: { ...standalonePeriodAxis, data: periods },
yAxis: [
{
...axisCommon,
@@ -97,9 +93,8 @@ export function ppmtIpExMonstersChart(rows, { width, height }) {
nameGap: 50,
nameTextStyle: { color: PALETTE.grey, fontSize: 13, fontFamily: FONT },
min: 0,
// 定死 160:留出顶部余量,最高柱(139.0)不会顶到绘图区上沿
max: Y_MAX,
interval: 20,
max: yMax,
interval: yMax === 160 ? 20 : 50,
},
{
type: 'value',