一、案例目标
通过一个综合案例,掌握以下高级技巧:
-
复杂子图布局(GridSpec)
-
双Y轴图表
-
3D曲面图与散点图组合
-
动态颜色映射
-
专业样式配置
二、完整代码实现
python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.gridspec import GridSpec
plt.style.use('seaborn-darkgrid') # 使用专业样式
# ==================== 数据准备 ====================
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.random.normal(0, 0.5, 100)
# 3D数据生成
X, Y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# ==================== 创建画布布局 ====================
fig = plt.figure(figsize=(18, 12), dpi=100)
gs = GridSpec(3, 3, figure=fig) # 3行3列网格
# ==================== 主波形图 ====================
ax1 = fig.add_subplot(gs[0:2, 0:2]) # 占据前两行前两列
# 绘制双Y轴
ax1.plot(x, y1, color='#FF6B6B', lw=2, label='Sin Wave')
ax1.set_ylabel('Amplitude (Sin)', color='#FF6B6B')
ax2 = ax1.twinx()
ax2.plot(x, y2, color='#4ECDC4', lw=2, label='Cos Wave')
ax2.set_ylabel('Amplitude (Cos)', color='#4ECDC4')
# 样式优化
ax1.tick_params(axis='y', colors='#FF6B6B')
ax2.tick_params(axis='y', colors='#4ECDC4')
ax1.set_title('Waveform Analysis', pad=20, fontsize=14)
# ==================== 3D曲面图 ====================
ax3 = fig.add_subplot(gs[0:2, 2], projection='3d')
# 曲面绘制
surf = ax3.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth=0, antialiased=True)
# 添加颜色条
fig.colorbar(surf, ax=ax3, shrink=0.6, aspect=10)
ax3.set_title('3D Surface Plot', y=1.02)
# ==================== 散点分布图 ====================
ax4 = fig.add_subplot(gs[2, 0])
colors = np.where(y3 > 0, '#FF6B6B', '#4ECDC4') # 条件着色
ax4.scatter(x, y3, c=colors, s=50, alpha=0.8, edgecolor='white')
ax4.axhline(0, color='gray', linestyle='--')
ax4.set_title('Noise Distribution')
# ==================== 直方图 ====================
ax5 = fig.add_subplot(gs[2, 1:])
ax5.hist(y3, bins=30, color='#45B7D1', edgecolor='white', density=True)
ax5.set_title('Probability Density')
# ==================== 全局优化 ====================
plt.tight_layout(pad=3.0)
fig.suptitle('Advanced Data Visualization Dashboard',
y=1.02, fontsize=16, fontweight='bold')
# 添加图例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2,
loc='upper right', frameon=True)
plt.show()
三、关键技术解析
1. 网格布局(GridSpec)
python
gs = GridSpec(3, 3) # 3行3列网格
ax1 = fig.add_subplot(gs[0:2, 0:2]) # 占据0-2行,0-2列
-
实现自由子图排布
-
支持不规则区域划分
-
比subplots更灵活
2. 双Y轴坐标系
python
ax2 = ax1.twinx() # 共享X轴创建新Y轴
ax2.plot(...) # 在第二Y轴绘制
-
解决量纲不同的数据对比问题
-
保持X轴同步缩放
3. 3D曲面优化
python
surf = ax3.plot_surface(...,
cmap=cm.coolwarm, # 颜色映射
linewidth=0, # 去除网格线
antialiased=True) # 抗锯齿
-
使用专业色图coolwarm
-
开启抗锯齿提升显示质量
-
添加颜色条说明数值范围
4. 条件着色散点图
python
colors = np.where(y3 > 0, '#FF6B6B', '#4ECDC4') # 条件判断
ax4.scatter(..., c=colors) # 应用颜色
-
根据数据特征自动着色
-
增强数据表达力
5. 样式统一配置
python
plt.style.use('seaborn-darkgrid') # 使用预设样式
fig.suptitle(...) # 添加总标题
plt.tight_layout(pad=3.0) # 自动调整间距
-
保持视觉风格统一
-
优化元素间距
-
增强可读性
四、扩展技巧
1. 动态交互
python
from mpl_toolkits.mplot3d import Axes3D
def on_move(event):
if event.inaxes == ax3:
ax3.view_init(elev=event.ydata, azim=event.xdata)
plt.draw()
fig.canvas.mpl_connect('motion_notify_event', on_move)
2. 导出高清图片
python
plt.savefig('dashboard.png',
dpi=300, # 提高分辨率
bbox_inches='tight', # 去除白边
facecolor='white') # 设置背景
3. 动画生成
python
from matplotlib.animation import FuncAnimation
def animate(i):
ax3.view_init(azim=i*4)
return fig
ani = FuncAnimation(fig, animate, frames=90, interval=50)
ani.save('rotation.gif', writer='pillow')
五、最佳实践建议
-
配色方案选择
-
使用 Coolors 生成协调配色
-
遵循WCAG 2.0对比度标准
-
重要数据使用高对比色
-
-
字体优化
pythonplt.rcParams.update({ 'font.family': 'Arial', # 统一字体 'font.size': 12, # 基础字号 'axes.titlesize': 14, # 标题字号 'axes.titleweight': 'bold' # 标题加粗 })
-
性能优化
-
大数据集使用
rasterized=True
-
3D绘图时降低
rstride
和cstride
-
关闭自动缩放
autoscale_on=False
-
通过这个综合案例,您已经掌握了:
-
复杂布局的精确控制
-
多维数据的协同展示
-
专业样式的配置方法
-
交互功能的实现基础