# Python 数据分析三剑客之 Matplotlib（五）：散点图的绘制

TRHX

2020-04-18

Python 数据分析 / Matplotlib

字数统计:

2,980字

阅读时长≈

14分

Matplotlib 系列文章：

- Python 数据分析三剑客之 Matplotlib（一）：初识 Matplotlib 与其 matplotibrc 配置文件
- Python 数据分析三剑客之 Matplotlib（二）：文本描述 / 中文支持 / 画布 / 网格等基本图像属性
- Python 数据分析三剑客之 Matplotlib（三）：图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性
- Python 数据分析三剑客之 Matplotlib（四）：线性图的绘制
- Python 数据分析三剑客之 Matplotlib（五）：散点图的绘制
- Python 数据分析三剑客之 Matplotlib（六）：直方图 / 柱状图 / 条形图的绘制
- Python 数据分析三剑客之 Matplotlib（七）：饼状图的绘制
- Python 数据分析三剑客之 Matplotlib（八）：等高线 / 等值线图的绘制
- Python 数据分析三剑客之 Matplotlib（九）：极区图 / 极坐标图 / 雷达图的绘制
- Python 数据分析三剑客之 Matplotlib（十）：3D 图的绘制
- Python 数据分析三剑客之 Matplotlib（十一）：最热门最常用的 50 个图表【译文】

专栏：

【NumPy 专栏】【Pandas 专栏】【Matplotlib 专栏】

推荐学习资料与网站：

【NumPy 中文网】【Pandas 中文网】【Matplotlib 中文网】【NumPy、Matplotlib、Pandas 速查表】

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/105914929
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

## 【1x00】方法描述

`matplotlib.pyplot.scatter()` 方法可用于绘制散点图。

本文用到的其他图像属性可参考前面的两篇文章：

《Python 数据分析三剑客之 Matplotlib（二）：文本描述 / 中文支持 / 画布 / 网格等基本图像属性》
《Python 数据分析三剑客之 Matplotlib（三）：图例 / LaTeX / 刻度 / 子图等基本图像属性》

基本语法：`matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, alpha=None, linewidths=None, edgecolors=None, \*\*kwargs)`

参数 | 描述
--- | ---
x,y | 数据位置，标量或类似数组的形式
s | 标记的大小，以磅为单位，默认 `rcParams['lines.markersize'] ** 2`，即 6**2=36
color / c | 标记的颜色，可以是单个颜色或者一个颜色列表 支持英文颜色名称及其简写、十六进制颜色码等，更多颜色示例参见官网 Color Demo
marker | 标记的样式，默认为 `rcParams["scatter.marker"] = 'o'`，更多样式参见表一
cmap | 将浮点数映射成颜色的颜色映射表，即一个 Colormap 实例或注册的颜色表名，仅当 c 是浮点数数组时才使用 cmap
alpha | 标记的透明度，float 类型，取值范围：[0, 1]，默认为 1.0，即不透明
linewidths | 标记边缘的线宽，默认为 `rcParams["lines.linewidth"] = 1.5`
edgecolors | 标记边缘的颜色，可以是单个颜色或者一个颜色列表 支持英文颜色名称及其简写、十六进制颜色码等，更多颜色示例参见官网 Color Demo

表一：marker 标记的样式

标记 | 描述
--- | ---
`"."` | 点
`","` | 像素点
`"o"` | 圆圈
`"v"` | 倒三角
`"^"` | 正三角
`"<"` | 左三角
`">"` | 右三角
`"1"` | 倒三叉星
`"2"` | 正三叉星（类似奔驰车标形状）
`"3"` | 左三叉星
`"4"` | 右三叉星
`"8"` | 八边形
`"s"` | 正方形
`"p"` | 五边形
`"P"` | 填充的加号（粗加号）
`"+"` | 加号
`"*"` | 星形
`"h"` | 六边形（底部是角）
`"H"` | 六边形（底部是边）
`"x"` | x 号
`"X"` | 填充的 x 号（粗 x 号）
`"D"` | 粗菱形（对角线相等）
`"d"` | 细菱形（对角线不等）
`” | “` | 垂直线
`"_"` | 水平线
`0` | 水平线靠左
`1` | 水平线靠右
`2` | 垂直线靠上
`3` | 垂直线靠下
`4` | 左三角（比 `"<"` 更细）
`5` | 右三角（比 `">"` 更细）
`6` | 正三角（比 `"^"` 更细）
`7` | 倒三角（比 `"v"` 更细）
`8` | 左三角（比 `"<"` 更细，靠左显示）
`9` | 右三角（比 `">"` 更细，靠右显示）
`10` | 正三角（比 `"^"` 更细，靠上显示）
`11` | 倒三角（比 `"v"` 更细，靠下显示）
`"None"` / `" "` / `""` | 无样式
`'$...$'` | 支持 LaTeX 数学公式，表达式用美元符号包围起来

