Python 数据分析常用图表绘制指南
在数据分析与可视化领域,选择合适的图表能够直观地展示数据特征、趋势及分布。本文详细介绍了 Python 中常用的 12 种图表类型,对比了 Matplotlib 和 Seaborn 两种主流库的用法,并提供完整的代码示例与适用场景分析。
环境准备
默认所有操作均基于以下库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置绘图风格
plt.style.use('seaborn-v0_8')
sns.set_theme(style="whitegrid")
1. 折线图 (Line Plot)
折线图主要用于展示数据随时间变化的趋势,适合连续型数据的序列分析。
代码示例
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# Matplotlib
plt.figure(figsize=(10, 6))
plt.plot(x, y, marker='o', linestyle='-', color='b')
plt.title('Yearly Trend')
plt.xlabel('Year')
plt.ylabel('Value')
plt.grid(True)
plt.show()
# Seaborn
df = pd.DataFrame({'x': x, 'y': y})
plt.figure(figsize=(10, 6))
sns.lineplot(data=df, x='x', y='y', marker='o')
plt.title('Seaborn Line Plot')
plt.show()
注意事项
- 适用于时间序列或有序分类数据。
- 可通过
linestyle调整线条样式,marker添加数据点标记。
2. 直方图 (Histogram)
直方图用于展示连续变量的频率分布,将横坐标划分为若干区间,用矩形条表示各区间内的数值频数。
代码示例
a = np.random.randn(1000)
s = pd.Series(a)
# Matplotlib
plt.hist(s, bins=30, edgecolor='black', alpha=0.7)
plt.title('Distribution Histogram')
plt.show()
# Seaborn
plt.figure(figsize=(10, 6))
sns.histplot(s, kde=False, bins=30, color='skyblue')
plt.title('Seaborn Histogram')
plt.show()
# 带核密度估计
sns.histplot(s, kde=True, bins=30, color='salmon')
plt.show()
注意事项
bins参数控制分组数量,影响分布细节。- 结合 KDE(核密度估计)可观察平滑的概率密度曲线。
3. 垂直条形图 (Bar Chart)
条形图用于比较不同类别的数据大小,长条长度代表频数或数值,宽度代表类别。
代码示例
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
# Matplotlib
plt.bar(x, y, color='steelblue')
plt.title('Vertical Bar Chart')
plt.ylabel('Frequency')
plt.show()
# Seaborn
df_bar = pd.DataFrame({'Category': x, 'Value': y})
plt.figure(figsize=(10, 6))
sns.barplot(data=df_bar, x='Category', y='Value', palette='viridis')
plt.title('Seaborn Bar Chart')
plt.show()
注意事项
- 适用于离散分类数据。
- Seaborn 支持自动置信区间显示(通过
ci参数)。
4. 水平条形图 (Horizontal Bar Chart)
当类别名称较长时,水平条形图能提供更好的可读性。
代码示例
plt.barh(x, y, color='coral')
plt.title('Horizontal Bar Chart')
plt.xlabel('Frequency')
plt.show()
注意事项
- 使用
barh函数实现。 - 适合类别标签较长的情况。
5. 饼图 (Pie Chart)
饼图展示部分占整体的比例关系,但仅适用于类别较少且差异明显的场景。
代码示例
nums = [25, 37, 33, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
plt.figure(figsize=(8, 8))
plt.pie(nums, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title('Education Level Distribution')
plt.axis('equal')
plt.show()
注意事项
- 避免类别过多导致难以辨认。
- 建议配合图例使用。
6. 箱线图 (Box Plot)
箱线图展示数据的五数概括(最小值、下四分位数、中位数、上四分位数、最大值),用于分析数据的离散程度和异常值。
代码示例
# 生成随机数据
data = np.random.normal(size=(10, 4))
lables = ['A', 'B', 'C', 'D']
# Matplotlib
plt.figure(figsize=(10, 6))
plt.boxplot(data, labels=lables, patch_artist=True)
plt.title('Matplotlib Boxplot')
plt.show()
# Seaborn
df_box = pd.DataFrame(data, columns=lables)
plt.figure(figsize=(10, 6))
sns.boxplot(data=df_box)
plt.title('Seaborn Boxplot')
plt.show()
注意事项
- 箱体范围覆盖中间 50% 数据。
- 须点通常表示异常值。
7. 热力图 (Heatmap)
热力图通过颜色深浅表示矩阵元素的大小,适合展示相关性矩阵或二维数据分布。
代码示例
# 简单矩阵
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ax = sns.heatmap(data, annot=True, cmap='YlGnBu')
plt.title('Simple Heatmap')
plt.show()
# 真实数据集
flights = sns.load_dataset("flights")
data_flights = flights.pivot('year', 'month', 'passengers')
plt.figure(figsize=(12, 8))
sns.heatmap(data_flights, annot=False, cmap='coolwarm')
plt.title('Passenger Volume Heatmap')
plt.show()
注意事项
- 颜色映射 (
cmap) 影响视觉效果。 annot=True可在单元格显示数值。
8. 散点图 (Scatter Plot)
散点图展示两个变量之间的关系,是探索相关性最常用的工具。
代码示例
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# Matplotlib
plt.scatter(x, y, marker='x', alpha=0.5)
plt.title('Scatter Plot')
plt.show()
# Seaborn
df_scatter = pd.DataFrame({'x': x, 'y': y})
plt.figure(figsize=(10, 6))
sns.jointplot(x='x', y='y', data=df_scatter, kind='scatter')
plt.show()
注意事项
- 点密度反映数据集中区域。
- 可结合回归线分析线性关系。
9. 雷达图 (Radar Chart)
雷达图用于显示多变量数据,适合评估对象在多个维度上的表现。
代码示例
labels = np.array(["推进", "KDA", "生存", "团战", "发育", "输出"])
stats = [83, 61, 95, 67, 76, 88]
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False)
stats = np.concatenate((stats, [stats[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
ax.set_thetagrids(angles * 180 / np.pi, labels, fontproperties="SimHei")
plt.title('Performance Radar Chart')
plt.show()
注意事项
- 需处理中文字体显示问题。
- 闭合路径需重复第一个点。
10. 二元变量分布 (Joint Plot)
联合分布图同时展示两个变量的散点分布及其边缘分布。
代码示例
tips = sns.load_dataset("tips")
# 散点
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
plt.show()
# 核密度
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
plt.show()
# Hexbin
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')
plt.show()
注意事项
kind参数决定子图类型。- 适合分析变量间的相关性与分布形态。
11. 面积图 (Area Chart)
面积图强调数量随时间的变化程度,堆积面积图可显示部分与整体的关系。
代码示例
df_area = pd.DataFrame(
np.random.rand(10, 4),
columns=['a', 'b', 'c', 'd'])
# 堆叠面积图
df_area.plot.area(figsize=(10, 6))
plt.title('Stacked Area Chart')
plt.show()
# 非堆叠面积图
df_area.plot.area(stacked=False, figsize=(10, 6))
plt.title('Non-stacked Area Chart')
plt.show()
注意事项
- 堆积图需注意总量是否恒定。
- 适合展示趋势和构成变化。
12. 六边形图 (Hexbin Plot)
六边形图将空间中的点聚合成六边形,根据内部点数上色,适合大数据量散点图的降维展示。
代码示例
df_hex = pd.DataFrame(
np.random.randn(1000, 2),
columns=['a', 'b'])
df_hex['b'] = df_hex['b'] + np.arange(1000)
plt.figure(figsize=(8, 8))
df_hex.plot.hexbin(x='a', y='b', gridsize=25, cmap='Blues')
plt.title('Hexbin Plot')
plt.colorbar(label='Count')
plt.show()
注意事项
gridsize控制六边形数量。- 比散点图更适合百万级数据。
总结与选型建议
选择合适的图表是数据分析的关键步骤。以下是常见场景的选型参考:
| 数据类型 | 推荐图表 |
|---|---|
| 时间序列趋势 | 折线图、面积图 |
| 类别比较 | 条形图、柱状图 |
| 占比关系 | 饼图、环形图 |
| 分布形态 | 直方图、箱线图、KDE |
| 变量关系 | 散点图、气泡图、热力图 |
| 多维数据 | 雷达图、平行坐标图 |
掌握这些基础图表的绘制方法,能够帮助你更高效地完成数据洞察工作。在实际项目中,建议先明确分析目标,再选择最合适的可视化方案。

