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

在以前的文章里面,苏南大叔已经详细描述过"如何利用plot画鸢尾花散点图"的问题,那么,本文又有什么新的内容要描述呢?主要是针对plt.scatter()这个散点图函数的细微调整及讨论,不同的方案写法来做到类似的效果。

苏南大叔:以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图 - 三种方案画鸢尾花散点图
以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图(图4-1)

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的程序所学所想。本文测试环境:win10python@3.11.0pandas@1.5.3numpy@1.24.2matplotlib@3.7.1scikit-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())

苏南大叔:以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图 - 散点图方案一
以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图(图4-2)

方案二,单独设置

为了解决上一个方案中,不能单独设置散点的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()

苏南大叔:以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图 - 散点图方案二
以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图(图4-3)

方案三,另外一个写法

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是蓝色的圈符号。

苏南大叔:以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图 - 散点图方案三
以鸢尾花数据为例,三种方案画鸢尾花任意两维度数据散点图(图4-4)

结束语

鸢尾花数据是分析来分析去,每次都能分析出点新东西。更多苏南大叔使用python分析鸢尾花数据的文章,请点击:

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

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

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

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