## 【2x00】简单示例

    1
    2
    3
    4
    5
    6
    7
    8

    import numpy as np
    import matplotlib.pyplot as plt

    x = np.arange(0, 10, 1)
    y = np.array([3, 8, 1, 5, 7, 2, 3, 4, 5, 7])
    plt.scatter(x, y)

    plt.show()

<fancybox>
</fancybox>

## 【3x00】多条数据

绘制多条数据，设置不同数据，然后多次调用 `plt.scatter()` 函数即可，不同数据的线条颜色会不同，系统随机，可单独指定不同颜色。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(-2*np.pi, 2*np.pi, 1)
    y1 = np.sin(3*x)/x
    y2 = np.sin(2*x)/x
    y3 = np.sin(1*x)/x
    plt.title('多数据散点图示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')

    plt.scatter(x, y1)
    plt.scatter(x, y2)
    plt.scatter(x, y3)

    plt.show()

<fancybox>
</fancybox>

## 【4x00】设置颜色 / 样式 / 图例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = np.arange(-2*np.pi, 2*np.pi, 1)
    y1 = np.sin(3*x)/x
    y2 = np.sin(2*x)/x
    y3 = np.sin(1*x)/x
    plt.title('散点图自定义样式示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')

    plt.scatter(x, y1, color='g', s=30, label='(x, y1)')              # 默认绿色样式
    plt.scatter(x, y2, color='r', s=40, marker='d', label='(x, y2)')  # 红色菱形
    plt.scatter(x, y3, color='b', s=50, marker='2', label='(x, y3)')  # 蓝色正三叉星

    plt.legend(framealpha=0)    # 显示图例，设置为全透明

    plt.show()

<fancybox>
</fancybox>

## 【5x00】指定位置显示文本注释

`matplotlib.pyplot.annotate()` 方法可以在指定位置显示文本注释，参数解释常见前文：
《Python 数据分析三剑客之 Matplotlib（二）：文本描述 / 中文支持 / 画布 / 网格等基本图像属性》

应用举例：

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
    y = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]

    plt.title('散点图添加文本注释示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')
    plt.xlim([0, 1])       # 设置 x 轴刻度的范围
    plt.ylim([0, 1])       # 设置 y 轴刻度的范围

    plt.scatter(x, y, marker='o', s=50)
    for m, n in zip(x, y):
        plt.annotate('(%s,%s)' % (m, n),
                     xy=(m, n),
                     xytext=(0, -10),
                     textcoords='offset points',
                     ha='center',      # 点在注释文本的中心
                     va='top')         # 点在注释文本的上方

    plt.show()

<fancybox>
</fancybox>

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/105914929
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

## 【6x00】随机数据散点图

随机数据可以用 numpy 的 random 模块来实现。

`numpy.random.rand(d0, d1, …, dn)`：根据给定维度生成 [0,1) 之间的数据。

`numpy.random.randn(d0, d1, …, dn)` ：返回一个或一组具有标准正态分布的样本。

