Python 數據分析三劍客之 Matplotlib(三):圖例 / LaTeX / 刻度 / 子圖 / 補丁等基本圖像屬性

CSDN 課程推薦:《Python 數據分析與挖掘》,講師劉順祥,浙江工商大學統計學碩士,數據分析師,曾擔任唯品會大數據部擔任數據分析師一職,負責支付環節的數據分析業務。曾與聯想、亨氏、網魚網咖等企業合作多個企業級項目。


Matplotlib 系列文章:


另有 NumPy、Pandas 系列文章已更新完畢,歡迎關注:


推薦學習資料與網站(博主參與部分文檔翻譯):



這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/105828143
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

【1x00】設置圖例

matplotlib.pyplot.legend() 方法可以爲圖表設置圖例。

基本語法:matplotlib.pyplot.legend(\*args, \*\*kwargs)

部分常見參數:

參數 描述
loc 圖例在畫布中的位置,默認爲 best,其他取值:
best, upper right, upper left, lower left
lower right, right, center left, center right
lower center, upper center, center
也可以用數字 0 - 10 來表示上述位置
bbox_to_anchor 調整圖例在畫布中的位置,當 loc 達不到我們想要的效果時,就可以使用該參數
該參數接收一個二元數組 (x, y),x 用於控制圖例的左右移動,值越大越向右邊移動
y 用於控制圖例的上下移動,值越大,越向上移動
borderaxespad 圖例距離軸之間的距離,float 類型,默認爲 0.5
borderpad 圖例邊框空白區域大小,float 類型,默認爲 0.4
columnspacing 圖例列間距,float 類型,默認爲 2.0
edgecolor 圖例邊緣線顏色,支持英文顏色名稱及其簡寫、十六進制顏色碼等
更多顏色示例參見官網 Color Demo
facecolor 圖例背景顏色,默認繼承自 axes.facecolor
其他顏色,支持英文顏色名稱及其簡寫、十六進制顏色碼等
更多顏色示例參見官網 Color Demo
fancybox 是否使用圓形框作爲圖例背景, 默認爲 True
fontsize 圖例字體大小,默認爲 mediumxx-small, x-small, small, medium
large, x-large, xx-large, smaller, larger
也可以使用數字來表示字體大小
framealpha 圖例透明度,float 類型,默認爲 0.8,取值範圍:[0, 1]
handleheight 圖例的高度 ,float 類型,默認爲 0.7
handlelength 圖例的寬度,float 類型,默認爲 2.0
handletextpad 圖例和圖例文本之間的水平距離,float 類型,默認爲 0.8
labelspacing 不同圖例之間的垂直距離,float 類型,默認爲 0.5
shadow 是否給圖例添加陰影效果,默認爲 False

【1x01】方法一:指定 label 參數

在畫圖的時候先指定 label 標籤文本,再調用 legend() 方法即可。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

plt.plot(a, b, label='圖例一')    # 指定 a,b 數據的圖例
plt.plot(x, y, label='圖例二')    # 指定 x,y 數據的圖例

plt.legend(loc=2, edgecolor='red', facecolor='#F5F5F5')  # 指定圖例位置、邊緣線條顏色和背景色
plt.show()

【1x02】方法二:使用 set_label 方法

在畫圖的時候先使用 set_label() 方法指定標籤文本,再調用 legend() 方法即可。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

line1, = plt.plot(a, b)
line2, = plt.plot(x, y)
line1.set_label('圖例一')    # 指定 a,b 數據的圖例
line2.set_label('圖例二')    # 指定 x,y 數據的圖例

plt.legend(loc=2, edgecolor='red', facecolor='#F5F5F5')  # 指定圖例位置、邊緣線條顏色和背景色
plt.show()

【1x03】方法三:直接使用 legend 方法

直接使用 legend() 方法來指定圖例標籤也可以達到同樣效果,圖例以列表或者元組形式儲存,圖例與繪製圖形的順序一一對應。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

plt.plot(a, b)
plt.plot(x, y)

plt.legend(['圖例一', '圖例二'], loc=2, edgecolor='red', facecolor='#F5F5F5')
plt.show()

也可以使用兩個元組,將繪製的圖形和圖例一一對應來儲存:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

line1, = plt.plot(a, b)
line2, = plt.plot(x, y)

plt.legend((line1, line2), ('圖例一', '圖例二'), loc=2, edgecolor='red', facecolor='#F5F5F5')
plt.show()

以上三種方法繪製的圖形均一致:

01

【2x00】數學公式 LaTeX

LaTeX(LATEX,音譯“拉泰赫”)是一種基於 TeX 的排版系統,常用於生成複雜表格和數學公式,Matplotlib 提供了自己的 TeX 表達式解析器,佈局引擎和字體,佈局引擎基於 Donald Knuth 的 TeX 佈局算法改編。使用數學公式時用 $ 將其包圍起來即可。具體的符號與其對應的英文表示參見官方文檔:https://matplotlib.org/tutorials/text/mathtext.html

應用舉例:

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)

plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize=20)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')

plt.plot(t, s)
plt.show()

