【python資料探勘課程】二十五.Matplotlib繪製帶主題及聚類類標的散點圖

Eastmount發表於2018-07-18

這是《Python資料探勘課程》系列文章,希望對您有所 幫助。當我們做聚類分析繪製散點圖時,通常會遇到無法區分散點類標的情況,做主題分析時,可能會遇到無法將對應散點的名稱(尤其中文名稱)新增至圖型中,為了解決這兩個問題,本文提出了Matplotlib庫的高階應用,主要是繪製帶主題的散點圖及聚類類標顏色進行區分,該方法被廣泛應用於文字聚類和主題分析領域。
本篇文章為基礎性文章,希望對你有所幫助,提供些思路,也是自己教學的內容。如果文章中存在錯誤或不足之處,還請海涵。同時,推薦大家閱讀我以前的文章瞭解其他知識。

 

前文參考:
【Python資料探勘課程】一.安裝Python及爬蟲入門介紹
【Python資料探勘課程】二.Kmeans聚類資料分析及Anaconda介紹
【Python資料探勘課程】三.Kmeans聚類程式碼實現、作業及優化
【Python資料探勘課程】四.決策樹DTC資料分析及鳶尾資料集分析
【Python資料探勘課程】五.線性迴歸知識及預測糖尿病例項
【Python資料探勘課程】六.Numpy、Pandas和Matplotlib包基礎知識
【Python資料探勘課程】七.PCA降維操作及subplot子圖繪製
【Python資料探勘課程】八.關聯規則挖掘及Apriori實現購物推薦
【Python資料探勘課程】九.迴歸模型LinearRegression簡單分析氧化物資料
【python資料探勘課程】十.Pandas、Matplotlib、PCA繪圖實用程式碼補充
【python資料探勘課程】十一.Pandas、Matplotlib結合SQL語句視覺化分析
【python資料探勘課程】十二.Pandas、Matplotlib結合SQL語句對比圖分析
【python資料探勘課程】十三.WordCloud詞雲配置過程及詞頻分析
【python資料探勘課程】十四.Scipy呼叫curve_fit實現曲線擬合
【python資料探勘課程】十五.Matplotlib呼叫imshow()函式繪製熱圖
【python資料探勘課程】十六.邏輯迴歸LogisticRegression分析鳶尾花資料
【python資料探勘課程】十七.社交網路Networkx庫分析人物關係(初識篇)
【python資料探勘課程】十八.線性迴歸及多項式迴歸分析四個案例分享
【python資料探勘課程】十九.鳶尾花資料集視覺化、線性迴歸、決策樹花樣分析
【python資料探勘課程】二十.KNN最近鄰分類演算法分析詳解及平衡秤TXT資料集讀取
【python資料探勘課程】二十一.樸素貝葉斯分類器詳解及中文文字輿情分析
【python資料探勘課程】二十二.Basemap地圖包安裝入門及基礎知識講解
【python資料探勘課程】二十三.時間序列金融資料預測及Pandas庫詳解
【python資料探勘課程】二十四.KMeans文字聚類分析互動百科語料

 

PSS:最近參加CSDN2018年部落格評選,希望您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index


五年來寫了314篇部落格,12個專欄,是真的熱愛分享,熱愛CSDN這個平臺,也想幫助更多的人,專欄包括Python、資料探勘、網路爬蟲、影象處理、C#、Android等。現在也當了兩年老師,更是覺得有義務教好每一個學生,讓貴州學子好好寫點程式碼,學點技術,"師者,傳到授業解惑也",提前祝大家新年快樂。2019我們攜手共進,為愛而生。



 

一. Matplotlib繪製帶主題散點圖


本文能幫助大家實現如下圖所示的文字聚類分析或LDA主題模型分析,將相同主題的文章聚集在一起,也可以用於引文分析。圖中包括人物、動物、景區和國家四個主題,將相似主題的文字聚集在一起,但也有預測錯誤的點,比如黃色“侯佩岑”被預測為黃色的景區主題。
文字聚類詳見上一篇文章:【python資料探勘課程】二十四.KMeans文字聚類分析互動百科語料。 

詳細程式碼如下所示,通過(x,y)繪製散點圖,再呼叫annotate()函式增加每個點對應的名稱。注意:聚類分析通過scatter()繪製圖形,通常包括:x座標、y座標、點名稱、聚類類標。

#-*- coding:utf-8 -*-
import os
import codecs
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

x = [2.3, 4.5, 3, 7, 6.5, 4, 5.3]
y = [5, 4, 7, 5, 5.3, 5.5, 6.2]

num = np.arange(7)
name = ["a", "b", "c", "d", "e", "f", "g"]

fig, ax = plt.subplots()
ax.scatter(x,y,c='r',s=100)

for i,txt in enumerate(name):  #n  
    ax.annotate(txt,(x[i],y[i]))

plt.show()
 

輸出結果如下所示:

