Python数据可视化进阶:Matplotlib与Seaborn实战技巧大全
一、专业图表设计原则
使用Python 3.10+和最新可视化库创建出版级图表:
import matplotlib.pyplot as plt
import seaborn as sns
# 设置全局样式
plt.style.use('seaborn')
sns.set_palette("husl")
plt.rcParams['font.family'] = 'SimHei' # 中文字体支持
# 创建基础图表
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_title("2023年销售趋势", fontsize=14, pad=20)
ax.set_xlabel("季度", fontsize=12)
ax.set_ylabel("销售额(万)", fontsize=12)
五大设计准则:信息清晰、视觉层次、色彩协调、标注完整、比例适当
二、Matplotlib高级技巧
1. 多子图精准控制
# 使用GridSpec创建复杂布局
fig = plt.figure(figsize=(12, 8))
gs = fig.add_gridspec(3, 3)
ax1 = fig.add_subplot(gs[0, :]) # 首行通栏
ax2 = fig.add_subplot(gs[1:, 0]) # 左侧长栏
ax3 = fig.add_subplot(gs[1, 1])
ax4 = fig.add_subplot(gs[2, 1])
ax5 = fig.add_subplot(gs[1:, 2]) # 右侧长栏
# 设置子图间距
plt.tight_layout(pad=2, w_pad=3, h_pad=3)
2. 动态可视化
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
x, y = [], []
line, = ax.plot([], [], 'r-')
def init():
ax.set_xlim(0, 10)
ax.set_ylim(-1, 1)
return line,
def update(frame):
x.append(frame)
y.append(np.sin(frame))
line.set_data(x, y)
return line,
ani = FuncAnimation(fig, update, frames=np.linspace(0, 10, 100),
init_func=init, blit=True)
plt.show()
三、Seaborn高级应用
1. 多变量关系分析
# 使用PairGrid分析多维关系
iris = sns.load_dataset("iris")
g = sns.PairGrid(iris, hue="species")
g.map_diag(sns.histplot)
g.map_offdiag(sns.scatterplot)
g.add_legend()
2. 热力图优化
# 带注释的热力图
flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
plt.figure(figsize=(10, 8))
ax = sns.heatmap(flights, annot=True, fmt="d",
cmap="YlGnBu", linewidths=.5)
# 旋转刻度标签
plt.setp(ax.get_xticklabels(), rotation=45)
plt.setp(ax.get_yticklabels(), rotation=0)
四、实战案例:电商数据分析
1. 销售漏斗可视化
# 使用饼图+环形图组合
fig, ax = plt.subplots(figsize=(8, 8))
# 外层环形
wedges, texts = ax.pie(
[30, 25, 15, 8, 5],
radius=1,
labels=["访问", "加购", "下单", "支付", "复购"],
wedgeprops=dict(width=0.3, edgecolor='w'))
# 内层饼图
ax.pie([70, 30], radius=0.7, colors=['lightgray', 'white'],
wedgeprops=dict(width=0.3, edgecolor='w'))
# 添加中心标题
ax.text(0, 0, "转化率n分析", ha='center',
va='center', fontsize=14)
plt.tight_layout()
五、性能优化与导出
- 大数据集:使用rasterized=True加速渲染
- 矢量输出:PDF/SVG格式适合出版
- Web应用:转换为Base64嵌入HTML
- 交互图表:使用mpld3转换为D3.js
# 高质量导出设置
fig.savefig("sales_report.png",
dpi=300,
bbox_inches='tight',
transparent=True,
quality=95)
# 转换为Base64
import base64
from io import BytesIO
buf = BytesIO()
fig.savefig(buf, format='png')
img_str = base64.b64encode(buf.getvalue()).decode()