Matplotlib可視化入門飘诗,看這一篇就夠了

Matplotlib是 Python 最著名的2D繪圖庫与倡,提供了豐富的數據繪圖工具,主要用于繪制一些統計圖形昆稿。Matplotlib可用于Python腳本纺座,Python和IPython shell,Jupyter筆記本溉潭,Web應用程序服務器和四個圖形用戶界面工具包净响。

matplotlib.pyplot API 官方教程

高效使用 Python 可視化工具 Matplotlib

相信初接觸matplotlib肯定會有些困惑,同樣一個目標有多個解決方案喳瓣,有人用plt.xx馋贤,有人用ax.xx,對小白及其不友好畏陕,照葫蘆畫瓢搞出來了配乓,但不明白為什么,寫出來的代碼很混亂惠毁。下次遇到問題依然一頭霧水犹芹。我也是這樣,所以鞠绰,花時間讀了很多文章腰埂,整理了一下知識點,入門夠用了蜈膨。另盐固,涉及到的文章都貼出了鏈接,可以一并閱讀丈挟,加深理解。

matplotlib架構

matplotlib的架構分為以下三層

  • Scripting (腳本)層
  • Artist (表現)層志电。擁有許多可視化元素曙咽,如figure、axes挑辆、axis等元素例朱。
  • Backend (后端)層孝情。包含 pyplot 和 pylab 模塊(已棄用,不推薦)

它們之間的訪問關系是:

Scripting 訪問 Artist洒嗤, Artist 訪問 Backend

理論上各層都可以畫出相同的圖形箫荡,但越底層的操作越細節(jié)越困難,越高層越易于人機交互渔隶,越容易羔挡。也就是說上層是下層的封裝,把一些不需要打交道的事情封裝好间唉,實際畫圖只關心效果即可绞灼。

matplotlib 架構

matplotlib兩種繪圖API

在Matplotlib庫中提供了兩種風格的API供開發(fā)者使用。這也就是為什么有人用plt.xx呈野,有人用ax.xx的原因低矮。好的代碼應該堅持使用一種風格,否則會顯得混亂被冒,閱讀起來困難军掂,不利于維護。

  • Pyplot編程接口(state-based)不推薦
  • 面向對象的編程接口(object-based)推薦

之前有三種api昨悼,還有一種pylab api蝗锥,模仿matlab的工作方式,但大量導入全局命名方式導致意外行為幔戏,被認為是糟糕的風格玛追,matplotlib最新版中已棄用此方式。理解matplotlib闲延、pylab與pyplot之間的關系

另外痊剖,pandas自帶的df.plot()方法也可以繪制簡單的圖形,它是使用matplotlib庫的plot()方法的簡單包裝實現的垒玲。最好不要用陆馁,pandas作為數據分析來用,繪圖就交給matplotlib等專業(yè)的繪圖庫來做合愈。下文也介紹一下叮贩,下次看到這種解決方案可以心中有數,不迷惑佛析。

Matplotlib中的兩種繪圖API說明

matplotlib 實際上就是提供了 3 種API

Matplotlib中的plt和ax都是啥益老?

matplotlib:先搞明白plt. /ax./ fig再畫

matplotlib圖像的結構

matplotlib_PartsOfAFugure_2021_01_16

在matplotlib中,整個圖像為一個Figure對象寸莫,相當于畫板捺萌。在Figure對象中可以包含一個或者多個Axes對象(畫紙)。每個Axes(ax)對象都是一個擁有自己坐標系統axis的繪圖區(qū)域膘茎。

Python matplotlib結構詳解

以兩個例子來介紹兩種方法的使用桃纯。下面兩幅圖分別用pyplot編程接口和面向對象編程接口實現酷誓。單子圖、多子圖都涉及到了态坦,用法在代碼里表達的很清楚了盐数。

單子圖柱狀圖

matplotlib_兩種繪圖api比較示例_單子圖_2021_01_18

多子圖柱狀圖

matplotlib_兩種繪圖api比較示例_多子圖_2021_01_18

一些其他圖形如折線圖、散點圖伞梯、餅圖等跟示例的柱狀圖大同小異玫氢,各種參數自行學習。不容錯過的Matplotlib常見用法小結 非常全面的Matplotlib畫圖方法壮锻、Matplotlib 1.4W+字教程的圖形繪制部分

  • plot 折線圖
  • bar 柱狀圖
  • barh 條形圖
  • hist 直方圖
  • pie 餅圖
  • boxplot 箱形圖
  • scatter 散點圖
  • polar 極坐標圖

Pyplot編程接口(state-based)不推薦

