Python視覺化圖系列(1)-----jupyter notebook

yoyoooc發表於2020-10-09

Python視覺化-----複雜的散點圖


前言

提示:00 安裝庫,配置環境
在Python中進行視覺化,我們需要的是這些庫:

matplotlib:python中自帶的,也是最常用的視覺化工具包,在Jupyter中甚至可以找到matplotlib的網站。
seaborn:python中視覺化的新起之秀,致力於統計資料視覺化。
brewer2mpl:brewer2mpl是一個專供python使用的,用於訪問colorbrewer2色譜的工具,colorbrewer2是一個專業顏色顧問公司。

matplotlib
通常來說,如果我們是使用anaconda安裝的python,那matplotlib是自帶的
如果你發現你的python環境中沒有matplotlib,那你可以使用以下命令先安裝pip,然後從pip中安裝matplotlib:
下面展示安裝程式碼

python -m pip install -U pip
python -m pip install -U matplotlib

你可以通過在Jupyter中執行 print(matplotlib.version) 來檢視你現有的matplotlib版本。
下面展示執行程式碼

import matplotlib as mlp
print(mlp.__version__)

seaborn是需要自己安裝的。如果不是anaconda自帶,建議使用pip安裝。

#%%cmd
#pip install seaborn
import seaborn as sns
print(sns.__version__)

seaborn要求必須0.9.0以上,否則程式碼會報錯,不足0.9.0的大家可以使用以下程式碼進行升級。
下面展示相關程式碼

#%%cmd
#pip install --upgrade seaborn

brewer2mpl
同樣也需要自己安裝,使用以下程式碼:

#%%cmd
#pip install brewer2mpl

不必過於在意版本,通常來說都是直接安裝成最新版。


提示:以下是本篇文章正文內容,下面案例可供參考

一、我們的目標是什麼?

我們的目標是:繪製出下圖,並且利用資料解讀圖內的資訊。
橫座標:面積大小總座標:總人口圖例:暫時看不出是什麼總而言之看起來是型別,一種型別一個顏色

二、實現目標的知識準備

1.引入庫

程式碼如下(示例):

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#如果你在使用Jupyter Notebook,你會需要這樣一句命令來讓你的影像顯示

2.匯入資料

程式碼如下(示例):

#匯入資料
midwest = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest_filter.csv")
midwest.head()

該處使用的url網路請求的資料。


3.準備標籤的列表和顏色

程式碼如下(示例):

#(1)標籤
midwest['category']
#提取標籤中的類別
categories = np.unique(midwest['category']) #去掉所有重複的項
categories #這就是我們要使用的標籤的類別列表

顏色

接下來要創造和標籤的類別一樣多的顏色,如果只有三四個類別,或許我們還可以自己寫,然而面對十幾個,或者二十個分類,我們需要讓matplotlib來幫助我們自動生成顏色。

plt.cm.tab10()

用於建立顏色的十號光譜,在matplotlib中,有眾多光譜供我們選擇:https://matplotlib.org/tutorials/colors/colormaps.html
我們可以在plt.cm.tab10()中輸入任意浮點數,來提取出一種顏色。光譜tab10中總共只有十種顏色,如果輸入的浮點數比較接近,會返回類似的顏色。這種顏色會以元祖的形式返回,表示為四個浮點陣列成的RGBA色彩空間或者三個浮點陣列成的RGB色彩空間中的隨機色彩。
程式碼如下(示例):

#(2)顏色
color1 = plt.cm.tab10(5.2)
color1 #四個浮點陣列成的一個顏色
np.array(color1).reshape(1,-1) #reshape:增維,輸入(1,-1)是讓行上的維度為1(-1,1)是讓列上的維度為1
x1 = np.random.randn(10)
x2 = x1 + x1**2 - 10
plt.scatter(x1,x2,s=50
            ,c=np.array(color1).reshape(1,-1))
plt.show()

