<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          人人都能看懂的Matplotlib繪圖原理

          共 3092字,需瀏覽 7分鐘

           ·

          2021-02-01 19:56

          ↑ 點(diǎn)擊藍(lán)字?關(guān)注極市平臺

          作者丨劉早起@知乎(已授權(quán))
          來源丨可視化圖鑒
          編輯丨極市平臺

          極市導(dǎo)讀

          ?

          本文從概念上,對plt.xxxx和ax.xxxx兩種繪圖方式進(jìn)行講解,詳細(xì)闡述兩種方式的特點(diǎn)以及不同之處。?>>加入極市CV技術(shù)交流群,走在計算機(jī)視覺的最前沿

          前言

          大家好,我是早起,這篇文章沒有代碼,只做一件事:嘗試講明白Matplotlib的工作機(jī)制,先說說我剛開始是怎樣學(xué)習(xí)Matplotlib的吧(可能也是你的)

          大概在幾年前,我還是一個Excel Boy,在學(xué)習(xí)了一段時間Python后,發(fā)現(xiàn)用Matplotlib居然也能制作精美的圖形,于是百度【Matplotlib怎么制作xx圖】,之后隨便點(diǎn)開一兩個網(wǎng)站,跳過大段文字部分,直接復(fù)制代碼粘貼運(yùn)行,成功得到圖片。OK!Matplotlib我會了!

          這樣學(xué)不行嗎?當(dāng)然行! 我在之前文章中也說過,不管你是怎么做的,能把圖整出來就行。但是這樣的學(xué)習(xí)方式,并不是非常適合Matplotlib,至少在搞明白它的繪圖機(jī)制之前是不行的

          因?yàn)橥粡垐D,你可能在這篇帖子里面發(fā)現(xiàn)是用plt.xxxx實(shí)現(xiàn),另一個帖子里用ax.xxxx實(shí)現(xiàn),并且有時想修改一個參數(shù),你會百度得到很多種修改方法,但是沒有一個對你有用!因?yàn)槟闵踔炼疾涣私馑墓ぷ鳈C(jī)制!

          那么接下來,讓我盡可能用通俗易懂的話去解決這個問題

          plt.xxxx到底是什么?

          讓我們從最熟悉、最常見的plt開始,相信你一定執(zhí)行過無數(shù)次下面的代碼

          import matplotlib.pyplot as plt
          然后就是直接用plt.xxx去搞各種圖表了,但是你有想過這個plt到底是什么? 我們把它打印出來看一下

          可以看到,plt只是一個module,我們根據(jù)上圖路徑找到對應(yīng)pyplot.py文件,可以看到,常用的繪圖函數(shù)都被封裝在里面

          所以plt它就是包含了一籃子函數(shù)的API,之所以這么搞,就是為了能像Matlab一樣在命令行繪圖,官方文檔中也是如此解釋

          因此我們直接在命令行執(zhí)行plt.bar([1,2,3],[4,5,6])直接就出來一幅圖了!

          但是等等!畫圖不應(yīng)該先搞一塊畫布/區(qū)域用于作圖嗎?在剛剛的代碼中我沒有告訴它在哪畫,也沒有指定坐標(biāo)軸刻度等信息,為什么直接就畫出來了?

          這就涉及到子圖和面向?qū)ο?/strong>的概念了,下面,讓初學(xué)者頭疼的axes該登場了

          ax.xxxx又是什么?

          為了搞明白plt.xxxxax.xxxx之間有什么差異,首先我們來研究下axes是什么!

          在大多數(shù)使用ax.xxxx繪圖的開頭都是這樣的代碼

          fig, ax = plt.subplots()

          和剛剛一樣,打印出來看下figax是什么

          和上一節(jié)不一樣的是,現(xiàn)在不再是一個接口(plt),而是通過plt接口創(chuàng)建了一個figure對象和一個axes對象!那么這兩個對象是什么呢,讓我們看一張官方的圖

          一目了然!

          最外層的是Figure,也就是畫布,這是Matplotlib中最高等級的對象不管繪制什么圖都是需要一個畫布!

          在畫布(Figure)里面的是Axes,大家可以理解為作圖的區(qū)域(在上圖中只有一個Axes), 接下來就可以通過ax.xxxx在Axes中進(jìn)行創(chuàng)作,當(dāng)然包括title、Axis、label等各種小組件,以及最重要的圖形!

          當(dāng)然創(chuàng)建兩個Axes也行,左邊是行,右邊是列,(2,1)表示兩行一列,兩個axes對象

          只不過這時,就是通過ax[0].xxxxax[1].xxxx分別去在不同的區(qū)域(Axes)進(jìn)行繪制,具體xxxx是什么不重要,無非是設(shè)置標(biāo)題、坐標(biāo)軸、數(shù)格式之類的,這些我們會在后續(xù)文章進(jìn)行更新。只需要知道,出現(xiàn)了ax.xxxx就是在指定區(qū)域繪制!

          plt和ax有什么區(qū)別?

          現(xiàn)在,我們來搞定最后的問題,plt和ax有什么區(qū)別?如何選擇?

          先回到第一節(jié)最后的問題

          「為什么plt沒有指定畫布和區(qū)域也能作圖?」

          因?yàn)閙atplotlib默認(rèn)在最近創(chuàng)建的畫布上繪制,而當(dāng)你沒有指定區(qū)域,告訴它去畫圖,他就會自動去生成一個Axes去繪制,進(jìn)一步?jīng)]有畫布,也會自動去創(chuàng)建一個Figure,也稱為隱式繪制

          這好嗎?看上去挺方便的哈,我們來看下面這種情況,創(chuàng)建一個畫布并有三個Axes

          我想在第二個axes上添加一個條形圖怎么辦?條形圖不就是plt.bar,整!

          很遺憾,之前說過plt默認(rèn)在最新的axes上作圖,所以只能畫在第三個axes上,就算你將plt.xxxx放在ax2 = axes[1]之后也是不行的!

          但如果使用ax.xxxx話就很方便了!我們只需要指定axes然后在想要的區(qū)域畫圖就行了!

          fig, axes = plt.subplots(1,3,figsize=(16,6))

          ax1 = axes[0]
          ax2 = axes[1]
          ax3 = axes[2]

          ax2.barh([1,2,3,4,5],[1,2,3,4,5])

          plt.show()

          那么一定要用plt呢,只能通過一個一個創(chuàng)建子圖,然后將plt.xxxx放在指定的位置

          注意觀察代碼片段中plt.xxxxax.xxxx的位置plt.xxxx必須跟在ax2后面才能將條形圖畫在第二個axes中,而ax1.xxxx則沒有限制!

          小結(jié)

          現(xiàn)在,可以讓我們總結(jié)一下。如果使用plt.xxxx進(jìn)行繪圖,代碼量會少一點(diǎn),簡單一點(diǎn),這也是為什么大多數(shù)教程都在使用這種方式。

          但是弊端也很明顯,制作單個圖形時,會自動幫你創(chuàng)建figure和axes。而在出現(xiàn)多個子圖時,使用plt操作起來就顯得有點(diǎn)蠢蠢的,所以這時應(yīng)該使用ax.xxxx進(jìn)行控制,但是一定要記住使用ax標(biāo)準(zhǔn)的流程

          1. 創(chuàng)建一個畫布(Figure)
          2. 創(chuàng)建一個或者多個Axes
          3. 使用ax.xxxx在指定Axes上繪圖

          那對于這兩種方法,官方怎么說

          上面是翻譯后的官方文檔,可以看到 「為了獲得更多控制,可以完全刪除pyplot級別,從而保留純面向?qū)ο蟮姆椒ā?/strong> 也就是盡可能的使用我們說的第二種方法去制作。

          我的看法是,其實(shí)這兩種方法雖然寫法不太一樣,但是大同小異,比如plt.title()就等于ax.set_title(),所以在掌握plt.xxxx和ax.xxxx背后原理之后在可以看懂不同風(fēng)格代碼每一句在干嘛后,在需要繪圖時,選擇一個最簡單的方法把圖做出來即可

          本文僅從概念上,對plt.xxxx和ax.xxxx兩種繪圖方式進(jìn)行講解,至于xxxx是什么,我會專門再寫一篇文章為大家整理常用的Matplotlib參數(shù)設(shè)置總結(jié)!


          推薦閱讀



          添加極市小助手微信(ID : cvmart2),備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳),即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群:月大咖直播分享、真實(shí)項(xiàng)目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~
          △長按添加極市小助手

          △長按關(guān)注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??
          瀏覽 42
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                    <th id="afajh"><progress id="afajh"></progress></th>
                    操逼片看看 | 无码人妻一区二区三区在线神菜美 | 操逼www. | 一道本无码在线看 | 亚洲婷婷丁香五月 |