https://datawhalechina.github.io/pms50/#/chapter2/chapter2
關聯 (Correlation)
關聯圖表用於可視化2個或更多變量之間的關系。 也就是說,一個變量如何相對於另一個變化。
帶邊界的氣泡圖
有時,您希望在邊界內顯示一組點以強調其重要性。 在這個例子中,你從數據框中獲取記錄,並用下面代碼中描述的 encircle() 來使邊界顯示出來。
導入所需要的庫
# 導入numpy庫 import numpy as np # 導入pandas庫 import pandas as pd # 導入matplotlib庫 import matplotlib as mpl import matplotlib.pyplot as plt # 導入seaborn庫 import seaborn as sns # 在jupyter notebook顯示圖像 %matplotlib inline # 導入patches from matplotlib import patches # 導入ConvexHull from scipy.spatial import ConvexHull
設定圖像各種屬性
large = 22; med = 16; small = 12
# 設置子圖上的標題字體
params = {'axes.titlesize': large,
# 設置圖例的字體
'legend.fontsize': med,
# 設置圖像的畫布
'figure.figsize': (16, 10),
# 設置標簽的字體
'axes.labelsize': med,
# 設置x軸上的標尺的字體
'xtick.labelsize': med,
# 設置整個畫布的標題字體
'ytick.labelsize': med,
'figure.titlesize': large}
# 更新默認屬性
plt.rcParams.update(params)
# 設定整體風格
plt.style.use('seaborn-whitegrid')
# 設定整體背景風格
sns.set_style("white")
程序代碼
# step1:導入數據
midwest = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest_filter.csv") # 准備數據以及顏色 categories = np.unique(midwest["category"]) # 使用np.umique對midwest["category"]去重 # 使用列表推導式,建立colors列表 # 14個數據,0-13 colors = [plt.cm.tab10(i/float(len(categories) - 1)) for i in range(len(categories))]
# step2:為每個類別繪制具有獨特顏色的散點圖
# 建立畫布 plt.figure(figsize=(16, 10), # 繪圖尺寸默認為(6.4, 4.8) dpi = 80, # 圖像分辨效率,默認dpi為100 facecolor = "w", # 背景顏色,默認為白色 edgecolor = 'k') # 邊框顏色,默認為白色 # 繪圖 # 使用函數enumerate:將可遍歷的數據對象組合為一個索引序列,同時列出數據和數據索引 for i, category in enumerate(categories): plt.scatter('area', 'poptotal', # 橫縱坐標 data=midwest.loc[midwest.category==category, :] # 橫縱坐標所對應的數據 , s="dot_size" # 數據尺寸大小 , c= np.array(colors[i]).reshape(1,-1) , label=str(category) # 設定標簽名稱 , edgecolors= np.array(colors[i]).reshape(1,-1) # 標記的邊緣顏色 # , alpha = 0.7 , linewidths=.5) # 線寬
# step3:Encircling
# 定義繪制畫環繞的函數 def encircle(x, y, ax=None, **kw): if not ax: ax = plt.gca() # 如果沒有子圖對象,那么就創建一個新的子圖對象 # np.c_中的c是column(列)的縮寫,是按列疊加兩個矩陣的意思,也可以說是按行連接兩個矩陣,就是把兩矩陣左右相加,要求行數相等,類似於pandas中的merge()。 p = np.c_[x, y] hull = ConvexHull(p) # 將數據集輸入到ConverHull中,自動生成凸包類型的對象(hull) ploy = plt.Polygon(p[hull.vertices, :], **kw) # 利用plt.Polygon繪制多邊形 ax.add_patch(ploy) # 將多邊形ploy修補到當前子圖中 # 選擇要包圍的數據 midwest_encircle_data = midwest.loc[midwest.state == 'IN', :]
# step4:繪制頂點周圍的多邊形
# 繪畫線條 encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec = "firebrick", # 線條顏色 fc = 'none', linewidth = 1.5) # 線寬 # 背景顏色 encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec = 'none', # 線條顏色 fc = 'gold', alpha = 0.1) # 透明度
# step5:裝飾
plt.gca().set(xlim = (0.0, 0.12), # 設置x坐標軸的范圍 ylim = (0, 90000), # 設置y坐標軸的范圍 xlabel = "Area", # 設置x坐標的標題 ylabel = "Population") # 設置y坐標的標題 plt.xticks(fontsize = 12) # 設置x坐標的字體 plt.yticks(fontsize = 12) # 設置y坐標的字體 plt.title("Bubble Plot with Encircling", fontsize=22) # 設置圖像標題和字體字體 plt.legend(fontsize = 12) # 顯示圖例,設置圖例大小 plt.show()
氣泡圖

博文總結
np.unique
- 該函數是去除數組中的重復數字,並進行排序之后輸出。
列表推導式
- 列表推導式(又稱列表解析式)提供了一種簡明扼要的方法來創建列表。
- 它的結構是在一個中括號里包含一個表達式,然后是一個for語句,然后是 0 個或多個 for 或者 if 語句。那個表達式可以是任意的,意思是你可以在列 表中放入任意類型的對象。返回結果將是一個新的列表,在這個以 if 和 for 語句為上下文的表達式運行完成之后產生。
- 列表推導式的執行順序:各語句之間是嵌套關系,左邊第二個語句是最外層,依次往右進一層,左邊第一條語句是最后一層。
- colors = [plt.cm.tab10(i/float(len(categories) - 1)) for i in range(len(categories))]
創建畫布
- plt.figure()
- 參數說明
- figsize__畫布尺寸
- dpi__分辨率
- facecolor__背景顏色,默認為白色
- edgecolor__邊框顏色,默認為白色
enumerate
- enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。
- 可用[*]打開惰性數據
繪制散點圖
- plt.scatter()
- 參數說明
- x__橫坐標
- y__縱坐標
- s__數據尺寸大小
- c__顏色
- label__設置標簽名稱
- edgecolor__標記的邊緣顏色
- alpha__透明度
- linewidth__線寬
plt.gca
- plt.gca()獲得當前的對象子圖對象ax,如果沒有子圖對象,那一個么就創建新的子圖對象
np.c__
- 按行連接兩個矩陣,但要求行數相等