02

【3x00】調整 x / y 軸刻度和範圍

在生成圖像時,默認會按照所給的數據均勻設置幾個刻度,如果對默認的刻度不滿意,則可以使用 xticks()yticks() 方法指定刻度值。xlim()ylim() 則可以設置刻度的範圍。

基本語法:
matplotlib.pyplot.xticks([ticks=None, labels=None, \*\*kwargs])
matplotlib.pyplot.yticks([ticks=None, labels=None, \*\*kwargs])

參數 描述
ticks 數組形式的位置列表,即顯示第 n 個位置的刻度,可選項,若傳遞空列表將刪除所有 xtick / ytick
labels 數組形式的值,在對應刻度線顯示的標籤信息。僅當同時傳遞了刻度時,才能傳遞此參數
**kwargs 其他參數參見 Text

其他參數裏面有一個常用的 rotation 參數,次參數可以用於設置刻度標籤的旋轉角度,對於標籤太長的可以將其旋轉一個角度來顯示。

應用舉例:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)

plt.plot(x, y)
# x 軸每隔三個顯示一次刻度,旋轉45°顯示標籤
plt.xticks(range(2, 26, 3), ('the {} ticks'.format(i) for i in range(2, 26, 3)), rotation=45)

plt.show()

03

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)

plt.xlim((0, 30))   # 設置 x 軸刻度範圍
plt.plot(x, y)

plt.show()

04

【4x00】畫布邊框與座標軸的移動

Matplotlib 所繪製的圖表中的每個繪圖元素,例如線條 Line2D、文字 Text、刻度等在內存中都有一個對象與之對應。

matplotlib.pyplot.gca() 函數用於獲取當前的繪圖區 Axes(Get Current Axes)

matplotlib.pyplot.gcf() 函數用於獲取當前的畫布 Figure(Get Current Figure)

例如:matplotlib.pyplot.plot() 實際上會通過 matplotlib.pyplot.gca() 獲得當前的 Axes對象 ax,然後再調用 ax.plot() 方法實現真正的繪圖。我們可以通過這種方法來實現畫布邊框的隱藏和座標軸的移動。

應用舉例:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 2*np.pi, np.pi/100)
y = np.sin(x)
plt.plot(x, y)

plt.xlabel('X axis')
plt.ylabel('Y axis')

ticks = (0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi)
labels = ('0', r'$\frac{\pi} {2}$', r'$\pi$', r'$\frac{3\pi} {2}$', r'$2\pi$')
plt.xticks(ticks, labels)                      # 設置 x 座標軸顯示的數據

ax = plt.gca()                                 # 獲取當前的畫布, gca = get current axes
ax.spines['right'].set_visible(False)          # 設置右邊框不顯示
ax.spines['top'].set_visible(False)            # 設置上邊框不顯示
# ax.spines['top'].set_color('none')           # 設置顏色爲無也可以

ax.xaxis.set_ticks_position('bottom')          # 設置 x 座標軸的標籤位置
ax.yaxis.set_ticks_position('left')            # 設置 y 座標軸的標籤位置
ax.spines['bottom'].set_position(('data', 0))  # 設置 x 軸在 (0, 0) 位置
ax.spines['left'].set_position(('data', 0))    # 設置 y 軸在 (0, 0) 位置

plt.show()

05


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/105828143
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

【5x00】創建子圖

子圖的概念:在同一張畫布中創建多個圖像,方便對數據進行對比。

【5x01】方法一:add_subplot()

首先創建一個畫布,然後利用 add_subplot() 方法填充子圖,該方法接收三個參數,前兩個參數表示子圖有幾行幾列,最後一個參數表示第幾個子圖,如:fig.add_subplot(221) 表示總共有兩行兩列(2x2=4)一共4個子圖,當前是第一個子圖。若子圖大於9個則用逗號隔開即可。

應用舉例:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)

fig = plt.figure(figsize=(12, 6))

ax1 = fig.add_subplot(221)   # 第 1 個子圖
ax1.plot(x, x)

ax2 = fig.add_subplot(222)   # 第 2 個子圖
ax2.plot(x, -x)

ax3 = fig.add_subplot(223)   # 第 3 個子圖
ax3.plot(x, x ** 2)

ax4 = fig.add_subplot(224)   # 第 4 個子圖
ax4.plot(-x, x ** 2)

plt.show()

06

【5x02】方法二:pyplot.subplot()

matplotlib.pyplot.subplot() 方法和 add_subplot() 方法有點兒類似,同樣接收三個參數,前兩個參數表示子圖有幾行幾列,最後一個參數表示第幾個子圖。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)

plt.figure(figsize=(12, 6))

plt.subplot(221)     # 第 1 個子圖
plt.plot(x, x)

plt.subplot(222)     # 第 2 個子圖
plt.plot(x, x ** 2)

plt.subplot(223)     # 第 3 個子圖
plt.plot(x, x ** 3)

plt.subplot(224)     # 第 4 個子圖
plt.plot(x, x ** 4)

plt.show()

07

【5x03】方法三:pyplot.subplots()

