以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图
发布于 作者:苏南大叔 来源:程序如此灵动~在以前的文章里面,苏南大叔已经详细描述过"如何利用plot画鸢尾花散点图"的问题,那么,本文又有什么新的内容要描述呢?主要是针对plt.scatter()
这个散点图函数的细微调整及讨论,不同的方案写法来做到类似的效果。
苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的程序所学所想。本文测试环境:win10
,python@3.11.0
,pandas@1.5.3
,numpy@1.24.2
,matplotlib@3.7.1
,scikit-learn@1.2.2
。
前文回顾
本文的前文回顾里面,最基础的文章,是下面这篇:
在上面的文章的基础上,本文还牵扯到了图例的问题,参考文章:
当然,本文的新的方案写法,也涉及到了下面几篇文章:
加载鸢尾花数据的方式,采用最普通的写法load_iris()
(用别的方式加载的话,记得修改变量读取的相关代码),参考文章:
涉及到的plot
画图,中文显示框框的问题,可以参考:
代码框架
先说一下本文的代码的主体框架,如下:
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
# 主体方案代码
# ...
# 重点放在这里
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.title("鸢尾花花萼数据散点图")
plt.rcParams["font.sans-serif"] = "SimHei"
plt.show()
代码里面涉及到的数据有:
需要的数据 | 读取方法 | 取值 |
---|---|---|
样本数据 | iris["data"] | [[5.1 3.5 1.4 0.2]] |
标签数据 | iris["target"] | [0 0 0] |
标签说明 | iris["target_names"] | ['setosa' 'versicolor' 'virginica'] |
列名 | iris["feature_names"] | ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] |
本文要对比的横纵坐标数据,是鸢尾花数据的前两列:萼片长度sepal length (cm)
和萼片宽度sepal width (cm)
。如果要对比的是其它数据,请自行修改代码。
方案一,批量设置
这个方案是原来写了无数篇内容的方案,优点是:一句话画出N组散点。缺点是:不能分开设置散点的marker
,只能用颜色进行区分。
p1 = plt.scatter(
iris.data[:, 0], iris.data[:, 1], c=iris.target, cmap="brg", marker="*"
)
plt.legend(handles=p1.legend_elements()[0], labels=iris.target_names.tolist())
方案二,单独设置
为了解决上一个方案中,不能单独设置散点的marker
问题,执行了多条plt.scatter()
语句,所以略显复杂。
need_cnt = len(iris.target_names) - 3 # 这个纯粹是为了逻辑的严谨性,实际没用
colors = list("rgb") + ["r"] * need_cnt
markers = list("*ox") + ["*"] * need_cnt
for i, item in enumerate(iris.target_names):
plt.scatter(
iris.data[iris.target == i, 0],
iris.data[iris.target == i, 1],
color=colors[i],
marker=markers[i],
label=item,
)
plt.legend()
方案三,另外一个写法
plt.plot(iris.data[iris.target == 0, 0], iris.data[iris.target == 0, 1], 'r*', label=iris.target_names[0])
plt.plot(iris.data[iris.target == 1, 0], iris.data[iris.target == 1, 1], 'gx', label=iris.target_names[1])
plt.plot(iris.data[iris.target == 2, 0], iris.data[iris.target == 2, 1], 'bo', label=iris.target_names[2])
plt.legend()
其实,不使用plt.scatter()
语句,而使用默认的plt.plot()
也能画出散点图来,效果是一致的。但是这里使用散点信息的简写方式。比如:r*
是红色的星星符号,gx
是绿色的叉子符号,bo
是蓝色的圈符号。
结束语
鸢尾花数据是分析来分析去,每次都能分析出点新东西。更多苏南大叔使用python
分析鸢尾花数据的文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。