這裡是通過 "name = ["a", "b", "c", "d", "e", "f", "g"]" 或 "num = np.arange(7)" 陣列設定名稱,而實際情況資料很多,比如文字聚類,我們可以通過TXT文字或CSV檔案讀入資料進行繪製,尤其是中文名稱。詳細程式碼如下所示:

#-*- coding:utf-8 -*-
import os
import codecs
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

x = [2.3, 4.5, 3, 7, 6.5, 4, 5.3]
y = [5, 4, 7, 5, 5.3, 5.5, 6.2]

n=np.arange(7)
name = ["a", "b", "c", "d", "e", "f", "g"]

fig, ax = plt.subplots()
ax.scatter(x,y,c='r',s=100)

#定義陣列讀取名稱
corpus = []
result = codecs.open('allname.txt', 'r', 'utf-8')
for u in result.readlines():
    print u.strip()
    corpus.append(u.strip())

#解決中文和負號'-'顯示為方塊的問題  
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False

for i,txt in enumerate(corpus): #n  name  
    ax.annotate(txt,(x[i],y[i]))

result.close()
plt.savefig('plot.png', dpi=1200)
plt.show()

輸出結果如下所示:

 

 


 

二. Matplotlib聚類類標設定散點圖

 

假設現在對鳶尾花資料集進行KMeans聚類分析,程式碼如下所示:

# -*- coding: utf-8 -*-
#載入資料集
from sklearn.datasets import load_iris 
iris = load_iris()
print iris.data            #輸出資料集
print iris.target          #輸出真實標籤
print len(iris.target)
print iris.data.shape    #150個樣本 每個樣本4個特徵
 
 
#匯入決策樹DTC包
from sklearn.cluster import KMeans
clf = KMeans(n_clusters=3)
pre = clf.fit_predict(iris.data)      
print pre
 
#獲取花卉兩列資料集
X = iris.data
L1 = [x[0] for x in X]
print L1
L2 = [x[1] for x in X]
print L2
 
#繪圖
import numpy as np
import matplotlib.pyplot as plt
plt.scatter(L1, L2, c=pre, marker='x', s=100) 
plt.title("KMeans")
plt.show()

輸出圖形如下所示:

 

上圖卻不知道每種顏色的散點對應的類標或名稱。這是聚類分析常見的一個問題,如何解決這個問題呢?需要通過迴圈獲取不同類標,再繪製散點圖並增加圖例。完整程式碼如下所示:

# -*- coding: utf-8 -*-
#載入資料集
from sklearn.datasets import load_iris 
iris = load_iris()
print iris.data            #輸出資料集
print iris.target          #輸出真實標籤
print len(iris.target)
print iris.data.shape    #150個樣本 每個樣本4個特徵
 
 
#匯入決策樹DTC包
from sklearn.cluster import KMeans
clf = KMeans(n_clusters=3)
y_pred = clf.fit_predict(iris.data)      
print y_pred

#降維繪圖
from sklearn.decomposition import PCA
pca = PCA(n_components=2)             #輸出兩維
newData = pca.fit_transform(iris.data)   #載入N維
print newData
x = [n[0] for n in newData]
y = [n[1] for n in newData]
 
x1, y1 = [], []   
x2, y2 = [], [] 
x3, y3 = [], []
    
#分別獲取類標為0、1、2的資料 賦值給(x1,y1) (x2,y2) (x3,y3) 
i = 0  
while i < len(newData):  
    if y_pred[i]==0:  
        x1.append(newData[i][0])  
        y1.append(newData[i][1])  
    elif y_pred[i]==1:  
        x2.append(newData[i][0])  
        y2.append(newData[i][1])  
    elif y_pred[i]==2:  
        x3.append(newData[i][0])  
        y3.append(newData[i][1])
    i = i + 1


import matplotlib.pyplot as plt

#三種顏色   
plot1, = plt.plot(x1, y1, 'or', marker="o", markersize=10)    
plot2, = plt.plot(x2, y2, 'og', marker="o", markersize=10)    
plot3, = plt.plot(x3, y3, 'ob', marker="o", markersize=10)
plt.title("K-Means Text Clustering")  #繪製標題
plt.legend((plot1, plot2, plot3), ('A', 'B', 'C'))

#plt.scatter(x1, x2, c=clf.labels_,  s=100)
plt.show()

輸出結果如下所示,可以對每類散點樣式進行設定,同時繪製標註圖形。

 

希望基礎性文章對您有所幫助,如果文章中有錯誤或不足之處還請海涵。
最後推薦作者的最新出版書籍:
 


 

本書主要包括上下兩冊:

    《Python網路資料爬取及分析從入門到精通(爬取篇)》
    《Python網路資料爬取及分析從入門到精通(分析篇)》


(By:Eastmount 2018-07-18 深夜12點  http://blog.csdn.net/eastmount/ )

 

 

 

相關文章