一篇文章掌握Python機器學習繪圖庫matplotlib

前言

前面博主介紹過的pandas庫,而今天介紹的matplotlib庫能和pandas庫結合起來,讓數據更加的直觀,易懂。

Matplotlib 是 Python 的一個繪圖庫。它包含了大量的工具,你可以使用這些工具創建各種圖形,包括簡單的散點圖,正弦曲線,甚至是三維圖形。好了,下面我們直接進入實戰代碼學習。

折線圖

首先,就是我們圖標之中常用的折線圖,對於折線圖來說,能直觀的看到數據的漲跌變化,比如股市常用的圖形就是折線圖,下面我們來看看代碼如何實現:

import matplotlib.pyplot as plt

x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
plt.plot(x, y)
plt.show()

代碼非常簡單,就是確定X,Y軸的數據,然後顯示出來,這段代碼顯示的效果如下:

折線圖當然這是折線圖的基本,也是最簡單的玩法, 其實對於matplotlib庫來說,折線圖還有很多的玩法,比如可以修改折線的顏色,折現的樣式等,直接上代碼:

plt.plot(x, y,'r--')

僅僅只修改這一句就行,r代表虛線的顏色爲紅色, ‘–’代表折線的樣式爲–,顯示效果如下圖所示:
紅色折線圖這是最簡單的用法,爲了便於理解後面的知識點,這裏開始深入展開,比如先明確Figure的概念,我們先來看一張圖:
在這裏插入圖片描述圖片上,Figure代表畫板,Axes/Subplot代表畫紙,其他兩個英文就是X軸與Y軸,所以假如我們需要在一張畫紙上畫4個折線圖就需要用到這些知識點,代碼如下:

x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 獲取畫板
ax1 = fig.add_subplot(221)  # 獲取畫紙
ax1.plot(x, y)
ax2 = fig.add_subplot(222)  # 獲取畫紙
ax2.plot(x, y)
ax3 = fig.add_subplot(223)  # 獲取畫紙
ax3.plot(x, y)
ax4 = fig.add_subplot(224)  # 獲取畫紙
ax4.plot(x, y)
plt.show()

這裏我們創建了畫板,同時創建了畫紙,這裏設置爲兩行行列的畫板,同時分別獲取某個位置的畫紙,這樣我們就能畫出4個折線圖,顯示效果如下:
在這裏插入圖片描述

折線圖的詳細用法

如果使用如上方式先創建畫板在獲取畫紙進行畫圖的話,我們如何設置其他的參數呢?下面我們直接來看一段代碼:

matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
ax.plot(x, y, linestyle='--', marker='o')#設置X,Y數據,顯示折現的樣式(--),以及數據點的樣式(圈)
ax.set_title("我的標題")  # 設置你的標題
ax.set_xlabel('X軸')  # 設置X軸的文字
ax.set_ylabel('Y軸')  # 設置Y軸的文字
ax.set_xticks(['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08'])  # 更改X軸刻度
ax.set_xticklabels(['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08'],
                   rotation=30, fontsize='small')  # 增加X軸刻度文字旋轉角度以及字體大小
ax.grid()#增加網格
ax.tick_params(axis='x', labelsize=7, rotation=45, colors='red')#同樣可以設置X軸字體樣式旋轉角度,文字顏色,第一個參數爲哪個軸
for i, j in zip(x, y):
    ax.annotate('%s' % (j), xy=(i, j), xytext=(0, 15), textcoords='offset points', ha='center')
#將詳細數據顯示在折線圖上,
#第一個參數爲註釋點顯示的數據,第二參數爲數據顯示圖中的哪個座標
# textcoords註釋文本的座標系屬性,默認與xycoords屬性值相同,也可設爲不同的值。除了允許輸入xycoords的屬性值,還允許輸入以下兩種:
# offset points相對於被註釋點xy的偏移量(單位點)
# offset pixels相對於被註釋點xy的偏移量(單位像素)
#第四個參數顯示的文字在中間
plt.show()

上面基本把常用的方法全部都寫在了代碼中,而且註釋已經寫的非常的詳細,這裏博主不在過多的贅述,上面代碼顯示的效果圖如下:
折線圖

柱狀圖

除了生活中常見的折線圖之外,我們還常常見到各種報表中,也有柱狀圖,同樣柱狀圖也可以通過matplotlib包實現,下面我們先來看一個簡單的用法:

x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
ax.bar(x, y)
plt.show()

在matplotlib中,我們通過bar實現柱狀圖,而之前的折現圖我們通過plot方法實現,上面是最簡單的實現方式,實現效果圖如下:
柱狀圖

柱狀圖的詳細用法

接着,我們同樣深入瞭解柱狀圖,看看如何實現,讓其效果更佳,同樣,我們先來看一段代碼:

