A5. 数据可视化

本章分两个层次:首先帮你建立「图形词汇」——知道如何用专业语言描述图形的每一个元素;然后给出金融分析中最常用图形的提示词框,每个框都配有「微调追问模板」,帮助你在第一轮代码基础上迭代改进。

A5.1 图形要素词汇表

A5.1.1 为什么需要图形词汇?

「图例挡住了折线」「x 轴日期挤在一起看不清」「子图之间的间距太大」——这些是最常见的图形问题。但如果你不知道「图例」的英文是 legend,「x 轴刻度标签」是 xticklabels,AI 就无法帮你精准修改。

A. 图形结构全览

┌──────────────────────────────────────────────────┐
│          主标题 (title / suptitle)                │
│  y 轴标签  ┌─────────────────────────┐  图例      │
│  (ylabel)  │       绘图区域           │ (legend)   │
│            │  ╱╲      /╲            │            │
│      y 轴  │ ╱  ╲    ╱  ╲           │            │
│     刻度   │╱    ╲  ╱    ╲──────    │            │
│   (yticks) └─────────────────────────┘            │
│               x 轴刻度标签 (xticklabels)           │
│               x 轴标签 (xlabel)                   │
└──────────────────────────────────────────────────┘

B. 图形要素速查

图形要素 英文术语 在提示词中如何描述
整张图形 figure 「整个 figure 对象」
绘图区域 axes / subplot 「第 1 行第 2 列的子图(axes)」
主标题 title / suptitle 「整张图的主标题」
子图标题 axes title 「每个子图的标题」
x 轴标签 xlabel 「x 轴的说明文字」
y 轴标签 ylabel 「y 轴的说明文字」
x 轴刻度 xticks 「x 轴刻度的位置和数量」
x 轴刻度标签 xticklabels 「x 轴上显示的文字,如日期」
刻度方向 tick direction 「刻度线朝内还是朝外」
图例 legend 「右上角的图例」
图例标签 legend label 「图例中每条线的说明文字」
注释 annotation 「在某个数据点旁边标注文字」
参考线 reference line 「在 x=0 处画一条垂直虚线」
置信区间 confidence interval 「用阴影区域表示 95% 置信区间」
阴影区域 fill_between 「两条线之间的半透明填充」
背景网格 grid 「淡灰色水平网格线」
图形尺寸 figsize 「图形宽 10 英寸、高 6 英寸」
分辨率 dpi 「300 dpi(学术论文要求)」
紧凑布局 tight_layout 「自动调整子图间距,避免标题重叠」
颜色方案 colormap / palette 「色盲友好的配色方案」
透明度 alpha 「透明度 0.3(半透明)」
线型 linestyle 「实线、虚线(–)、点划线(-.)」
线宽 linewidth 「线条宽度 1.5」
标记点 marker 「在数据点上画圆形标记」
字号 fontsize 「标题字号 14,轴标签字号 12」
边距 bbox_inches 「保存时去除四周白边(‘tight’)」
提示词:解决图形中文乱码

这是 matplotlib 最常见的问题,在每个绘图脚本开头运行一次即可。

我用 matplotlib 绘图时,图形中的中文标题和轴标签显示为方块或乱码。
操作系统:Windows 11。

请帮我:
1. 在代码开头添加设置,使 matplotlib 全局支持中文显示,
   推荐字体:微软雅黑(Microsoft YaHei)
2. 同时确保负号(-)能正常显示,不显示为方块
3. 设置代码要放在所有 import 语句之后,绘图代码之前

要求:不改变图形的其他默认样式。
提示词:设置图形尺寸、分辨率与保存格式
请帮我写代码,将 matplotlib 图形保存为高质量文件,要求:

1. 图形尺寸:宽 10 英寸、高 6 英寸(适合 A4 横版页面)
2. 分辨率:300 dpi(满足学术期刊投稿要求)
3. 分别保存两种格式:
   - PNG 格式,用于 PPT 和 Word 报告
   - PDF 格式,用于 LaTeX 论文(矢量图,无论放多大都不模糊)
4. 保存时自动去除四周多余白边(bbox_inches='tight')
5. 保存路径:../outputs/figures/figure_name.png 和 .pdf

同时说明:什么情况下用 PNG,什么情况下用 PDF?

A5.2 图形风格设置

A5.2.1 推荐绘图方案

在写具体图形的提示词之前,先让 AI 帮你确定风格,后续所有图形保持一致。

提示词(第一轮):推荐绘图方案

先描述你的需求,让 AI 推荐,而不是直接让它生成代码。

我需要为一篇金融学术论文绘制若干图形,请推荐最合适的 Python 绘图方案:

我的需求:
- 风格:学术论文风格,简洁,背景白色,无多余装饰
- 配色:色盲友好的颜色组合(因为论文可能被打印为黑白)
- 图形类型:折线图(时间序列)、事件研究图(含置信区间阴影)、
  散点图、2×2 子图布局
