Files
smart-fin-chart/js/charts/ppmt_core_margin.js
T
2026-08-23 21:23:41 +08:00

66 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { col } from '../csv.js';
import {
PALETTE, FONT, axisCommon, periodAxis, titleStyle,
lineSeries, standardLegend, footnote, watermarks, LAYOUT,
} from '../theme.js';
/**
* 核心利润率(2020H1-2026H1
* 核心利润率 = 核心利润 ÷ 营业收入 = 毛利率 − 销售费用率 − 管理费用率
*
* 剔除了汇兑、投资收益、税等非主业扰动,是四条率线里最能反映
* 「卖货本身赚不赚钱」的一条。22全年触底 10.8%,25全年见顶 45.6%。
*
* 配色 wine(#7B2D42):同页已有 17 种线色,Lab ΔE 筛选后仅此一色 > 24。
*/
const LINE_COLOR = '#7B2D42';
export function ppmtCoreMarginChart(rows, { width, height }) {
const pct = (p) => `${p.value.toFixed(1)}%`;
return {
backgroundColor: '#fff',
title: {
...titleStyle,
text: '泡泡玛特核心利润率(20H1-26H1',
subtext: '核心利润率 = 毛利率 − 销售费用率 − 管理费用率,剔除汇兑与投资等非主业扰动',
},
legend: standardLegend(['核心利润率'], { itemGap: 32 }),
grid: { left: 78, right: 60, top: LAYOUT.gridTop, bottom: 90 },
tooltip: {
trigger: 'axis',
valueFormatter: (v) => `${v.toFixed(1)}%`,
textStyle: { fontFamily: FONT },
},
xAxis: { ...periodAxis, data: col(rows, 'period') },
yAxis: {
...axisCommon,
type: 'value',
name: '核心利润率(%',
nameLocation: 'middle',
nameGap: 52,
nameTextStyle: { color: PALETTE.grey, fontSize: 13, fontFamily: FONT },
min: 0,
max: 50,
interval: 10,
axisLabel: { ...axisCommon.axisLabel, formatter: '{value}%' },
},
series: [
lineSeries({
name: '核心利润率',
data: col(rows, 'core_margin'),
color: LINE_COLOR,
formatter: pct,
width: 3.08, // 与拆解图毛利率线一致
}),
],
graphic: [
...watermarks(width, height),
footnote(
'核心利润率由绝对值口径直接计算(核心利润÷营收),比三个比率行相减更准\n' +
'——后者各只存4位小数,累加误差可达0.045pct | @思考的Joey'
),
],
};
}