以鸢尾花数据集为例,如何利用subplot切分大图画子图?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文还是继续分析鸢尾花数据集,鸢尾花数据集有四个维度信息,分别是花萼长宽以及花瓣长宽。实际上从排列组合的角度上来说,有4*4=16种排列方式。那么,本文的需求就是:把这16种排列信息的散点图画在同一个大图上面。
苏南大叔的“程序如此灵动”博客,记录苏南大叔和计算机代码的经验文章。本文测试环境:win10
,python@3.11.0
,pandas@1.5.3
,numpy@1.24.2
,matplotlib@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()
在前面的文章中,苏南大叔已经案例过基于鸢尾花数据集的散点图画法了。本文中的画子图的方式,就是plt.subplot()
,其它的代码基本一致。苏南大叔是这么理解.subplot()
的。
plt.subplot(几行,几列,子图在网格中的位置)
这个函数不决定子图第几个被画,只决定子图画在哪个位置。
灵魂QA
Q:谁在画?
A:plt
在画图,所有的子图都是一个对象plt
在画,每个子图都是同一个plt
画出来的。也就是说并不存在某个子图独自的plt
对象,这就是个出问题的伏笔啊。因为不好确定当前子图到底画完没有。
Q:子图被画的顺序
A:实际上是由两层循序x
和y
的顺序决定的。以行为单位,向下推进。或者以列为单位,向右推进。
Q:子图被画在哪里
A:子图位置实际上是被.subplot()
的第三个参数决定的,和被画的先后顺序无关,骨子里就决定了画在哪里。
Q:原点位置
A:大图的原点是左上角,小图的原点位置是左下角。
结束语
本文说的是plt.subplot()
画子图,还存在着一个plt.subplots()
画子图。两者有啥区别呢?且听后续文章分晓。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。