跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 绘图:Matplotlib、Seaborn 和 Plotly 的常见图表与代码

用 Matplotlib 实现折线图、柱状图、散点图,用 Seaborn 画直方图、箱线图、热力图,以及用 Plotly 生成交互式图表和 3D 散点图。附带代码和效果说明。

AiEngineer发布于 2026/6/27更新于 2026/9/841 浏览
Python 绘图:Matplotlib、Seaborn 和 Plotly 的常见图表与代码

平时用 Python 画图,基本就是这三种状况:需要精细控制细节时用 Matplotlib,想快速画出统计图用 Seaborn,要放到网页上做交互展示就用 Plotly。我把常用图表的代码和效果整理在这里,方便下次直接抄。

安装

pip install matplotlib seaborn plotly

Matplotlib

Matplotlib 是最老的绘图库,调整起来麻烦但灵活。下面几个基础图表几乎每次都会用到。

折线图

看趋势变化,比如销售额月变化。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据(2023 年各月销售额,单位:万元)
months = np.arange(1, 13)  # [1, 2, ..., 12]
sales = [50, 60, 55, 70, 80, 90, 85, 100, 110, 120, 130, 180]

# 绘制折线图
plt.figure(figsize=(10, 5))  # 设置画布大小(宽 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
# 虚线网格,透明度 0.5
# 显示图例
# 显示图表(IDE 中会弹出窗口,Jupyter 中直接显示)

折线图示例

出来的图显示销售额逐月上升,12月达到峰值。

柱状图

比较不同类别的数据,比如各城市销售额。

import matplotlib.pyplot as plt

# 准备数据(2023 年 Q4 各城市销售额)
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)  # ha: 水平对齐

# 设置标题和轴标签
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

# 生成模拟数据(身高 cm,体重 kg)
np.random.seed(42)  # 固定随机数,结果可复现
height = np.random.normal(170, 5, 100)  # 均值 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,  # 透明度(0.6 避免重叠看不清)
            s=30,  # 点大小
            edgecolor='black')  # 点边框颜色

# 添加拟合直线(显示相关性)
m, b = np.polyfit(height, weight, 1)  # 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

# 生成模拟数据(班级数学成绩,均值 75,标准差 10,100 人)
np.random.seed(42)
scores = np.random.normal(75, 10, 100)

# 用 Seaborn 绘制直方图(带核密度曲线)
plt.figure(figsize=(8, 5))
sns.histplot(scores, bins=15,  # 分 15 个区间
             kde=True,  # 显示核密度曲线(平滑的分布趋势)
             color='#FF5722',  # 直方图颜色
             edgecolor='black')  # 边框颜色

# 设置标题和标签
plt.title('班级数学成绩分布直方图', fontsize=14)
plt.xlabel('分数', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.show()

直方图示例

成绩主要集中在70-80分,形状接近正态。

箱线图

比较不同组的分布情况,包括中位数和异常值。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 补充缺失的 numpy 导入

# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体(Windows 常用)
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号(避免负数符号乱码)

# 生成模拟数据(3 个班级的数学成绩)
np.random.seed(42)
data = {
    '班级': ['A'] * 50 + ['B'] * 50 + ['C'] * 50,
    '成绩': np.concatenate([
        np.random.normal(75, 8, 50),  # A 班:均值 75,波动大
        np.random.normal(80, 5, 50),  # B 班:均值 80,波动小
        np.random.normal(70, 10, 50)  # C 班:均值 70,波动大
    ])
}
df = pd.DataFrame(data)

# 绘制箱线图(修复 palette 警告)
plt.figure(figsize=(10, 6))
sns.boxplot(x='班级', y='成绩', data=df, palette='Set2',  # 颜色主题
            width=0.6,  # 箱子宽度
            showfliers=True,  # 显示异常值
            hue='班级',  # 关键修改:将 x 变量赋值给 hue 以避免警告
            legend=False)  # 关闭重复的图例(因为 hue 和 x 是同一变量)

# 设置标题和标签(中文已正常显示)
plt.title('不同班级数学成绩箱线图', fontsize=14)
plt.xlabel('班级', fontsize=12)
plt.ylabel('成绩', fontsize=12)
plt.show()

箱线图示例

B班成绩最稳定,C班波动大,还有异常值。

热力图

展示变量间的相关性矩阵。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 生成模拟数据(5 个变量的相关系数矩阵)
np.random.seed(42)
corr_matrix = np.round(np.random.rand(5, 5), 2)  # 生成 0-1 的随机数,保留 2 位小数
np.fill_diagonal(corr_matrix, 1)  # 对角线设为 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,  # x 轴标签
            yticklabels=features,  # y 轴标签
            linewidths=0.5,  # 格子边框宽度
            vmin=-1, vmax=1)  # 颜色范围(相关系数范围 -1 到 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