三、畫目標圖片(複雜的散點圖)

至此已經闡述完怎樣找資料、標籤、顏色,現在開始畫圖。
程式碼如下(示例):

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#如果你在使用Jupyter Notebook,你會需要這樣一句命令來讓你的影像顯示
midwest.head()
categories[13] #0~13,通過索引提取標籤類別
midwest.loc[midwest["category"] == categories[0],"poptotal"].head()
#為了標籤的名稱,我們本來就需要迴圈和標籤的類別數目一樣的次數
#所以需要迴圈的次數 = 需要生成的顏色的次數 = 需要生成的小數的個數
#只需要在迴圈中不斷生成顏色就好了
#所以我們可以利用迴圈中的i來生成14個不同的小數

plt.figure(figsize=(16,10)) #建立畫布

for i in range(len(categories)):
    plt.scatter(midwest.loc[midwest["category"]==categories[i],"area"]
                ,midwest.loc[midwest["category"]==categories[i],"poptotal"]
                ,s=20
                ,c=np.array(plt.cm.tab10(i/len(categories))).reshape(1,-1)    #i除以固定的數,來獲得小數
                ,label=categories[i]
               )
plt.legend()
plt.show()

四、解讀影像

解析標籤的含義:第一個字母是平均教育程度的高低(越高的話,我們的標籤就是H)
第二個字母是貧困水平的高低(越窮的話,我們的水平就是H)
第三個字母是城市還是鄉村
基於標籤含義的解析,我們對於圖可以分析出什麼呢?
程式碼如下(示例):

midwest["category"].value_counts()
plt.figure(figsize=(16, 10)   #繪圖尺寸
           , dpi=60           #影像解析度
           , facecolor='w'    #影像的背景顏色,設定為白色,預設也是白色
           , edgecolor='k'    #影像的邊框顏色,設定為黑色,預設也是黑色
          )

#進行迴圈繪圖
for i, category in enumerate(categories):
    plt.scatter('area', 'poptotal', 
                data=midwest.loc[midwest.category==category, :],
                s=20, c=np.array(plt.cm.tab10(i/float(len(categories)-1))).reshape(1,-1),label=str(category))

#高學歷,低貧困的地方
plt.scatter("area","poptotal",
           data = midwest.loc[midwest.category == "HLU",:],
            s=300,
            facecolors="None",
            edgecolors="red",
            label = "Selected")

#低學歷,很貧困的地方
#plt.scatter("area","poptotal",
#           data = midwest.loc[midwest.category == "LHR",:],
#            s=150,
#            facecolors="None", #點的填充顏色,為None的時候,表示點是透明的
#            edgecolors="red", #點的邊框現在是紅色
#           label = "Selected")

#再試試看,高學歷,高貧困的地方?
#學歷低,但很富有的地方?

#對影像進行裝飾
plt.gca().set(xlim=(0.0, 0.12), ylim=(0, 90000)) #控制橫縱座標的範圍
plt.xticks(fontsize=12) #座標軸上的標尺的字的大小
plt.yticks(fontsize=12)
plt.ylabel('Population',fontsize=22) #座標軸上的標題和字型大小
plt.xlabel('Area',fontsize=22)
plt.title("Scatterplot of Midwest Area vs Population", fontsize=22) #整個影像的標題和字型的大小
plt.legend(fontsize=12) #圖例的字型大小
plt.show()

輸出展示:
在這裡插入圖片描述

總結

我們什麼時候會需要散點圖呢?
資料包告 & 學術研究:
展示趨勢:比如產品銷量隨著時間如何變化,智力水平隨著教育程度如何變化等
展現狀態:不同年齡的客戶的成交率,不同生產成本對應的生產員工技能要求

資料探索 & 資料解讀:
探索資料關係,幫助瞭解事實,推動研究

統計學 & 機器學習:
探索資料關係,指導資料預處理和模型選擇

相關文章