标签、标题与保存图形
添加坐标轴标签、标题、图例和刻度格式,然后使用 savefig() 保存出版质量的图形。
标签、标题与保存图形 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。
从绘图到出版
只有在坐标轴带有标签、标题能够说明关键结论,并且图形以足够高的分辨率保存以适应目标媒介时,图表才真正有效。本课将介绍一系列收尾处理,把快速的探索性绘图转换为适合报告、仪表板或学术出版物的精美图形:坐标轴标签、刻度格式、标题、图例、注释和文件导出。
使用 set_xlabel 和 set_ylabel 设置坐标轴标签
使用 ax.set_xlabel() 和 ax.set_ylabel() 设置描述性坐标轴标签。标签中应始终包含单位(例如使用 'Revenue (USD)',而不是只有 'Revenue')。使用 fontsize 可在演示文稿中放大标签;当刻度标签较大时,使用 labelpad 可增加坐标轴与标签文本之间的间距。
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(7, 4))
x = np.arange(1, 13)
y = np.random.randint(100, 500, 12)
ax.plot(x, y, 'o-', color='steelblue')
ax.set_xlabel('Month', fontsize=12, labelpad=8)
ax.set_ylabel('Revenue (USD thousands)', fontsize=12, labelpad=8)
# plt.show()
plt.close()使用 set_title 和 suptitle 设置标题
ax.set_title() 会在单个 Axes 上方设置标题。对于多面板图形,fig.suptitle() 会在所有子图上方添加共享标题。使用 fontsize 控制字体大小,使用 y 控制垂直位置(默认值为 1.0)。好的标题应说明图表的主要洞察,而不仅仅是描述坐标轴——请比较 'Monthly Revenue' 和 'Revenue Peaked in Q3 and Fell 20% in Q4'。
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.plot([1,2,3], [1,4,9])
ax1.set_title('Subplot One', fontsize=11)
ax2.bar(['A','B','C'], [3,7,2])
ax2.set_title('Subplot Two', fontsize=11)
# Shared figure title
fig.suptitle('Annual Overview Dashboard', fontsize=14, fontweight='bold', y=1.02)
plt.tight_layout()
plt.close()控制刻度标签
Matplotlib 的默认刻度标签通常已经足够,但有时您需要自定义标签。使用 ax.set_xticks() 指定刻度位置,使用 ax.set_xticklabels() 设置标签。传入 rotation=45 可倾斜较长的标签,避免它们相互重叠。ha='right'(水平对齐)参数可确保旋转后的标签正确锚定到对应刻度线上。
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
values = np.random.randint(200, 600, 12)
fig, ax = plt.subplots(figsize=(9, 4))
ax.bar(range(12), values, color='steelblue')
ax.set_xticks(range(12))
ax.set_xticklabels(months, rotation=45, ha='right', fontsize=10)
ax.set_ylabel('Revenue')
plt.tight_layout()
plt.close()格式化刻度值
使用 matplotlib.ticker 格式化器,以易于阅读的形式显示刻度值。FuncFormatter 接受一个函数,该函数接收刻度值并返回格式化后的字符串。常见格式包括千位分隔符、货币符号、百分号和科学计数法。使用 ax.yaxis.set_major_formatter(formatter) 应用格式化器。
from matplotlib.ticker import FuncFormatter
def millions_fmt(x, pos):
return f'${x/1e6:.1f}M'
fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(['Q1', 'Q2', 'Q3', 'Q4'], [1.2e6, 1.8e6, 2.1e6, 1.9e6], color='steelblue')
ax.yaxis.set_major_formatter(FuncFormatter(millions_fmt))
ax.set_title('Quarterly Revenue')
ax.set_ylabel('Revenue')
plt.tight_layout()
plt.close()使用 ax.legend() 添加图例
调用 ax.legend() 可显示所有设置了 label 参数的绘图元素对应的图例。您可以使用 loc(位置,例如 'upper right'、'lower left')、ncol(列数)、framealpha(边框透明度)和 fontsize 进行自定义。要将图例放在绘图区外,可以结合使用 bbox_to_anchor 和 loc。
fig, ax = plt.subplots(figsize=(7, 4))
for region, color in [('East','steelblue'),('West','coral'),('North','green')]:
ax.plot(range(12), np.random.randint(100, 400, 12),
marker='o', label=region, color=color)
ax.legend(loc='upper right', ncol=1, framealpha=0.8, fontsize=10)
ax.set_title('Monthly Sales by Region')
plt.close()添加文本注释
ax.annotate(text, xy=(x_point, y_point), xytext=(x_text, y_text), arrowprops=...) 可添加文本标签,并可选择使用箭头指向特定数据点。您可以用它突出显示最大值、异常值或图表中的重要事件。arrowprops 字典控制箭头样式:arrowstyle='->' 表示简单箭头。
y_vals = np.array([120, 180, 310, 250, 420, 380, 290])
x_vals = np.arange(len(y_vals))
peak_idx = np.argmax(y_vals)
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x_vals, y_vals, 'o-', color='steelblue')
ax.annotate(f'Peak: {y_vals[peak_idx]}',
xy=(peak_idx, y_vals[peak_idx]),
xytext=(peak_idx - 2, y_vals[peak_idx] + 30),
arrowprops={'arrowstyle': '->', 'color': 'red'},
fontsize=10, color='red')
plt.close()添加水平和垂直参考线
ax.axhline(y_value) 会在指定的 y 值处,横跨整个 Axes 的宽度绘制水平线。ax.axvline(x_value) 会绘制垂直线。两者都接受 color、linestyle 和 linewidth 参数。在时间序列图中,参考线通常用于标记目标、阈值或事件日期。
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(range(10), np.random.randint(100, 400, 10), 'o-', color='steelblue')
# Target line
ax.axhline(y=250, color='red', linestyle='--', lw=1.5, label='Target')
# Event line
ax.axvline(x=5, color='orange', linestyle=':', lw=1.5, label='Campaign start')
ax.legend()
ax.set_title('Revenue vs Target')
plt.close()使用主题设置样式
Matplotlib 内置了多个样式表,无需修改代码即可改变所有图形的整体外观:'seaborn-v0_8-whitegrid'、'fivethirtyeight'、'ggplot'、'bmh' 等。在脚本开头使用 plt.style.use('style_name') 应用样式。使用 plt.style.context('style_name') 作为上下文管理器,可仅在某个代码块内应用样式。
# Apply a style globally
plt.style.use('seaborn-v0_8-whitegrid')
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(range(10), np.random.randn(10).cumsum())
ax.set_title('Seaborn Whitegrid Style')
plt.close()
# Reset to default
plt.rcdefaults()使用 savefig() 保存图形
fig.savefig('filename.png') 会将图形保存到文件。主要参数包括:dpi(每英寸点数——屏幕显示使用 150,打印使用 300)、bbox_inches='tight'(防止标签被裁切)以及 format(从扩展名推断,或显式指定)。常见格式包括:'.png'(栅格格式,适合网页)、'.pdf'(矢量格式,适合打印)和 '.svg'(矢量格式,可在 Illustrator 中编辑)。
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(range(10), np.random.randn(10), 'o-')
ax.set_title('Export Example')
ax.set_xlabel('Step')
ax.set_ylabel('Value')
# Save as PNG (screen quality)
fig.savefig('/tmp/chart_screen.png', dpi=150, bbox_inches='tight')
# Save as PDF (print quality)
fig.savefig('/tmp/chart_print.pdf', dpi=300, bbox_inches='tight')
plt.close()
print('Figures saved.')完整示例:精美的报告图表
下面是一个结合本课所有技术的完整工作流程:创建精美的时间序列图,包含坐标轴标签、格式化的 y 轴刻度、水平目标线、峰值注释,并导出为高分辨率 PNG。这是制作任何需要放入报告或仪表板的图表时都可以采用的模式。
from matplotlib.ticker import FuncFormatter
fig, ax = plt.subplots(figsize=(9, 5))
months = list(range(1, 13))
revenue = [120, 145, 132, 160, 175, 190, 210, 185, 220, 200, 240, 260]
peak = max(revenue)
peak_idx = revenue.index(peak)
ax.plot(months, revenue, 'o-', color='steelblue', lw=2, markersize=6)
ax.axhline(y=180, color='red', ls='--', lw=1.2, label='Target: $180K')
ax.annotate(f'Peak ${peak}K', xy=(peak_idx+1, peak),
xytext=(peak_idx-1.5, peak+15),
arrowprops={'arrowstyle': '->'}, fontsize=9)
ax.set_xticks(months)
ax.set_xticklabels(['Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec'], rotation=45, ha='right')
ax.yaxis.set_major_formatter(FuncFormatter(lambda x,p: f'${x:.0f}K'))
ax.set_title('2024 Monthly Revenue vs Target', fontsize=13, fontweight='bold')
ax.set_ylabel('Revenue')
ax.legend()
plt.tight_layout()
plt.close()快速检查
请测试您对本课标签、标题和图形保存方法的理解。
课程回顾
在本课中,您学习了:set_xlabel()/set_ylabel()/set_title() 可添加描述性文本;FuncFormatter 可将刻度值格式化为货币或百分比;ax.annotate() 可添加指向数据点的文本标签,以突出关键数据点;axhline()/axvline() 可绘制参考线;使用带有 dpi 和 bbox_inches='tight' 的 fig.savefig() 可生成达到出版质量的导出图形。Matplotlib 基础课程到此完成——接下来将学习用于统计绘图的 Seaborn。
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「标签、标题与保存图形」课时是免费的吗?
是的 — 「标签、标题与保存图形」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。
「标签、标题与保存图形」这节课中我会学到什么?
添加坐标轴标签、标题、图例和刻度格式,然后使用 savefig() 保存出版质量的图形。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Pandas & NumPy Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「标签、标题与保存图形」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?
能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。