Python 数据分析常用图表绘制指南
在数据分析与可视化领域,选择合适的图表能够直观地展示数据特征、趋势及分布。本文详细介绍了 Python 中常用的 12 种图表类型,对比了 Matplotlib 和 Seaborn 两种主流库的用法,并提供完整的代码示例与适用场景分析。
Python 数据分析中常用的图表类型,包括折线图、直方图、条形图、饼图、箱线图、热力图、散点图、雷达图、二元变量分布、面积图和六边形图。通过对比 Matplotlib 和 Seaborn 两种库的用法,提供了详细的代码示例与适用场景分析,帮助读者根据数据特征选择合适的可视化方案,并涵盖了从基础绘图到高级分析的完整流程。

在数据分析与可视化领域,选择合适的图表能够直观地展示数据特征、趋势及分布。本文详细介绍了 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")
折线图主要用于展示数据随时间变化的趋势,适合连续型数据的序列分析。
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 添加数据点标记。直方图用于展示连续变量的频率分布,将横坐标划分为若干区间,用矩形条表示各区间内的数值频数。
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 参数控制分组数量,影响分布细节。条形图用于比较不同类别的数据大小,长条长度代表频数或数值,宽度代表类别。
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()
ci 参数)。当类别名称较长时,水平条形图能提供更好的可读性。
plt.barh(x, y, color='coral')
plt.title('Horizontal Bar Chart')
plt.xlabel('Frequency')
plt.show()
barh 函数实现。饼图展示部分占整体的比例关系,但仅适用于类别较少且差异明显的场景。
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()
箱线图展示数据的五数概括(最小值、下四分位数、中位数、上四分位数、最大值),用于分析数据的离散程度和异常值。
# 生成随机数据
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()
热力图通过颜色深浅表示矩阵元素的大小,适合展示相关性矩阵或二维数据分布。
# 简单矩阵
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 可在单元格显示数值。散点图展示两个变量之间的关系,是探索相关性最常用的工具。
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()
雷达图用于显示多变量数据,适合评估对象在多个维度上的表现。
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()
联合分布图同时展示两个变量的散点分布及其边缘分布。
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 参数决定子图类型。面积图强调数量随时间的变化程度,堆积面积图可显示部分与整体的关系。
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()
六边形图将空间中的点聚合成六边形,根据内部点数上色,适合大数据量散点图的降维展示。
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 |
| 变量关系 | 散点图、气泡图、热力图 |
| 多维数据 | 雷达图、平行坐标图 |
掌握这些基础图表的绘制方法,能够帮助你更高效地完成数据洞察工作。在实际项目中,建议先明确分析目标,再选择最合适的可视化方案。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online