- 输出格式:PDF(用于 LaTeX 插图)
- 中文:图形中需要显示中文标题和标签

请:
1. 推荐最合适的库组合(matplotlib/seaborn/plotly 等)及理由
2. 推荐一个适合学术论文的全局风格设置(plt.style 或 rcParams)
3. 推荐具体的色盲友好颜色列表(十六进制代码)
4. 给出全局风格设置代码,封装为函数 set_academic_style()
提示词(第二轮):商务汇报风格

适用于给管理层、客户展示的图形。

我需要为一份向投资委员会汇报的 PPT 制作图形,请设置商务汇报风格:

风格要求:
- 整体:白底,干净,参考麦肯锡报告风格
- 主色调:深蓝色(#003366)和橙色(#FF6600)
- 字体:微软雅黑,标题 16pt 加粗,轴标签 13pt
- 特殊要求:条形图的每根柱子顶部显示数值标签,
  图形右下角有数据来源说明(如「数据来源:Wind」)

请给出全局风格设置代码,封装为函数 set_business_style(),
并用一个季度营收条形图示例演示效果(使用模拟数据)。

A5.3 常用金融图形

A5.3.1 时间序列折线图

提示词:多股票价格走势图
我有一个 pandas 数据框 `df`,长格式面板数据,
列为:date(datetime)、stock_code(str)、close(float)。

请帮我用 matplotlib 绘制多股票价格走势折线图,要求:

图形内容:
- 每只股票一条折线,不同颜色区分,使用色盲友好配色
- 在日期「2022-01-17」处添加一条红色垂直虚线,
  线旁标注文字「政策公告日」(文字不遮挡折线)
- 折线末端不显示标记点(marker)

图形格式:
- 图形尺寸:(12, 5) 英寸
- 中文主标题:「样本股票收盘价走势(2020–2023)」,字号 14
- x 轴标签:「日期」,y 轴标签:「收盘价(元)」
- x 轴刻度:每季度一个刻度,格式为 YYYY-MM
- x 轴刻度标签旋转 45°,避免重叠
- 图例位于右上角,显示股票代码,无边框
- 背景:白色,仅显示水平淡灰色网格线

保存为 ../outputs/figures/stock_trend.pdf,300 dpi,去除白边。

图形生成后,根据实际效果选择以下追问:

图形基本正确,但有以下细节需要调整,请在上面代码的基础上修改,
其余部分不变:

[从以下情况选择,或自行描述:]

- x 轴日期标签太密,刻度改为每 6 个月一个,格式改为 YYYY 年 MM 月
- 图例中股票代码太多,图例挡住了折线,请将图例移到图形外部右侧
- 某只股票的折线颜色与其他股票太接近,看不清楚,
  请手动指定每只股票的颜色,颜色列表为:["#0072B2", "#E69F00", 
  "#009E73", "#CC79A7", "#F0E442"]
- y 轴数值范围不合适,价格集中在 10–30 之间,
  但 y 轴从 0 开始,折线被压缩在上方,请将 y 轴下限设为数据最小值的 0.95 倍
- 保存的 PDF 打开后发现中文变成了方块,
  请在保存前添加字体设置,确保 PDF 中中文正常显示

A5.3.2 事件研究图

提示词:事件研究 CAR 图

这是事件研究法最核心的结果图,展示事件窗口内的平均累计异常收益率及其置信区间。

我有一个数据框 `df_car`,包含以下列:
- event_day:整数,事件窗口相对时间(-10 到 +10,0 为事件日)
- CAR:平均累计异常收益率(浮点数)
- CI_lower:95% 置信区间下限(CAR - 1.96 × 标准误)
- CI_upper:95% 置信区间上限(CAR + 1.96 × 标准误)

请帮我用 matplotlib 绘制标准事件研究图,要求:

图形内容:
- 主线:CAR 的折线,颜色深蓝色(#003399),线宽 2
- 置信区间:用半透明阴影(fill_between)展示 [CI_lower, CI_upper]
  颜色浅蓝色(#99BBFF),透明度(alpha)= 0.3
- 垂直参考线:在 event_day = 0 处画红色虚线,标注文字「事件日」
- 水平参考线:在 CAR = 0 处画灰色虚线(baseline)

图形格式:
- 图形尺寸:(9, 5) 英寸
- 主标题:「并购公告日前后的平均累计异常收益率(CAR)」,字号 13
- x 轴标签:「相对事件日(天)」
- y 轴标签:「累计异常收益率(%)」,y 轴数值乘以 100 显示为百分比
- x 轴刻度:每 2 天一个,从 -10 到 +10
- 图例:说明 CAR 和 95% 置信区间
- 背景:白色,水平淡灰色网格线

保存为 ../outputs/figures/event_study_CAR.pdf。
事件研究图基本符合要求,请在上面代码基础上做以下调整:

[选择适用的情况:]

- CAR 在事件日前后的折线较为平滑,但我想在每个数据点上显示一个小圆点
  标记(marker='o',大小 4),帮助读者看清楚每天的数值
- 我需要在同一张图上展示两个子样本(国有企业和民营企业)的 CAR 对比,
  数据框为 `df_car_soe`(国有)和 `df_car_private`(民营),
  请用不同颜色的实线和虚线区分,并更新图例
- 图形的 y 轴范围自动设置后上下空间太多,
  请将 y 轴范围设置为 [CAR 最小值 - 0.5%, CAR 最大值 + 0.5%]

A5.3.3 分布图与相关系数热图

提示词:收益率分布图(直方图 + KDE + 正态分布对比)
我有一个数据框 `df`,其中 `return` 列是股票日收益率(浮点数)。

请帮我用 matplotlib 和 scipy 绘制收益率分布图,要求:

图形内容(全部叠加在同一坐标系中):
- 直方图(histogram):区间数量 50,纵轴为频率密度(density=True),
  颜色浅蓝色(#AEC6E8),透明度 0.6,有黑色细边框
- KDE 曲线:核密度估计,颜色深蓝色(#003399),线宽 2
- 正态分布曲线:用实际数据的均值和标准差参数化,
  颜色红色(#CC0000),线型为虚线(--),线宽 1.5
- 文字标注:在图形右上角内侧标注均值、标准差、偏度、峰度的数值,
  格式为:「均值 = 0.0012,标准差 = 0.0215,偏度 = -0.35,峰度 = 5.82」

图形格式:
- 图形尺寸:(9, 5) 英寸
- x 轴范围:[-0.15, 0.15],x 轴标签:「日收益率」
- y 轴标签:「频率密度」
- 主标题:「A 股样本股票日收益率分布(2020–2023)」
- 图例:说明直方图、KDE 和正态分布曲线

使用 scipy.stats 计算偏度和峰度。
提示词:相关系数热图
我有一个 pandas 数据框 `df`,包含以下数值列:
return(收益率)、beta(市场风险)、size(规模对数)、
bm(账面市值比)、momentum(动量)、leverage(杠杆率)。

请用 seaborn 绘制变量相关系数热图,要求:

图形内容:
- 计算所有数值列的 Pearson 相关系数矩阵
- 颜色方案:负相关为蓝色,正相关为红色,不相关为白色,
  使用 seaborn 的 RdBu_r 色谱
- 每个格子中显示相关系数值,保留 2 位小数
- 仅显示下三角(上三角留白,避免重复)
- 对角线:显示为 1.00,颜色与最大正相关相同

图形格式:
- 图形尺寸:(8, 7) 英寸
- 主标题:「变量相关系数矩阵」,字号 13
- 变量标签改为中文:
  [return→收益率, beta→市场β, size→公司规模, 
   bm→账面市值比, momentum→动量, leverage→杠杆率]
- 颜色条(colorbar)的范围固定为 [-1, 1]

保存为 ../outputs/figures/correlation_heatmap.pdf。

A5.4 批量绘图与交互式图形

提示词:批量生成多子图

当需要对多只股票或多个变量绘制同类型图形时,批量生成比逐一绘制高效得多。

我有一个面板数据框 `df`,包含 date、stock_code、close 列,
stock_code 共有 9 只股票。

请用 matplotlib 批量绘制每只股票的价格走势,以 3×3 子图布局展示,要求:

布局:
- 3 行 3 列的子图,每个子图对应一只股票
- 图形尺寸:(15, 12) 英寸
- 使用 constrained_layout=True 自动调整子图间距

每个子图:
- 折线图,颜色统一为深蓝色(#003399)
- 子图标题为股票代码,字号 11
- x 轴:仅显示年份(格式 %Y),每两年一个刻度
- x 轴刻度标签旋转 30°
- y 轴:不显示标签(由整体 y 轴说明)

整体图形:
- 主标题:「9 只样本股票收盘价走势(2020–2023)」,字号 16
- 整体 x 轴说明「日期」,y 轴说明「收盘价(元)」
  (用 fig.supxlabel 和 fig.supylabel 实现)

保存为 ../outputs/figures/stock_grid.pdf。
提示词:生成交互式图形(Plotly)

适合在 Jupyter Notebook 中展示,或嵌入 HTML 报告,支持鼠标悬停查看数据。

我有一个股票价格数据框 `df`,包含 date、stock_code、close 列。

请用 Plotly 生成一个交互式股价走势图,要求:

交互功能:
- 鼠标悬停时显示:日期、股票代码、收盘价(保留 2 位小数)
- 支持框选缩放(box select)和双击重置
- x 轴有时间范围选择器:可选 1M / 3M / 6M / 1Y / 全部
- 图例可点击以显示/隐藏单只股票

图形样式:
- 主题:plotly_white(适合汇报)
- 每只股票不同颜色,线宽 2px
- 图形宽 900px,高 500px
- 主标题:「股票收盘价走势(交互式)」

导出:
- 在 Jupyter Notebook 中显示(fig.show())
- 同时保存为 HTML 文件 ../outputs/figures/stock_interactive.html,
  可在浏览器中独立打开