Pyplot封裝了底層的繪圖函數提供了一種繪圖環(huán)境琐旁,當使用plt.xx繪制圖形的時候,默認的Figure以及Axes等對象會自動創(chuàng)建以支持圖形的繪制猜绣。此方式屏蔽了一些底層通用的繪圖對象的創(chuàng)建細節(jié)灰殴,書寫簡潔。另外掰邢,pyplot是有狀態(tài)的牺陶,亦即它會保存當前圖片和作圖區(qū)域的狀態(tài),新的作圖函數會作用在當前圖片的狀態(tài)基礎之上辣之,代碼的位置要注意掰伸。遇到一些比較復雜的圖時不方便。官方推薦使用面向對象方式繪圖怀估。

import numpy as np
import matplotlib.pyplot as plt
 
# 準備數據
dog = (20, 28, 22, 30)
cat = (25, 32, 20, 27)

ind = np.arange(len(dog)) # 生成0-3的數組狮鸭,用于x軸刻度值
quarter = ['一季度','二季度','三季度','四季度']
width = 0.35    # 圖形柱的寬度

#################################################
# 一個子圖

# 繪圖
# x的位置調節(jié)好,不然兩個柱會重疊
plt.bar(ind - width/2, dog, width, label='Dog')
plt.bar(ind + width/2, cat, width, label='Cat')

# 調節(jié)組件
plt.ylabel('銷售額(萬)')
plt.title('各季度貓狗產業(yè)銷售額')
plt.xticks(ind,quarter)
plt.legend(loc=2)

# 保存圖形
plt.savefig('matplotlib_pyplot方式單子圖.png')
#################################################

#################################################
# 多個子圖多搀。有狀態(tài)歧蕉,細節(jié)調整需在各個subplot內調節(jié)

# 繪圖 第一個子圖
plt.subplot(121)    #1行2列,占用第一個
plt.bar(ind, dog, width, color='dodgerblue', label='Dog')

# 調節(jié)組件
plt.ylabel('銷售額(萬)')
plt.title('各季度狗產業(yè)銷售額')
plt.xticks(ind,quarter)

# 繪圖 第二個子圖
plt.subplot(122)    #1行2列康铭,占用第二個
plt.bar(ind, cat, width, color='darkorange', label='Cat')

# 調節(jié)組件
plt.ylabel('銷售額(萬)')
plt.title('各季度貓產業(yè)銷售額')
plt.xticks(ind,quarter)

# 保存圖形
plt.savefig('matplotlib_pyplot方式多子圖.png')
#################################################

# 交互展示
plt.show()

面向對象的編程接口(object-based)推薦

面向對象的繪圖方式主要使用matplotlib的兩個子類:matplotlib.figure.Figure和matplotlib.axes.Axes惯退。我們需要自己創(chuàng)建figure(畫板),axes(畫紙)从藤。畫板(figure)為matplotlib.figure.Figure的一個實例催跪,每個子圖(畫紙,axes)為matplotlib.axes.Axes的一個實例夷野,分別可以繼承父類的所有方法懊蒸,也就是說你繪圖時,你想設置的元素(網格線啊悯搔,坐標刻度啊等)都可以在二者的屬性中找出來使用榛鼎。使用面向對象編程接口有利于我們對于圖形繪制的完整控制,處理復雜圖形更有優(yōu)勢。但是相對于Pyplot接口可能需要書寫更多的代碼者娱。

import numpy as np
import matplotlib.pyplot as plt

# 準備數據
dog = (20, 28, 22, 30)
cat = (25, 32, 20, 27)

ind = np.arange(len(dog)) # 生成0-3的數組,用于x軸刻度值
quarter = ['一季度','二季度','三季度','四季度']
width = 0.35    # 圖形柱的寬度

#################################################
# 一個子圖

# 繪圖
fig, ax = plt.subplots()    # 實例畫板fig畫紙ax
# x的位置調節(jié)好苏揣,不然兩個柱會重疊
ax.bar(ind - width/2, dog, width, label='Dog')
ax.bar(ind + width/2, cat, width, label='Cat')

# 調節(jié)組件
ax.set_ylabel('銷售額(萬)')
ax.set_title('各季度貓狗產業(yè)銷售額')
ax.set_xticks(ind)
ax.set_xticklabels(quarter)
ax.legend(loc=2)

# 保存圖形
fig.savefig('matplotlib_兩種繪圖api比較示例_單子圖.png')
#################################################

#################################################
# 多個子圖黄鳍。無狀態(tài),ax[0]平匈,ax[1]代表各子圖

# 繪圖
fig, ax = plt.subplots(1,2) #(1,2)代表1行2列兩個區(qū)域
# 設置圖形對象 :窗口

# ax[0]代表第一個子圖框沟,ax[1]代表第二個子圖
ax[0].bar(ind, dog, width, color='dodgerblue', label='Dog')
ax[1].bar(ind, cat, width, color='darkorange', label='Cat')

