我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文还是继续分析鸢尾花数据集,鸢尾花数据集有四个维度信息,分别是花萼长宽以及花瓣长宽。实际上从排列组合的角度上来说,有4*4=16种排列方式。那么,本文的需求就是:把这16种排列信息的散点图画在同一个大图上面。

苏南大叔:以鸢尾花数据集为例,如何利用subplot切分大图画子图? - subplot画子图
以鸢尾花数据集为例,如何利用subplot切分大图画子图?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔和计算机代码的经验文章。本文测试环境:win10python@3.11.0pandas@1.5.3numpy@1.24.2matplotlib@3.7.1

测试代码

在循环体外部就是已经知晓的散点图的画法代码的大部分了,可以参考:

循环体内部,实际上就是在不断的确定子图位置,以及标签信息的过程:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data_url = "http://download.tensorflow.org/data/iris_training.csv"
column_names = ["花萼长", "花萼宽", "花瓣长", "花瓣宽", "种类"]
df_iris = pd.read_csv(data_url, header=0, names=column_names)
fig = plt.figure("Iris Data", figsize=(15, 15))
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
iris = np.array(df_iris)
# =======================================================================
i = 0  # 实际上第几个被画的
for x in range(4):      # 这个决定了实际的子图被画的顺序,但无法改变每个图的实际信息
    for y in range(4):  # 这个决定了实际的子图被画的顺序,但无法改变每个图的实际信息
        i = i + 1
        index = 4 * y + (x + 1)  # 本次要画的图的编号,实际上决定了位置
        plt.subplot(4, 4, index)  # 几行,几列,子图在网格中的位置
        # 子图横坐标数据,子图纵坐标数据,每个子图的c都是一致的
        p0 = plt.scatter(iris[:, x], iris[:, y], c=iris[:, 4], cmap="brg")
        plt.xlabel("(%s,%s)第%s个画位置%s" % (x, y, i, index))
        # y相同,要体现x的不同,并且y=0的时候,是最顶部一行,设置title比较合适
        if y == 0: # 其它的么有必要设置,看最顶部就行
            plt.title("x:%s,%s" % (x, column_names[x]))
        # x相同,要体现y的不同,并且x=0的时候,是最左边一列,设置ylabel比较合适
        if x == 0: # 其它的么有必要设置,看最左边就行
            plt.ylabel("y:%s,%s" % (y, column_names[y]))
# =======================================================================
plt.savefig("subplot.png")
plt.show()

苏南大叔:以鸢尾花数据集为例,如何利用subplot切分大图画子图? - subplot切分大图为子图集合
以鸢尾花数据集为例,如何利用subplot切分大图画子图?(图3-2)

.subplot()

在前面的文章中,苏南大叔已经案例过基于鸢尾花数据集的散点图画法了。本文中的画子图的方式,就是plt.subplot(),其它的代码基本一致。苏南大叔是这么理解.subplot()的。

plt.subplot(几行,几列,子图在网格中的位置)

这个函数不决定子图第几个被画,只决定子图画在哪个位置。

苏南大叔:以鸢尾花数据集为例,如何利用subplot切分大图画子图? - 子图顺序
以鸢尾花数据集为例,如何利用subplot切分大图画子图?(图3-3)

灵魂QA

Q:谁在画?
A:plt在画图,所有的子图都是一个对象plt在画,每个子图都是同一个plt画出来的。也就是说并不存在某个子图独自的plt对象,这就是个出问题的伏笔啊。因为不好确定当前子图到底画完没有。

Q:子图被画的顺序
A:实际上是由两层循序xy的顺序决定的。以行为单位,向下推进。或者以列为单位,向右推进。

Q:子图被画在哪里
A:子图位置实际上是被.subplot()的第三个参数决定的,和被画的先后顺序无关,骨子里就决定了画在哪里。

Q:原点位置
A:大图的原点是左上角,小图的原点位置是左下角。

结束语

本文说的是plt.subplot()画子图,还存在着一个plt.subplots()画子图。两者有啥区别呢?且听后续文章分晓。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    plot