最近数据挖掘选修课需要根据iris数据集(又名:鸢尾花数据集)画出散点图,说起来,第一眼看到iris这个名词,让我想起了同名的iris(虹膜),哈哈哈,由于前阵子报了关于虹膜识别的题目,所以对iris这个词相当敏感。
原来老师的要求是使用matlab画出散点图,哎,一听到要用到matlab,心想:为什么数据挖掘这么适合锻炼Python能力的一门课程,却偏偏选了做数学的matlab当作工具呢?提起matlab,就想起了大一一段辛酸故事,明明一名读软件的,羡慕别人使用matlab做数学做得很6,然后想着自学matlab,结果在破解matlab花的时间,比学习的时间多得多。。。
不管了,matlab是不会用的了,学习成本也未免太高了吧。然后学生党,建议import一个选择能够与matlab媲美的matplotlib包吧,哈哈哈。我喜欢这个话(出自Numpy Beginner's Guide second edition)
先看一下matplotlib做的图,然后查看代码,需要import几个包,一个是matplotlib(作图)、一个numpy(数据操作)、一个sklearn(利用iris数据集),好像还需要一个scikit-learn(机器学习)。
本来想着应该没有涉及到机器学习这一块,不知道为什么会报错,可能是sklearn需要基于scikit-learn吧,不清楚不清楚。
下面就是python写的图了。
代码也不难,做实验的时候,老师说的两个for循环就可以搞定,我在想:干!怎么可能两个for就可以搞定。
最后自己被自己的实力打脸。。。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris() # 加载机器学习的下的iris数据集,先来认识一下iris数据集的一些操作,其实iris数据集就是一个字典集。下面注释的操作,可以帮助理解
# print(iris.keys()) # 打印iris索引,关键字
# n_sample, n_features = iris.data.shape
# print(iris.data.shape[0]) # 样本
# print(iris.data.shape[1]) # 4个特征
#
# print(n_sample, n_features)
#
# print(iris.data[0])
#
# print(iris.target.shape)
# print(iris.target) # 三个种类,分别用0,1,2来表示
# print(iris.target_names) # 三个种类的英文名称
# print("feature_names:", iris.feature_names)
iris_setosa = iris.data[:50] # 第一种花的数据
iris_versicolor = iris.data[50:100] # 第二种花的数据
iris_virginica = iris.data[100:150] # 第三种花的数据
# print(iris_setosa)
iris_setosa = np.hsplit(iris_setosa, 4) # 运用numpy.hsplit水平分割获取各特征集合,分割成四列
iris_versicolor = np.hsplit(iris_versicolor, 4)
iris_virginica = np.hsplit(iris_virginica, 4)
setosa = {'sepal_length': iris_setosa[0], 'sepal_width': iris_setosa[1], 'petal_length': iris_setosa[2],
'petal_width': iris_setosa[3]}
versicolor = {'sepal_length': iris_versicolor[0], 'sepal_width': iris_versicolor[1], 'petal_length': iris_versicolor[2],
'petal_width': iris_versicolor[3]}
virginica = {'sepal_length': iris_virginica[0], 'sepal_width': iris_virginica[1], 'petal_length': iris_virginica[2],
'petal_width': iris_virginica[3]}
size = 5 # 散点的大小
setosa_color = 'b' # 蓝色代表setosa
versicolor_color = 'g' # 绿色代表versicolor
virginica_color = 'r' # 红色代表virginica
sepal_width_ticks = np.arange(2, 5, step=0.5) # sepal_length分度值和刻度范围
sepal_length_ticks = np.arange(4, 8, step=0.5) # sepal_width分度值和刻度范围
petal_width_ticks = np.arange(0, 2.5, step=0.5) # petal_width分度值和刻度范围
petal_length_ticks = np.arange(1, 7, step=1) # petal_length分度值和刻度范围
ticks = [sepal_length_ticks, sepal_width_ticks, petal_length_ticks, petal_width_ticks]
label_text = ['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width']
# print(ticks)
plt.figure(figsize=(12, 12)) # 设置画布大小
plt.suptitle("Iris Set (blue=setosa, green=versicolour, red=virginca) ", fontsize=30)
for i in range(0, 4):
for j in range(0, 4):
plt.subplot(4, 4, i * 4 + j + 1) # 创建子画布
if i == j:
print(i*4+j+1) #序列号
plt.xticks([])
plt.yticks([])
plt.text(0.1, 0.4, label_text[i], size=18)
else:
plt.scatter(iris_setosa[j], iris_setosa[i], c=setosa_color, s=size)
plt.scatter(iris_versicolor[j], iris_versicolor[i], c=versicolor_color, s=size)
plt.scatter(iris_virginica[j], iris_virginica[i], c=virginica_color, s=size)
# plt.xlabel(label_text[j])
# plt.ylabel(label_text[i])
plt.xticks(ticks[j])
plt.yticks(ticks[i])
#plt.show() //需要保存的时候不能show,即调用savefig()保存图片的时候,不能调用show(),这个我也不知道为什么这样。。。
plt.savefig('iris.png', format='png') #保存图片