# 調節(jié)組件
ax[0].set_ylabel('銷售額(萬)')
ax[0].set_title('各季度狗產業(yè)銷售額')
ax[0].set_xticks(ind)
ax[0].set_xticklabels(quarter)

ax[1].set_ylabel('銷售額(萬)')
ax[1].set_title('各季度貓產業(yè)銷售額')
ax[1].set_xticks(ind)
ax[1].set_xticklabels(quarter)

# 保存圖形
fig.savefig('matplotlib_兩種繪圖api比較示例_多子圖.png')
#################################################

# 交互展示
plt.show()  # 面向對象接口不能使用交互式的show()方法對圖像直接進行顯示。如果想交互顯示增炭,需要用pyplot方式

pandas自帶df.plot()方法 不要用

pandas自帶的df.plot()方法也可以繪制簡單的圖形忍燥,它是使用matplotlib庫的plot()方法的簡單包裝實現的。最好不要用隙姿,pandas作為數據分析來用梅垄,繪圖就交給matplotlib等專業(yè)的繪圖庫來做。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 準備數據
dog = (20, 28, 22, 30)
cat = (25, 32, 20, 27)
data = {
        'Dog': dog,
        'Cat': cat}

ind = np.arange(len(dog)) # 生成0-3的數組输玷,用于x軸刻度值
quarter = ['一季度','二季度','三季度','四季度']
width = 0.35    # 圖形柱的寬度

# 生成DataFrame
df = pd.DataFrame(data,index=ind)

# df.plot()方法繪圖队丝。kind代表繪圖類型
ax = df.plot(kind='bar')

# 調節(jié)組件
ax.set_ylabel('銷售額(萬)')
ax.set_title('各季度貓狗產業(yè)銷售額')
ax.set_xticks(ind)
ax.set_xticklabels(quarter)
ax.legend(loc=2)

# 交互展示
plt.show()
matplotlib_兩種繪圖api比較示例_單子圖_2021_01_18

Pandas的可視化操作(利用pandas得到圖表)

matplotlib組件詳解

在matplotlib中,整個圖像為一個Figure對象欲鹏。在Figure對象中可以包含一個或者多個Axes對象机久。每個Axes(ax)對象都是一個擁有自己坐標系統的繪圖區(qū)域。

matplotlib的圖的構成元素

matplotlib_AnatomyOfAFigure_2021_01_16
  • 坐標軸(axis)
  • 坐標軸名稱(axis label)
  • 坐標軸刻度(tick)
  • 坐標軸刻度標簽(tick label)
  • 坐標軸邊界(lim)
  • 網格線(grid)
  • 圖例(legend)
  • 標題(title)
  • 邊框(spine)

建議收藏赔嚎!Matplotlib常見組件設置整理

中文亂碼膘盖、負號顯示

知乎問題-中文亂碼、負號不能正常顯示尤误∠琅希看猴子的回答

設置標題 ax.set_title()

單子圖用ax.,多子圖用ax[].

ax.set_title('標題',fontdict={'size':16},loc = 'left')    #設置16px的字體大小袄膏,將標題顯示在左側

設置邊框(spine) ax.spines

默認圖表中會顯示上下左右四條spine践图,可根據需要設置為不顯示

ax.spines['right'].set_visible(False)   #去除右邊的spines
ax.spines['bottom'].set_color('r')  #設置底部的spines為紅色

設置坐標軸相關

設置坐標軸名稱
ax.set_xlabel('季度',fontsize=16)
ax.set_xlabel('銷售額',fontsize=16)
設置坐標軸刻度標簽
# 更改刻度標簽。此例將0沉馆,1码党,2,3更改為一季度斥黑,二季度揖盘,三季度,四季度
ax.set_xticks(ind)
ax.set_xticklabels(quarter)

# 設置刻度標簽屬性
# axis : 可選{‘x’, ‘y’, ‘both’} 锌奴,選擇對哪個軸操作兽狭,默認是’both’
# labelsize設置刻度標簽的大小
# direction{‘in’, ‘out’, ‘inout’}刻度線的方向
# color : 刻度線的顏色
# labelcolor : 刻度值顏色
ax.tick_params(axis = 'y', labelsize=14,direction='in',labelcolor='r')

ax.tick_params()參數詳解

設置刻度間隔
#從pyplot導入MultipleLocator類,這個類用于設置刻度間隔
from matplotlib.pyplot import MultipleLocator

#把x軸的刻度間隔設置為1,并存在變量里
x_major_locator=MultipleLocator(1)

#把y軸的刻度間隔設置為10箕慧,并存在變量里
y_major_locator=MultipleLocator(10)

#把x軸的主刻度設置為1的倍數
ax.xaxis.set_major_locator(x_major_locator)

