最近數據挖掘選修課需要根據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') #保存圖片