import matplotlib.pyplot as plt
import matplotlib.colors as col
import matplotlib.cm as cm
import matplotlib
import numpy as np
#下面三行用處爲避免中文亂碼
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
x = [2000, 2005, 2010, 2015, 2020, 2025, 2030, 2035]
y = [0, 15, 23, 68, 45, 86, 54, 24]
y2 = [0, 10, 20, 60, 40, 80, 50, 20]
fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
ax.bar([i + 1 for i in x], y2)
ax.set_title("柱狀圖")
ax.set_xlabel("X數據")
ax.set_ylabel("Y數據")
ax.grid()#增加網格
ax.tick_params(axis='x', labelsize=7, rotation=45, colors='red')
#annotate對齊方式
#arrowprops繪畫箭頭
for i, j in zip(x, y):
    ax.annotate('%s' % (j), xy=(i, j), xytext=(0, 25), textcoords='offset points', ha='center',
        arrowprops=dict(facecolor='black', shrink=0.15), fontsize=7)
patterns = {'-', '+', 'x', '\\', '*', 'o', '0', '.', 'v', '^', '1', '2', '3', '4', '8', 's', 'p', 'h'}#柱形圖的樣式
#cm.ScalarMappable給定的顏色映射返回RGBA顏色之前使用數據標準化
#colors.Normalize使用方法如下:
# class matplotlib.colors.Normalize(vmin=None, vmax=None)
# 參數vmin、vmax分別爲要設置的數據範圍最小值和最大值;
# 範圍外的值分別顯示最大值或最小值的顏色。
#cm.hot表示風格
camp1 = cm.ScalarMappable(col.Normalize(min(y), max(y) + 20), cm.hot)
#edgecolor:柱子輪廓色
#color:柱子填充色
#camp1.to_rgba(y)返回顏色值
bars = ax.bar(x, y, alpha=0.5, color=camp1.to_rgba(y), edgecolor='red', label=u'柱形圖')
for bar, pattern in zip(bars, patterns):
    bar.set_hatch(pattern)#設置每個柱形的填充樣式
ax.legend(loc='upper left')#左上角的提示
plt.show()

折現圖的某些方法,在柱狀圖中依然可以使用,而且上面代碼也有柱狀圖獨有的方法函數,其中一些都寫了註釋,方便大家閱讀,上面這段代碼顯示的效果如下:
柱狀圖當然柱狀圖並不僅僅只有豎着的纔是柱狀圖,有時候我們也可以看到許多橫着的柱狀圖,那麼橫着的柱狀圖在matplotlib中是如何實現的呢?還是一樣直接看一段代碼:

x = [2000, 2005, 2010, 2015, 2020, 2025, 2030, 2035]
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
ax.barh(x, y)
plt.show()

代碼很簡單,就是把bar方法換成barh方法,而且上面bar能用的其他設置barh一樣都可以使用,這段代碼就實現了橫行柱狀圖,實現效果如下:
橫柱狀圖

餅圖

折線圖可以看清楚數據的走勢漲跌以及升遷,柱狀圖可以看清楚高低長短以及大小,但是它們都無法確認數據的百分比分佈情況,所以這個時候就需要餅圖,我們先來看一看餅圖的簡單用法:

fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
labels = ['娛樂', '育兒', '飲食', '房貸', '交通', '其它']
sizes = [2, 5, 12, 70, 2, 9]
plt.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=False, startangle=150)
plt.title("餅圖示例-8月份家庭支出")
plt.show()

在matplotlib包中,我們使用餅圖的方法是pie,而且百分比也不用我們自己來計算,pie方法會自動幫我們計算數組的綜合,然後在分別每個數佔據的比例,上面的代碼顯示效果如下:
餅圖

餅圖的詳細用法

同樣上面都是一些最基本的用法,我們實際的項目中可能還需要餅圖的其他各種詳細的設置,所以,我們先來看看餅圖詳細用法的一些代碼:

fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
labels = ['娛樂', '育兒', '飲食', '房貸', '交通', '其它']
sizes = [2, 5, 12, 70, 2, 9]
explode = (0,0,0,0.1,0,0)
'''
x:指定繪圖的數據;
explode:指定餅圖某些部分的突出顯示,即呈現爆炸式;
labels:爲餅圖添加標籤說明,類似於圖例說明;
colors:指定餅圖的填充色;
autopct:自動添加百分比顯示,可以採用格式化的方法顯示;
pctdistance:設置百分比標籤與圓心的距離;
shadow:是否添加餅圖的陰影效果;
labeldistance:設置各扇形標籤(圖例)與圓心的距離;
startangle:設置餅圖的初始擺放角度;
radius:設置餅圖的半徑大小;
counterclock:是否讓餅圖按逆時針順序呈現;
wedgeprops:設置餅圖內外邊界的屬性,如邊界線的粗細、顏色等;
textprops:設置餅圖中文本的屬性,如字體大小、顏色等;
center:指定餅圖的中心點位置,默認爲原點
frame:是否要顯示餅圖背後的圖框,如果設置爲True的話,需要同時控制圖框x軸、y軸的範圍和餅圖的中心位置;
'''
plt.pie(sizes,explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
'''
legend畫出右上角顯示的顏色文字配對詳情
loc:圖例所有figure位置
bbox_to_anchor:指定圖例在軸的位置
fontsize:文字大小
borderaxespad:軸與圖例邊框之間的距離
frameon:是否去掉圖例邊框,false代表是
edgecolor:設置圖例邊框顏色
facecolor:設置圖例背景顏色,若無邊框,參數無效
handletextpad:圖例句柄和文本之間的間距
handlelength:圖例句柄的長度
handleheight:圖例句柄的高度
labelspacing:圖例條目之間的垂直間距
borderpad:圖例邊框的內邊距
framealpha:控制圖例框架的 Alpha 透明度
shadow:控制是否在圖例後面畫一個陰影
'''
ax.legend(loc='best', bbox_to_anchor=(1.1, 1.05), fontsize=8, borderaxespad=0.3,labelspacing=2.0)
plt.title("餅圖示例-8月份家庭支出")
plt.show()

上面都是餅圖常用的參數,其中有些參數並不是餅圖用的所以這裏沒有講解,因爲legend有很多參數,而且大部分還是散點圖用的參數,我們將馬上講解散點圖,我們看看上面代碼實現的效果圖:
詳細用法

散點圖

以上三種圖都是我們生活中常見的圖,比如財務報表,理財開支,生活貸款以及科學計算都會用到上面三種圖形,但是有一種圖是科學計算中獨用的,那就是散點圖,生活中基本見不到這種圖,但從事科學研究的大佬肯定經常用到,下面我們來看看它的簡單用法:

fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y)
plt.show()