#把y軸的主刻度設置為10的倍數
ax.yaxis.set_major_locator(y_major_locator)
設置坐標軸邊界
ax.set_xlim([0,12])  # x軸邊界
ax.set_ylim([0,50])  # y軸邊界

設置圖例 ax.legend()

圖例是對圖形所展示的內容的解釋服球,比如在一張圖中畫了三條線,那么這三條線都代表了什么呢颠焦?這時就需要做點注釋斩熊。

兩種方式設置圖例

# 第一種
# 繪圖的時候加上label,之后調用ax.legend()
ax.bar(ind - width/2, dog, width, label='Dog')
ax.bar(ind + width/2, cat, width, label='Cat')
ax.legend()

# 第二種
# 使用ax.legend()按順序設置好圖例
ax.bar(ind - width/2, dog, width)
ax.bar(ind + width/2, cat, width)
ax.legend(['Dog','Cat'])
圖例位置

loc參數用來規(guī)定圖例的位置

如:將圖例放在左上角:ax.legend(loc=2)

圖例各位置如下

  • 0: ‘best'
  • 1: ‘upper right'
  • 2: ‘upper left'
  • 3: ‘lower left'
  • 4: ‘lower right'
  • 5: ‘right'
  • 6: ‘center left'
  • 7: ‘center right'
  • 8: ‘lower center'
  • 9: ‘upper center'
  • 10: ‘center'

設置網格線 ax.grid()

網格線多用于輔助查看具體的數值大小,橫縱坐標都可以設置相應的網格線伐庭,視具體情況而論粉渠。

# b參數設置是否顯示網格
# linestyle:線型
# color:顏色
# linewidth:寬度
# axis:x,y圾另,both霸株,顯示x/y/兩者的格網。默認both
ax.grid(b = True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'y') 

設置背景顏色

設置整個圖像背景顏色

fig.set_facecolor('white')

設置某個子圖背景顏色

ax.set_facecolor('white')

保存圖像 fig.savefig

保存圖像的時候可以設置分辨率

fig.savefig('xxx.png',dpi=300)

交互展示 ax.show()

顯示最終繪制的圖像

ax.show()
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末集乔,一起剝皮案震驚了整個濱河市去件,隨后出現的幾起案子,更是在濱河造成了極大的恐慌饺著,老刑警劉巖箫攀,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異幼衰,居然都是意外死亡靴跛,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門渡嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梢睛,“玉大人,你說我怎么就攤上這事识椰【希” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵腹鹉,是天一觀的道長藏畅。 經常有香客問我,道長功咒,這世上最難降的妖魔是什么愉阎? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮力奋,結果婚禮上榜旦,老公的妹妹穿的比我還像新娘。我一直安慰自己景殷,他們只是感情好溅呢,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布澡屡。 她就那樣靜靜地躺著,像睡著了一般咐旧。 火紅的嫁衣襯著肌膚如雪驶鹉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天休偶,我揣著相機與錄音梁厉,去河邊找鬼。 笑死踏兜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的八秃。 我是一名探鬼主播碱妆,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昔驱!你這毒婦竟也來了疹尾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤骤肛,失蹤者是張志新(化名)和其女友劉穎纳本,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體腋颠,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡繁成,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了淑玫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巾腕。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡您机,死狀恐怖忠蝗,靈堂內的尸體忽然破棺而出种蝶,到底是詐尸還是另有隱情承绸,我是刑警寧澤屑彻,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布碘饼,位于F島的核電站默责,受9級特大地震影響何暇,放射性物質發(fā)生泄漏但壮。R本人自食惡果不足惜冀泻,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茵肃。 院中可真熱鬧腔长,春花似錦、人聲如沸验残。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸟召,卻和暖如春胆绊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欧募。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工压状, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跟继。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓种冬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舔糖。 傳聞我的和親對象是個殘疾皇子娱两,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

  • 一、概述 深度學習的一個重要手段是訓練數據和訓練過程的可視化金吗,因此十兢,我們關于深度學習的系列介紹文章就從Matplo...
    aoqingy閱讀 6,151評論 0 24
  • 本文搬運自博客Matplotlib可視化,建議直接訪問原博客以獲取最佳閱讀體驗 If you don't like...
    CapAllen閱讀 418評論 0 0
  • 簡介 Matplotlib可以說是Python最聲名遠揚的可視化庫了摇庙,也是Python數據分析庫的“三駕馬車”之一...
    放翁lcf閱讀 1,469評論 0 4
  • Python畫圖之總結待整理 https://morvanzhou.github.io/tutorials/dat...
    jiandanjinxin閱讀 17,309評論 1 14
  • 在數據分析中旱物,數據可視化非常重要。我們可以將數據繪制成各種圖形卫袒,比如直方圖宵呛,散點圖等,從圖形中可以明顯看出各種數據...
    Clemente閱讀 1,888評論 0 4