背景/问题
你是否遇到这样的情况:辛辛苦苦分析的数据,用Excel做的图表太丑拿不出手?看到别人做的数据可视化很酷炫,自己却不知道怎么实现?想要做数据分析但不知道从哪里开始?
Python的数据可视化生态非常强大,从简单的折线图到复杂的交互式图表都能轻松实现。这篇教程将带你快速掌握Python数据可视化的核心技能。
环境信息
- 操作系统:Windows/Mac/Linux
- Python版本:Python 3.8+
- 相关依赖:
pip install pandas matplotlib seaborn numpy
一、数据准备
1.1 导入库
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial']
plt.rcParams['axes.unicode_minus'] = False
1.2 创建示例数据
# 创建销售数据
data = {
'月份': ['1月', '2月', '3月', '4月', '5月', '6月'],
'销售额': [12000, 15000, 18000, 16000, 21000, 25000],
'成本': [8000, 9500, 11000, 10000, 13000, 15000],
'利润率': [33, 37, 39, 38, 38, 40]
}
df = pd.DataFrame(data)
二、基础图表
2.1 折线图
# 简单折线图
plt.figure(figsize=(10, 6))
plt.plot(df['月份'], df['销售额'], marker='o')
plt.title('月度销售额趋势')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
plt.grid(True)
plt.savefig('line_chart.png', dpi=150, bbox_inches='tight')
plt.show()
2.2 柱状图
# 带数值标注的柱状图
plt.figure(figsize=(10, 6))
bars = plt.bar(df['月份'], df['销售额'], color='steelblue')
plt.title('月度销售额对比')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
# 添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, height + 500,
f'{int(height)}', ha='center', va='bottom')
plt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')
plt.show()
2.3 饼图
# 市场份额饼图
market_data = {'产品A': 35, '产品B': 25, '产品C': 20, '产品D': 15, '其他': 5}
plt.figure(figsize=(8, 8))
plt.pie(market_data.values(), labels=market_data.keys(),
autopct='%1.1f%%', startangle=90)
plt.title('产品市场份额分布')
plt.savefig('pie_chart.png', dpi=150, bbox_inches='tight')
plt.show()
三、组合图表
3.1 双轴图表
# 双Y轴图表:销售额和利润率
fig, ax1 = plt.subplots(figsize=(12, 6))
# 左Y轴:销售额
ax1.bar(df['月份'], df['销售额'], alpha=0.7, color='steelblue', label='销售额')
ax1.set_xlabel('月份')
ax1.set_ylabel('销售额(元)', color='steelblue')
ax1.tick_params(axis='y', labelcolor='steelblue')
# 右Y轴:利润率
ax2 = ax1.twinx()
ax2.plot(df['月份'], df['利润率'], marker='o', color='orangered', linewidth=2, label='利润率')
ax2.set_ylabel('利润率(%)', color='orangered')
ax2.tick_params(axis='y', labelcolor='orangered')
plt.title('月度销售与利润率分析')
fig.legend(loc='upper right', bbox_to_anchor=(0.88, 0.88))
plt.savefig('dual_axis.png', dpi=150, bbox_inches='tight')
plt.show()
3.2 子图布局
# 四宫格子图
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 图1:销售额趋势
axes[0, 0].plot(df['月份'], df['销售额'], marker='o', color='steelblue')
axes[0, 0].set_title('销售额趋势')
axes[0, 0].grid(True)
# 图2:成本对比
axes[0, 1].bar(df['月份'], df['成本'], color='coral')
axes[0, 1].set_title('月度成本')
# 图3:利润率变化
axes[1, 0].fill_between(df['月份'], df['利润率'], alpha=0.3, color='green')
axes[1, 0].plot(df['月份'], df['利润率'], marker='s', color='green')
axes[1, 0].set_title('利润率变化')
# 图4:销售额占比
axes[1, 1].pie(df['销售额'], labels=df['月份'], autopct='%1.1f%%')
axes[1, 1].set_title('各月销售占比')
plt.suptitle('销售数据综合分析', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.savefig('subplots.png', dpi=150, bbox_inches='tight')
plt.show()
四、Seaborn高级可视化
4.1 热力图
# 相关性热力图
np.random.seed(42)
data = pd.DataFrame({
'A': np.random.randn(100),
'B': np.random.randn(100),
'C': np.random.randn(100),
'D': np.random.randn(100),
'E': np.random.randn(100)
})
corr = data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0,
square=True, linewidths=0.5)
plt.title('变量相关性热力图')
plt.savefig('heatmap.png', dpi=150, bbox_inches='tight')
plt.show()
4.2 分布图
# 带分布的散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x='销售额', y='成本', data=df, s=100,
hue='月份', palette='Set2')
plt.title('销售额与成本关系')
plt.savefig('scatter.png', dpi=150, bbox_inches='tight')
plt.show()
4.3 箱线图
# 箱线图展示数据分布
plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['销售额', '成本']], palette='Set3')
plt.title('销售额与成本分布对比')
plt.savefig('boxplot.png', dpi=150, bbox_inches='tight')
plt.show()
五、样式和美化
5.1 主题设置
# 使用Seaborn内置主题
sns.set_style('whitegrid')
sns.set_palette('husl')
# 或使用Matplotlib样式
plt.style.use('seaborn-v0_8-darkgrid')
5.2 颜色方案
# 自定义颜色
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7']
# 渐变色
cmap = plt.cm.RdYlGn
5.3 保存高清图片
# DPI设置
plt.savefig('chart.png', dpi=300, bbox_inches='tight',
facecolor='white', edgecolor='none')
六、常见问题/踩坑记录
问题 1:中文字体显示乱码
错误信息:图表中的中文显示为方块
解决方案:
# 方法1:指定中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 方法2:下载并使用支持中文的字体
# 方法3:直接显示英文,添加中文图例
问题 2:图表中文本显示被遮挡
原因分析:文字太密集或位置不当
解决方案:
plt.tight_layout() # 自动调整布局
# 或手动调整
plt.subplots_adjust(top=0.9, bottom=0.1)
问题 3:数据量太大时图表渲染很慢
解决方案:
- 使用
plt.switch_backend('agg')后端 - 先对数据采样再绘图
- 使用静态图片格式而非交互式
七、最佳实践总结
常用图表选择指南
| 数据类型 | 推荐图表 |
|---|---|
| 趋势变化 | 折线图 |
| 比较大小 | 柱状图 |
| 占比分布 | 饼图、环形图 |
| 相关性 | 散点图、热力图 |
| 分布情况 | 箱线图、直方图 |
图表美化建议
- 标题要清晰,不要过度装饰
- 颜色不要超过5种
- 坐标轴标签要完整
- 关键数据可以添加标注
- 保持风格统一
推荐学习资源
- Matplotlib官方文档:https://matplotlib.org
- Seaborn官方文档:https://seaborn.pydata.org
- Python Graph Gallery:https://www.python-graph-gallery.com
掌握Python数据可视化后,你可以:
- 用图表清晰展示数据分析结果
- 制作专业的报表和仪表盘
- 用数据讲好故事
- 自动化日常的数据报告
数据可视化是一门需要不断实践的技术,多看多练才能熟练掌握!