在matplotlib包中,散點圖的方法是scatter,上面的代碼我們使用numpy庫隨機生成了1000具有標準正態分佈的數據,定位X,Y的座標,然後顯示出來,顯示的效果如下圖所示:
散點圖

散點圖的詳細用法

當然這是散點圖最基本的用法,下面我們來看看散點圖的詳細用法,這裏我們不和上面一樣籠統的代碼註釋講解,我們將分別講解散點圖的方法參數,首先也就是我們創建散點圖的方法scatter它的參數:

scatter(x, y, s=None, c=None, marker=None, 
cmap=None, norm=None, vmin=None, 
vmax=None, alpha=None, linewidths=None, 
verts=None, edgecolors=None, 
hold=None, data=None, **kwargs)

參數的意思分別如下:

    x,y:數據座標
    
    s:原點的大小,也需要是一個list數組的類型,設置每個點的大小
    
    c:顏色,可以單獨設置(單獨設置傳入list數組),可以整體設置
    
    marker:`〜matplotlib.markers.MarkerStyle`,可選,默認值:'o'
        請參閱`〜matplotlib.markers`以獲取有關不同的更多信息
        標記分散支持的樣式。 `marker`可以是
        該類的實例或特定文本的簡寫
        標記。
    
    cmap:`〜matplotlib.colors.Colormap`,可選,默認:無
        一個`〜matplotlib.colors.Colormap`實例或註冊名稱。
        `cmap`僅在`c`是浮點數組時使用。如果沒有,
        默認爲rc`image.cmap`。
    
    norm:`〜matplotlib.colors.Normalize`,可選,默認:無
        `〜matplotlib.colors.Normalize`實例用於縮放
        亮度數據爲0,1。`norm`只有在`c`是一個數組時才被使用
        彩車。如果`None',則使用默認值:func:`normalize`。
    
    vmin,vmax:標量,可選,默認值:無
        `vmin``vmax``norm`結合使用來標準化
        亮度數據。如果其中任何一個都是`無',那麼最小和最大的
        使用顏色數組。請注意,如果你通過一個“規範”實例,你的
        `vmin``vmax`的設置將被忽略。
    
    alpha:透明度
    
    linewidths:標量或array_like,可選,默認值:無
        如果無,則默認爲(lines.linewidth,)。
    
    verts:(x,y)的序列,可選
        如果`marker`爲None,這些頂點將用於
        構建標記。標記的中心位於
        在(0,0)爲標準化單位。整體標記重新調整
        由``s``完成。
    
     edgecolors :邊框顏色

比如我下面這段代碼設置了每個點的大小,顏色,邊框,透明度,樣式爲右尖三角形。代碼如下:

fig = plt.figure()  # 獲取畫板
ax = fig.add_subplot(111)  # 獲取畫紙
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
color = ['r', 'y', 'k', 'g', 'm', 'r', 'y', 'k', 'g', 'm']
plt.scatter(x, y, color=color, marker='>',
            s=s, edgecolor='black', alpha=0.5)
for x, y in zip(x, y):
    plt.annotate('(%s,%s)' % (x, y), xy=(x, y), xytext=(0, -10), textcoords='offset points', ha='center', va='top')
plt.show()

可以看到我們設置的點其實都在一條直線上,而且我們也同樣使用了annotate方法,標記點的座標顯示在圖像上,前面的有些方法,在散點圖中依舊可以用,包括legend方法,這段代碼顯示的效果如下:
散點圖對角線對於matplotlib包常用的繪圖操作來說,上面基本都講解到了,其他的都是一些比較偏門的知識,感興趣的可以查詢文檔更深入的瞭解,但學會了上面的繪圖代碼,基本上大多數情況下都能輕鬆應付自如,好了matplotlib庫就講解到這裏,覺得有用的可以點個贊支持一下,謝謝。

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