`numpy.random.randint(low, high, size)`：返回随机整数，范围区间为 [low,high），size 为数组维度大小

应用举例：

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    N = 1000
    x = np.random.randn(N)
    y = np.random.randn(N)

    plt.title('散点图随机数据示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')
    plt.scatter(x, y, alpha=0.5)

    plt.show()

<fancybox>
</fancybox>

## 【7x00】随机颜色与色条

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    N = 1000
    x = np.random.randn(N)
    y = np.random.randn(N)

    color = np.random.rand(N)
    size = np.random.rand(N) * 1000

    plt.figure(figsize=(8.4, 5.8))    # 设置画布大小 840x580
    plt.title('散点图随机大小颜色示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')
    plt.scatter(x, y, c=color, s=size, alpha=0.5)

    plt.show()

<fancybox>
</fancybox>

可以用 `pyplot.colorbar()` 方法绘制颜色对照条。

基本语法：`matplotlib.pyplot.colorbar([mappable=None, cax=None, ax=None, **kw])`

部分参数解释如下表，其他参数，如长度，宽度等请参考官方文档。

参数 | 描述
--- | ---
mappable | 要设置色条的图像对象，该参数对于 `Figure.colorbar` 方法是必需的，但对于 `pyplot.colorbar` 函数是可选的
cax | 可选项，要绘制色条的轴
ax | 可选项，设置色条的显示位置，通常在一个画布上有多个子图时使用
**kw | 可选项，其他关键字参数，参考官方文档

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    N = 1000
    x = np.random.randn(N)
    y = np.random.randn(N)

    color = np.random.rand(N)
    size = np.random.rand(N) * 1000

    plt.figure(figsize=(8.4, 5.8))
    plt.title('散点图颜色对照条示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')
    plt.scatter(x, y, c=color, s=size, alpha=0.5)
    plt.colorbar()

    plt.show()

<fancybox>
</fancybox>

## 【8x00】不同图像之间的层级调整

`zorder` 参数用于设置不同图像之间的层级关系，数字越大，所处的层级越大，即显示越靠上。

未设置 `zorder` 参数前：

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x1 = np.arange(-2*np.pi, 2*np.pi, 0.01)
    y1 = np.sin(3*x1)/x1
    x2 = np.arange(-2*np.pi, 2*np.pi, 1)
    y2 = np.sin(3*x2)/x2

    plt.title('不同图像之间层级调整示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')

    plt.plot(x1, y1, c='b', linewidth=3.5, label='线性图')
    plt.scatter(x2, y2, c='r', s=40, label='散点图')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

设置 `zorder` 参数后：

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    import numpy as np
    import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    x1 = np.arange(-2*np.pi, 2*np.pi, 0.01)
    y1 = np.sin(3*x1)/x1
    x2 = np.arange(-2*np.pi, 2*np.pi, 1)
    y2 = np.sin(3*x2)/x2

    plt.title('不同图像之间层级调整示例')
    plt.xlabel('x 轴')
    plt.ylabel('y 轴')

    plt.plot(x1, y1, zorder=1, c='b', linewidth=3.5, label='线性图')
    plt.scatter(x2, y2, zorder=2, c='r', s=40, label='散点图')
    plt.legend()

    plt.show()

<fancybox>
</fancybox>

## 【9x00】框选部分数据

有时候我们希望能够框选一部分数据来强调其重要性，`matplotlib.patches.Polygon()` 方法的作用是生成不规则的多边形补丁，`matplotlib.patches` 还有另外的方法可以生成矩形、圆形等其他图形，具体参见前面的文章《Python 数据分析三剑客之 Matplotlib（三）：图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性》，生成补丁之后，通过 `axes.add_patch()` 方法将其添加到绘图区（axes）即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.patches as mpathes

    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

    plt.figure(figsize=(8.4, 5.8))

    x1 = np.arange(0, 1000, 10)
    y1 = np.random.randint(0, 1000, 100)
    x2 = np.arange(0, 500, 10)
    y2 = np.random.randint(200, 800, 50)
    x3 = np.random.randint(50, 800, 80)
    y3 = np.random.randint(50, 800, 80)
    x4 = np.array([0, 100, 300, 400, 350, 500, 450, 367, 420, 490])
    y4 = np.array([267, 800, 453, 500, 600, 420, 380, 503, 390, 600])

    plt.title('散点图数据框选示例', fontsize=15)
    plt.xlabel('x 轴', fontsize=15)
    plt.ylabel('y 轴', fontsize=15)
    plt.scatter(x1, y1, c='r', s=50, alpha=0.7, label='RED')
    plt.scatter(x2, y2, c='b', s=100, alpha=0.7, label='BLUE')
    plt.scatter(x3, y3, c='g', s=150, alpha=0.7, label='GREEN')
    plt.scatter(x4, y4, c='y', s=250, alpha=0.7, label='YELLOW')
    plt.legend(loc='upper right', borderpad=1, edgecolor='k', framealpha=1, labelspacing=1)

    Polygon_point = [[100, 800], [0, 267], [500, 420], [490, 600]]        # 多边形补丁的顶点坐标
    polygon = mpathes.Polygon(Polygon_point, color='#FF69B4', alpha=0.3)  # 绘制补丁，框选部分数据
    ax = plt.gca()          # 获取当前绘图区（gca = Get Current Axes）
    ax.add_patch(polygon)   # 将补丁添加到当前绘图区

    plt.show()

<fancybox>
</fancybox>

    1
    2
    3
    4
    5

    这里是一段防爬虫文本，请读者忽略。
    本文原创首发于 CSDN，作者 TRHX。
    博客首页：https://itrhx.blog.csdn.net/
    本文链接：https://itrhx.blog.csdn.net/article/details/105914929
    未经授权，禁止转载！恶意转载，后果自负！尊重原创，远离剽窃！

您的喜欢是作者写作最大的动力！❤️

- PayPal
- AliPay
- WeChatPay
- QQPay

Donate

最后更新于 2020年8月6日

Matplotlib

散点图

###### 上一页

#### Python 数据分析三剑客之 Matplotlib（六）：直方图/柱状图/条形图的绘制

###### Matplotlib 直方图 柱状图 条形图

###### 下一页

#### Python 数据分析三剑客之 Matplotlib（四）：线性图的绘制

###### Matplotlib 线性图

#### 评论

## ๑۩ﺴ TRHX ﺴ۩๑

本文目录
欢迎光临

Hexo QQ 交流群 Telegram 交流群

CSDN 内容合伙人

文章分类

- BLOG
  (4)
- CDN
  (1)
- Hexo
  (9)
- Java
  (1)
- Linux
  (2)
- Markdown
  (2)
- Python 数据分析
  (27)
- Matplotlib
  (11)
- NumPy
  (6)
- Pandas
  (10)
- Python3 学习笔记
  (41)
- 基础学习
  (9)
- 学习经验
  (4)
- 爬虫学习
  (18)
- 爬虫实战
  (10)
- VPS
  (1)
- WEB前端
  (2)
- 图床
  (1)

热门标签
12306 3D图 58同城 Ajax BLOG Beautiful Soup CDN Coding Pages DataFrame Deepin Elicpse GitHub Pages Github Github Pages GroupBy HTTPS Hexo ICP备案 IO操作 Index JDBC JS 预加载 LaTeX Markdown Material X Matplotlib MongoDB MySQL NumPy PEP8 Pandas PicGo Pygame Python Redis SEO SQL Server 2012 SSR Selenium Series Ubuntu User-Agent VMware VPS XPath if语句 input()函数 instant.page jsDelivr lxml matplotibrc pyspider requests spfk urllib while循环 主题个性化 代理 位运算 公安备案 函数 函数应用 分割 切片 列表 判断函数 前程无忧 变量 合并数据集 哔哩哔哩 图例 图床 图形验证码 垃圾 备份 子图 字典 字符串函数 安居客 层级索引 年终总结 广播 异常 技巧 拼接 排序 排序函数 操作列表 散点图 数学函数 数据分裂 数据可视化 数据合并 数据替换 数据类型 数据读写 数据重塑 数组 文件 文件储存 无界面浏览器 时间序列 映射 条件函数 条形图 极区图 极坐标图 柱状图 模块 正则表达式 滑动验证码 点触验证码 爬虫 猫眼电影 瓜子二手车 画布 直方图 矩阵 等值线图 等高线图 算术函数 算术运算 类 索引 线性代数 线性图 统计函数 统计描述 统计计算 继承 编辑器 缺失值 网格 肺炎疫情 虎扑论坛 补丁 豆瓣电影 迭代 雷达图 饼状图
最近在听