matplotlib.pyplot.subplots() 函數會將畫布分割成指定的列和行,分割後依次在各個區域畫圖即可。注意與 matplotlib.pyplot.subplot() 略有差別。

fig, axes = plt.subplots 的意思是:plt.subplots 方法會返回一個包含 figure(畫布) 和 axes(繪圖區) 對象的元組,fig 和 axes 參數分別接收這兩個對象,後期對不同繪圖區進行處理即可。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
fig, axes = plt.subplots(figsize=(12, 6), nrows=2, ncols=2)  # 將畫布分割爲2行2列,起始值爲0

axes[0][0].plot(x, x)         # 繪製第1行第1列
axes[0][1].plot(x, -x)        # 繪製第1行第2列
axes[1][0].plot(-x, x ** 2)   # 繪製第2行第1列
axes[1][1].plot(x, -x ** 2)   # 繪製第2行第2列

plt.show()

08

【6x00】填充補丁

matplotlib.patches 可用於在畫布上填充圓形、長方形、橢圓形、多邊形等多種圖像補丁。

官方文檔:https://matplotlib.org/api/patches_api.html

描述
matplotlib.patches.Arc(xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs) 橢圓弧
matplotlib.patches.Arrow(x, y, dx, dy, width=1.0, **kwargs) 箭頭
matplotlib.patches.Circle(xy, radius=5, **kwargs)
matplotlib.patches.Ellipse(xy, width, height, angle=0, **kwargs) 橢圓
matplotlib.patches.CirclePolygon(xy, radius=5, resolution=20, **kwargs) 近似多邊形的圓形面片
matplotlib.patches.Polygon(xy, closed=True, **kwargs) 不規則多邊形
matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs) 矩形
matplotlib.patches.RegularPolygon(xy, numVertices, radius=5, orientation=0, **kwargs) 正多邊形
matplotlib.patches.Shadow(patch, ox, oy, props=None, **kwargs) 創建給定補丁的陰影
matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs) 楔形

應用舉例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes

x = np.arange(0.0, 2.0, 0.01)
y = np.sin(2*np.pi*x)

# 獲取當前繪圖區(gca = Get Current Axes
ax = plt.gca()

# 圓形:圓點(0.2, -0.25),半徑0.2,紅色
circle = mpathes.Circle((0.2, -0.25), 0.2, color='r')

# 長方形:左側和底部座標(0.25, 0.75),寬0.25,高0.15,透明度0.5
rect = mpathes.Rectangle((0.25, 0.75), 0.25, 0.15, alpha=0.5)

# 正多邊形:中心點座標(1.0, 0),頂點數6,中心到每個頂點的距離0.25
regular_polygon = mpathes.RegularPolygon((1.0, 0), 6, 0.25, color='g')

# 不規則多邊形:polygon_point 爲要連接的點的座標
polygon_point = [[1.5, -0.75], [1.75, -1], [2.0, 0], [1.5, -0.25]]
polygon = mpathes.Polygon(polygon_point, color='#FF69B4', alpha=0.3)

# 橢圓形:中心點座標(1.25, 0.75),橫軸長度0.4,垂直軸長度0.2
ellipse = mpathes.Ellipse((1.25, 0.75), 0.4, 0.2, color='y')

# 將補丁添加到當前繪圖區
ax.add_patch(circle)
ax.add_patch(rect)
ax.add_patch(regular_polygon)
ax.add_patch(polygon)
ax.add_patch(ellipse)

plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.grid()
plt.plot(x, y)
plt.show()

09

【7x00】保存圖像

matplotlib.pyplot.savefig() 方法可以將繪製的圖像保存到本地,支持多種格式:eps, pdf, pgf, png, ps, raw, rgba, svg, svgz。

注意:因爲調用 plt.show() 函數後,會創建一個新的空白的圖片,所以在保存圖片時注意要在 plt.show() 前調用 plt.savefig()

基本語法:matplotlib.pyplot.savefig(fname, dpi=None, facecolor='w', edgecolor='w', format=None, transparent=False)

參數 描述
fname str 類型 / 文件路徑 / 類似文件的對象
如果未設置格式,則根據 fname 的擴展名(如果有)和 rcParams[“savefig.format”] = ‘png’ 推斷輸出格式
如果設置了格式,則它將確定輸出格式
dpi 保存圖片的像素(dpi),以每英寸點數爲單位。如果爲 None,則默認取 rcParams[’savefig.dpi’] = ‘figure’
facecolor 保存圖片的畫布顏色,默認爲 white
edgecolor 保存圖片的邊緣顏色,默認爲 white
format 保存圖片的格式,未設置則取 fname 中的格式
transparent 保存圖片的背景是否透明

應用舉例:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

line1, = plt.plot(a, b)
line2, = plt.plot(x, y)

plt.legend((line1, line2), ('圖例一', '圖例二'), loc=2, edgecolor='red', facecolor='#F5F5F5')
plt.savefig('D:\\data\\pic.png', transparent=True)  # 保存爲透明文件
plt.show()

10


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/105828143
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

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