# 准备数据(2023 年各月销售额)
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

# 生成模拟数据(x, y, z 坐标,颜色用类别区分)
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)  # 随机分为 3 类
})

# 绘制 3D 散点图
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()

3D 散点图示例

拖动鼠标旋转,观察点的分布。

几个通用的美化技巧

需求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 的接口调整尺寸和标题。

目录

  1. 安装
  2. Matplotlib
  3. 折线图
  4. 准备数据(2023 年各月销售额,单位:万元)
  5. 绘制折线图
  6. 添加图表标题和轴标签
  7. 添加网格和图例
  8. 显示图表(IDE 中会弹出窗口,Jupyter 中直接显示)
  9. 柱状图
  10. 准备数据(2023 年 Q4 各城市销售额)
  11. 绘制柱状图
  12. 添加数据标签(柱子顶部显示具体数值)
  13. 设置标题和轴标签
  14. 散点图
  15. 生成模拟数据(身高 cm,体重 kg)
  16. 绘制散点图
  17. 添加拟合直线(显示相关性)
  18. 设置标题和标签
  19. Seaborn
  20. 直方图
  21. 生成模拟数据(班级数学成绩,均值 75,标准差 10,100 人)
  22. 用 Seaborn 绘制直方图(带核密度曲线)
  23. 设置标题和标签
  24. 箱线图
  25. 补充缺失的 numpy 导入
  26. 设置中文字体(解决中文显示问题)
  27. 生成模拟数据(3 个班级的数学成绩)
  28. 绘制箱线图(修复 palette 警告)
  29. 设置标题和标签(中文已正常显示)
  30. 热力图
  31. 生成模拟数据(5 个变量的相关系数矩阵)
  32. 变量名(模拟特征)
  33. 绘制热力图
  34. Plotly
  35. 交互式折线图
  36. 准备数据(2023 年各月销售额)
  37. 绘制交互式折线图
  38. 自定义线条样式
  39. 显示图表(自动在浏览器打开,支持缩放、悬停)
  40. 3D 散点图
  41. 生成模拟数据(x, y, z 坐标,颜色用类别区分)
  42. 绘制 3D 散点图
  43. 自定义视角(初始显示角度)
  44. 几个通用的美化技巧
  45. 怎么选

更多推荐文章

查看全部
  • Flutter 三方库 ethereum_addresses 的鸿蒙化适配指南
  • Spring Boot 实现后端 Bot 管理系统的 CRUD 操作
  • 前后端接口 404/405/500 状态码排查与解决指南
  • AI 时代 SQL 学习指南:初级开发者如何平衡导航与直觉
  • Dify 私有化部署教程:搭建专属 AI 知识库平台
  • HarmonyOS 应用安全开发:权限控制与隐私合规上架
  • 本地电脑使用 Ollama 部署大模型并安装 Chatbox 指南
  • STL list 容器模拟实现与核心原理
  • 2026 年上半年主流 AIGC 长文本写作软件实测:5 款头部工具优缺点解析
  • 基于 Spring Boot 3.5.x + Sa-Token + MyBatis Flex 的企业级文件管理系统 Free-FS
  • AWK 逻辑控制综合实践:网络与文件信息统计
  • 鸿蒙金融理财全栈项目:风险控制、合规审计与产品创新
  • 大模型与 RAG 技术全面解析
  • C++ 类与对象进阶:初始化列表、静态成员与编译器优化实战
  • Python+Uniapp 婚恋交友小程序设计与实现
  • OpenClaw 技能精选:本地 AI 助手超级插件市场指南
  • Flutter Web 混合开发:构建跨平台 Web 应用
  • 基于 Web-Check 和 cpolar 的远程网站安全检测方案
  • AI 图像生成提示词工程:新手入门与最佳实践
  • 通义万相 2.1 多模态生成技术解析与云端部署实践

相关免费在线工具

  • 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