python資料視覺化-matplotlib基礎

2020-09-21 14:00:31

使用matplotlib作圖

注意事項:

  1. 由於預設的pyplot字型並不支援中文字元的顯示,因此需要通過甚至font.sans-serif引數來改變繪圖時的字型,使得圖形可以正常顯示中文。同時用於更改字型後,會導致座標軸中歐給的部分字元無法顯示,因此需要同時更改axes.unicode.minus引數
plt.rcParams['font.sans-serif']="SimHei"
plt.rcParams['axes.unicode_minus']=False
  1. 設定繪圖風格
    使用matplotlib繪圖時,可以設定系統預先設定好的繪圖風格
    使用:plt.style.available語句可以檢視系統中可以使用的所有繪圖風格
    在這裡插入圖片描述預設風格的使用:plt.style.use(「ggplot」)

1. 建立畫布與建立子圖

構建出一張空白畫布,並可以選擇是否將整個畫布劃分為多個部分,方便在同一幅畫上繪製多個圖形的情況。

函數名稱函數作用
plt.figure建立一個空白畫布,可以指定畫布的大小、畫素
figure.add_subplot建立並選中子圖,可以指定子圖的行數,列數,與選中圖片的編號
  • figure函數:matplotlib.pyplot.figure()
    1.matplotlib繪製的影象均位於figure物件中
    2.引數figsize用於設定影象的大小和縱橫比
  • subplot函數:plt.subplot(a,b,c)
    1.a、b表示將圖片視窗分割為ab的區域,即:行
    2. c表示當前選中要操作的區域

2. 新增畫布內容

第二部分是繪圖的主體部分。其中新增標題、座標軸名稱、繪製圖形等步驟是並列的,沒有先後順序,可以先繪製圖形,也可以先新增各種標籤。

函數名稱函數作用
plt.title在當前圖形中新增標題,可以指定標題的名稱、位置、顏色、字型等引數
plt.xlable在當前圖形中新增x軸的名字,可以指定位置、顏色、字型等引數
plt.ylable在當前圖形中新增y軸的名字,可以指定位置、顏色、字型等引數
plt.xlim指定當前x軸的範圍,只能確定一個數值區間,而無法使用字串標識
plt.ylim指定當前y軸的範圍,只能確定一個數值區間,而無法使用字串標識
plt.xticks指定x軸刻度的數目和取值
plt.yticks指定y軸刻度的數目和取值
plt.legend指定當前圖形的圖例,可以指定當前圖例的大小、位置和標籤

3. 設定pyplot的動態rc引數

pyplot使用rc組態檔來自定義圖形的各種預設屬性,被稱為rc設定或rc引數,在pyplot中幾乎所有的預設屬性均可以控制,例如檢視視窗的大小、線條寬度、顏色、樣式,座標軸、網格屬性、文字、字型等。

3.1 線條常用的rc引數
rc引數名稱解釋取值
lines.linewidth線條寬度取0-10之間的取值,預設為1.5
lines.linestyle線條樣式可取"-"、"–"、"."、":「四種,預設為」-"
lines.marker線條上點的形狀可取"o"、「D」、「h」、"."、","、「S」等20多種,預設為None
lines.markersize點的大小取0-10之間的數值,預設為1
3.2 常用線條型別
linestyle取值意義linestyle取值意義
-實線-.點線
長虛線:短虛線

4. 圖形繪製

4.1 散點圖

散點圖又稱散點分佈圖,是以一個特徵為橫座標,另一個特徵為縱座標,利用座標點的分佈形態反映特徵間統計關係的一種圖形。
值是由點在圖表中的不同位置表示,類別是由圖表中的不同標記表示,通常用來比較跨類別的資料。

  • scatter函數:matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,alpha=None,**kwargs),常用引數即說明如下:
引數名稱說明
x,y接收array,表示x軸和y軸的對應資料。無預設。
s接收數值或一維的array,指定點的大小,若傳入一維array則表示每個點的大小,預設為None
c接收數值或一維的array,指定點的顏色,若傳入一維array則表示每個點的顏色,預設為None
marker接收特定string,表示繪製的點的型別,預設為None
alpha接收0-1的小時,表示點的透明度,預設為None
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']="SimHei"
plt.rcParams['axes.unicode_minus']=False
data1 = pd.DataFrame({"姓名":["韓梅梅","李雷","Lucy","Lily","Jim","小明","Amy"],
                     "身高":[160,170,163,165,178,182,168],
                     "體重":[48,55,52,50,60,58,49]})
#繪製散點圖檢視身高和體重之間的關係
figure = plt.figure(figsize=(6,5))
plt.scatter(data1["身高"],data1["體重"],color="b",marker="s")
plt.xlabel("height(cm)")
plt.ylabel("weight(kg)")
plt.title("身高體重關係圖")

在這裡插入圖片描述

4.2 繪製折線圖

折線圖是一種將資料點按照順序連線起來的圖形,可以看作是將散點圖,按照x軸座標順序連線起來的圖形,折線圖的主要功能是檢視因變數y隨著自變數x改變的趨勢,最適合用於隨時間(根據常用比例設定)而變化的連續資料。同時還可以看出數量的差異,增長趨勢的變化。

  • plot函數:
    matplotlib.pyplot.plot(*args,**kwargs)
    常用引數及說明如下表所示:
引數名稱說明
x、y接收array。表示x軸和y軸對應的資料。無預設
color接收特定string。指定線條的顏色。預設為None
linestyle接收特定string。指定線條型別,預設為「-」
marker接收特定string。表示繪製的點的型別。預設為None
alpha接收0-1的小數。表示點的透明度。預設為None。
data_x = list(range(1,1000))
data_y = [10]
for i in range(998):
    data_y.append(data_y[i]+np.random.randint(-1,2))
plt.plot(data_x,data_y)

在這裡插入圖片描述

5. 分析特徵內部資料分佈與分散狀況

5.1 繪製直方圖

直方圖是統計報告圖的一種,一般用於表示連續型資料的分佈情況,一般用橫軸表示資料分組,縱軸表示屬於該組取值範圍的樣本數量或者佔比。
用直方圖可以比較直觀的看出產品品質特性的分佈狀態,便於判斷其總體品質分佈情況。直方圖可以發現分佈表無法發現的資料模式、樣本的頻率分佈和總體的分佈。

  • hist函數:matplotlib.pyplot.hist(x,y)
    其中:
    x:待繪製直方圖的一維陣列
    y:可以是整數,表示均勻分為n組,也可以是
#正態分佈資料
import random
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']="SimHei"
plt.rcParams['axes.unicode_minus']=False
mu,sigma = 100,15
x = mu+sigma*np.random.randn(10000)
#the histgram of data
n,bins,pathces = plt.hist(x,50,density=0,facecolor="g",alpha=0.75)
plt.title("Histogram of IQ")
plt.xlabel("Smart")
plt.ylabel("頻數")
plt.text(60,500,r"$\mu=100,\ \sigma=15$")
plt.axis=([40,160,0,600])
plt.grid(True)

在這裡插入圖片描述
注意:plt.hist()函數中的density引數是布林型別,預設為None,當其值為False時,y軸表示頻數,當其值為True時,y軸表示頻率

5.2 繪製條形圖

條形圖是統計報告圖的一種,由一系列高低不等的縱向條紋或線段表示類別型資料分佈情況,一般用橫軸表類別,縱軸表示該樣本數量或佔比。
用條形圖可以比較直觀的看出產品品質特性的分佈狀態,便於判斷其總體品質情況,

  • bar()函數:plt.bar(left,height,width=0.8,bottom=None,hold=None,data=None,**kwargs)
  • 常用引數說明:
引數名稱說明
left接收array,表示x軸資料,無預設
height接收array,表示x軸所代表資料的數量。無預設
width接收0-1之間的float,指定條形圖的寬度,預設為0.8
color接收特定string或者包含顏色字串的array,表示條形圖的顏色,預設為None
grades = ["高一","高二","高三"]
values = [879,517,725]
plt.bar(grades,values,color="b",width=.4)
plt.title("全校人數")

在這裡插入圖片描述- 組合圖範例:

year = ["2017","2018","2019","2020"]
sales = np.random.rand(4)*1000000
conv = np.random.rand(4)
fig,ax = plt.subplots(figsize=(12,8))
ax1 = ax.twinx()#建立次座標軸

ax.bar(year,sales,color="skyblue")
ax1.plot(year,conv,"-o",color = "y")

在這裡插入圖片描述

5.3建立餅圖

餅圖是將各項的大小與各項的比例顯示在一張圖中,以每一部分的大小來確定每一項的佔比。
餅圖可以比較清楚的反映出部分與部分、部分與整體之間的比例關係,易於顯示每組資料相對於整體資料的大小,且比較直觀。

  • pie()函數:
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None,)

在這裡插入圖片描述

# 頻次或頻率
data = [1, 2, 3, 4, 5]  # 各類別佔比
# 各類別標籤
label = ['貓', '狗', '牛', '羊', '馬']
# 每個類別要繪製的顏色
color = ['lightblue', 'lightgreen', 'lightyellow', 'pink', 'orange']  # 各類別顏色
explode = (0, 0, 0, 0, 0.1)  # 各類別的偏移半徑
plt.pie(data,colors = color,labels=label,shadow=True,autopct="%.2f%%",explode=explode)

在這裡插入圖片描述

5.4 繪製箱形圖

箱形圖,能夠提供有關資料位置和分散情況的關鍵資訊,尤其是在比較常用的統計量,能提供有關資料位置和分散情況的關鍵性心,尤其是在表不同特徵時,更加可以表現其分散程度的差異。
箱形圖使用的5個統計量,分別是:最小值、下四分位數、中位數、上四分位數和最大值,它可以粗略的看出資料時候具有對稱性、分佈的分散程度等資訊,特別可以用於對幾個樣本的比較。

  • boxplot函數
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None,meanline=None, labels=None,)

常用引數:
在這裡插入圖片描述

5.5 雷達圖

雷達圖適用於顯示三個或更多的維度的變數,雷達圖是以在同一點開始的軸上顯示三個或者更多個變數的而為圖表的形式來顯示多後設資料的方法,其中軸的相對位置和角度通常是無意義的。
雷達圖對於檢視哪些變數具有相似的值、變數之間是否有異常值都很用。雷達圖也可以用於檢視哪些變數在資料集內得分較高或較低,因此非常適合顯示效能相關資料,常用於排名、評估、評論等資料的展示。

fig = plt.figure(figsize=(10,5))
# 玩家資料(0-10分)
data4 = np.array([[3.2, 1.7, 1.9, 2.5, 8.0],
                  [8.2, 6.9, 5.4, 1.7, 3.6],
                  [5.2, 4.2, 8.7, 0.5, 1.7],
                  [7.4, 5.4, 4.1, 3.5, 6.2]])
n,k = data4.shape#獲取陣列的行列資訊
# 各維度名稱
names = ['打錢速度', '擊殺助攻', '輸出能力', '控制時長', '吸收傷害']
ax = fig.add_subplot(111,polar=True)#設定極座標
angles = np.linspace(0,2*np.pi,k,endpoint=False)#建立等差數列繪製周長
angles = np.concatenate((angles,[angles[0]]))#使周長閉合,即在數列的最後增加一個數位,該數位為數列開始的數位
Linestyle = ['bo-', 'ro:', 'gD--', 'yv-.']  # 點線形狀
Fillcolor = ['b', 'r', 'g', 'y']  # 填充顏色\點線顏色
for i in range(n):
    data = np.concatenate((data4[i],[data4[i][0]]))#每一組資料都讓其閉合,形成一個封閉的圖形
    data = data4[i]
    ax.plot(angles,data,Linestyle[i],linewidth = 2)
    ax.fill(angles,data,facecolor=Fillcolor[i],alpha=0.25)
ax.set_thetagrids(angles[:-1] * 180/np.pi, names)  # 顯示類別名字
ax.set_title("玩家能力值對比圖", va='bottom')  # 設定標題
ax.set_rlim(0, 11)  # 設定各指標的最終範圍
ax.grid(True)  # 顯示網格

在這裡插入圖片描述