跳到主要内容Python 绘图:Matplotlib、Seaborn 和 Plotly 的常见图表与代码 | 极客日志Python
Python 绘图:Matplotlib、Seaborn 和 Plotly 的常见图表与代码
用 Matplotlib 实现折线图、柱状图、散点图,用 Seaborn 画直方图、箱线图、热力图,以及用 Plotly 生成交互式图表和 3D 散点图。附带代码和效果说明。
平时用 Python 画图,基本就是这三种状况:需要精细控制细节时用 Matplotlib,想快速画出统计图用 Seaborn,要放到网页上做交互展示就用 Plotly。我把常用图表的代码和效果整理在这里,方便下次直接抄。
安装
pip install matplotlib seaborn plotly
Matplotlib
Matplotlib 是最老的绘图库,调整起来麻烦但灵活。下面几个基础图表几乎每次都会用到。
折线图
看趋势变化,比如销售额月变化。
import matplotlib.pyplot as plt
import numpy as np
months = np.arange(1, 13)
sales = [50, 60, 55, 70, 80, 90, 85, 100, 110, 120, 130, 180]
plt.figure(figsize=(10, 5))
plt.plot(months, sales, color='blue',
marker='o',
linestyle='-',
linewidth=2,
label='月销售额')
plt.title('2023 年各月销售额趋势图', fontsize=14, fontweight='bold')
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=)
plt.grid(, linestyle=, alpha=)
plt.legend()
plt.show()
12
True
'--'
0.5
柱状图
import matplotlib.pyplot as plt
cities = ['北京', '上海', '广州', '深圳']
sales = [150, 180, 120, 160]
plt.figure(figsize=(8, 5))
plt.bar(cities, sales, color=['#4CAF50', '#2196F3', '#FF9800', '#E91E63'],
edgecolor='black',
width=0.6)
for i, v in enumerate(sales):
plt.text(i, v + 5, f'{v}万元', ha='center', fontsize=10)
plt.title('2023 年 Q4 各城市销售额对比', fontsize=14)
plt.xlabel('城市', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
plt.show()
散点图
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
height = np.random.normal(170, 5, 100)
weight = 0.7 * height + np.random.normal(0, 3, 100)
plt.figure(figsize=(8, 6))
plt.scatter(height, weight, color='red',
alpha=0.6,
s=30,
edgecolor='black')
m, b = np.polyfit(height, weight, 1)
plt.plot(height, m * height + b, color='blue', linewidth=2, label='拟合直线')
plt.title('身高与体重相关性分析', fontsize=14)
plt.xlabel('身高(cm)', fontsize=12)
plt.ylabel('体重(kg)', fontsize=12)
plt.legend()
plt.show()
Seaborn
Seaborn 封装了更多统计图形,几行代码就能出漂亮的图。
直方图
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
scores = np.random.normal(75, 10, 100)
plt.figure(figsize=(8, 5))
sns.histplot(scores, bins=15,
kde=True,
color='#FF5722',
edgecolor='black')
plt.title('班级数学成绩分布直方图', fontsize=14)
plt.xlabel('分数', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.show()
箱线图
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
np.random.seed(42)
data = {
'班级': ['A'] * 50 + ['B'] * 50 + ['C'] * 50,
'成绩': np.concatenate([
np.random.normal(75, 8, 50),
np.random.normal(80, 5, 50),
np.random.normal(70, 10, 50)
])
}
df = pd.DataFrame(data)
plt.figure(figsize=(10, 6))
sns.boxplot(x='班级', y='成绩', data=df, palette='Set2',
width=0.6,
showfliers=True,
hue='班级',
legend=False)
plt.title('不同班级数学成绩箱线图', fontsize=14)
plt.xlabel('班级', fontsize=12)
plt.ylabel('成绩', fontsize=12)
plt.show()
热力图
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
np.random.seed(42)
corr_matrix = np.round(np.random.rand(5, 5), 2)
np.fill_diagonal(corr_matrix, 1)
corr_matrix = (corr_matrix + corr_matrix.T) / 2
features = ['特征 1', '特征 2', '特征 3', '特征 4', '特征 5']
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True,
cmap='coolwarm',
xticklabels=features,
yticklabels=features,
linewidths=0.5,
vmin=-1, vmax=1)
plt.title('变量间相关系数热力图', fontsize=14)
plt.show()
特征1和2正相关0.85,特征3和5负相关-0.32,对角线为1。
Plotly
Plotly 生成的图能够交互,支持悬停、缩放、旋转,适合放在网页里。
交互式折线图
import plotly.express as px
import pandas as pd
data = {'月份': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
'销售额': [50, 60, 55, 70, 80, 90, 85, 100, 110, 120, 130, 180]}
df = pd.DataFrame(data)
fig = px.line(df, x='月份', y='销售额', title='2023 年各月销售额(交互式)',
labels={'销售额': '销售额(万元)'},
template='plotly_white')
fig.update_traces(line=dict(color='blue', width=2, dash='solid'),
marker=dict(size=8, color='red'))
fig.show()
3D 散点图
import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
'x': np.random.rand(100),
'y': np.random.rand(100),
'z': np.random.rand(100),
'类别': np.random.choice(['A', 'B', 'C'], 100)
})
fig = px.scatter_3d(df, x='x', y='y', z='z', color='类别',
size_max=10,
opacity=0.7,
title='3D 散点图示例')
fig.update_layout(scene=dict(
xaxis_title='X 轴',
yaxis_title='Y 轴',
zaxis_title='Z 轴'
))
fig.show()
几个通用的美化技巧
| 需求 | Matplotlib 示例 |
|---|
| 字体变大/加粗 | plt.title('标题', fontsize=14, fontweight='bold') |
| 避免 x 轴标签重叠 | plt.xticks(rotation=45)(旋转 45 度) |
| 调整颜色主题 | 使用 Seaborn 的 sns.set_palette('pastel')(柔和色调) |
| 添加图表注释 | plt.annotate('峰值', xy=(12, 180), xytext=(10, 160), arrowprops=dict(arrowstyle='->'))(在 (12,180) 处加箭头注释) |
| 保存图表为图片 | plt.savefig('销售额图.png', dpi=300, bbox_inches='tight')(dpi=300 高清,bbox_inches='tight'去除白边) |
怎么选
日常用得最多的还是折线、柱状、散点这三种 Matplotlib 图,因为可以完全控制外观。做统计分析的时候 Seaborn 的直方图、箱线图、热力图能省很多事。如果需要给老板或用户看交互效果,就用 Plotly。实际项目中我常常混着用,比如用 Seaborn 画箱线图,然后调用 Matplotlib 的接口调整尺寸和标题。
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online