<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繪圖原理講解!

          共 3256字,需瀏覽 7分鐘

           ·

          2021-01-21 17:32

          前言

          大家好,我是早起,這篇文章沒有代碼,只做一件事:嘗試講明白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ī)制之前是不行的

          因為同一張圖,你可能在這篇帖子里面發(fā)現(xiàn)是用plt.xxxx實現(xiàn),另一個帖子里用ax.xxxx實現(xiàn),并且有時想修改一個參數(shù),你會百度得到很多種修改方法,但是沒有一個對你有用!因為你甚至都不了解它的工作機(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ū)域也能作圖?」

          因為matplotlib默認(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>」也就是盡可能的使用我們說的第二種方法去制作。

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

          本文僅從概念上,對plt.xxxx和ax.xxxx兩種繪圖方式進(jìn)行講解,至于xxxx是什么,請看可視化圖鑒后續(xù)文章!


          -END-


          文末早起聯(lián)合華章計算機(jī),為同樣熱愛Python,喜愛數(shù)據(jù)可視化的你精心挑選了多本Python數(shù)據(jù)分析可視化相關(guān)圖書贈送

          更多精彩圖書,可以點(diǎn)擊下方小程序查看與優(yōu)惠購買

          那么怎么送呢,一共贈送五本,可以任意挑選,長按掃描下方二維碼關(guān)注「可視化圖鑒」,回復(fù)送書即可參與,中獎概率超高~

          瀏覽 60
          點(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>
                    天天av成人在线 天天不射视频网站 | 天天日天天干天天撸 | 精品日韩人妻无码一区二区三区四区 | 欧洲精品码一区二区三区免费看 | 欧美操比在线视频 |