python基於iris數據集畫出散點圖

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章