大家好,我是[知识充电宝的灵感日记]。
昨天我们学习了 Matplotlib 的基本图表绘制。但默认的图表往往比较简陋——缺少标题、坐标轴标签不清晰、颜色单调。今天我们来学习如何定制图表,包括标题、轴标签、图例、网格、颜色等细节,让你的图表更加专业、易读。
今天的目标:
难度:⭐⭐(参数多,但掌握后能做出漂亮图表)
import matplotlib.pyplot as plt
import numpy as np
# 支持中文(解决乱码问题)
plt.rcParams['font.sans-serif'] = ['Heiti TC', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False# 解决负号显示问题
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title('正弦函数曲线', fontsize=16, fontweight='bold') # 标题
plt.xlabel('x 值', fontsize=12)
plt.ylabel('sin(x)', fontsize=12)
plt.show()
参数说明:
fontsize:字体大小fontweight:粗细 ('normal', 'bold')loc:标题位置 ('center', 'left', 'right')当图表中有多条线时,图例用来区分。
x = np.linspace(0, 5, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend() # 自动显示图例
plt.show()
图例位置控制:
plt.legend(loc='upper left') # 位置:best, upper right, lower center 等
plt.legend(loc='upper right', fontsize=10, frameon=True, shadow=True) # 边框、阴影
不自动显示图例:手动添加图例句柄:
line1, = plt.plot(x, y1)
line2, = plt.plot(x, y2)
plt.legend([line1, line2], ['正弦', '余弦'])
网格线有助于更精确地读取数据点。
plt.plot(x, y1)
plt.grid(True) # 显示网格
# 更细的控制
plt.grid(True, linestyle='--', alpha=0.7, color='gray')
linestyle:'-', '--', '-.', ':'alpha:透明度 0~1axis:'both'(默认), 'x', 'y'# 常用颜色
plt.plot(x, y1, color='red') # 颜色名称
plt.plot(x, y1, color='#FF5733') # 十六进制
plt.plot(x, y1, color=(0.2, 0.4, 0.6)) # RGB 元组 (0~1)
plt.plot(x, y1, color='k') # 缩写:b,g,r,c,m,y,k,w
plt.plot(x, y1, linestyle='-', linewidth=2, marker='o', markersize=4)
# 简写: 'r--' 表示红色虚线, 'go' 表示绿色圆点
plt.plot(x, y1, 'r--') # 红色虚线
plt.plot(x, y1, 'gs') # 绿色方块
plt.plot(x, y1, alpha=0.5)
plt.xlim(0, 10) # x 轴范围 [0,10]
plt.ylim(-1.5, 1.5)
# 或
plt.axis([0, 10, -1.5, 1.5]) # [xmin, xmax, ymin, ymax]
plt.plot(x, y1)
plt.text(4, 0, '正弦波', fontsize=12, ha='center', va='bottom')
# ha: 水平对齐 (center, left, right)
# va: 垂直对齐 (top, bottom, center)
plt.plot(x, y1)
plt.annotate('最大值', xy=(np.pi/2, 1), xytext=(1.0, 0.6),
arrowprops=dict(facecolor='black', shrink=0.05))
xy:被标注的点坐标xytext:文字位置arrowprops:箭头属性plt.savefig('my_plot.png', dpi=300, bbox_inches='tight')
dpi:分辨率(默认100)bbox_inches='tight':自动裁剪白边注意:savefig应在 show()之前调用,否则可能保存空白图。
一次性设置所有图表的默认样式。
plt.rcParams['figure.figsize'] = (10, 6) # 默认图片尺寸
plt.rcParams['lines.linewidth'] = 2# 线宽
plt.rcParams['lines.markersize'] = 6# 标记大小
plt.rcParams['axes.grid'] = True# 默认显示网格
也可以使用样式表:
plt.style.use('ggplot') # 可选:'seaborn', 'classic', 'dark_background'
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['Heiti TC', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 数据
months = ['1月', '2月', '3月', '4月', '5月']
sales = [120, 135, 150, 170, 190]
costs = [80, 85, 95, 105, 115]
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制折线图
plt.plot(months, sales, 'b-o', linewidth=2, markersize=8, label='销售额')
plt.plot(months, costs, 'r--s', linewidth=2, markersize=8, label='成本')
# 标题与标签
plt.title('2025年上半年销售趋势', fontsize=16, fontweight='bold', pad=15)
plt.xlabel('月份', fontsize=12)
plt.ylabel('金额(万元)', fontsize=12)
# 图例
plt.legend(loc='upper left', fontsize=11, frameon=True, shadow=True)
# 网格
plt.grid(True, linestyle='--', alpha=0.6)
# 标注利润最大月份
profits = [s - c for s, c inzip(sales, costs)]
max_profit_month = months[profits.index(max(profits))]
max_profit = max(profits)
plt.annotate(f'最高利润: {max_profit}万',
xy=(max_profit_month, sales[profits.index(max(profits))]),
xytext=(3.2, 150),
arrowprops=dict(facecolor='black', arrowstyle='->'))
# 保存图片
plt.savefig('sales_report.png', dpi=300, bbox_inches='tight')
plt.show()
annotate完成点位标注。rcParams['font.sans-serif']并关闭负号显示问题 axes.unicode_minus。label参数。savefig保存图片为空白:将 savefig()调用放在 plt.show()之前。alpha是否设置过低。plt.axis()手动固定坐标轴范围。Day49:子图与布局 – subplot, axes, 多图排列
我们将学习如何在同一张画布中绘制多个子图,以及各类灵活的布局控制方式。