1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【Python基礎(chǔ)】使用Matplotlib可視化數(shù)據(jù)的5個強大技巧

        共 1736字,需瀏覽 4分鐘

         ·

        2020-10-25 11:19

        作者 | Rizky Maulana Nurhidayat?

        編譯 | VK?

        來源 | Towards Datas Science

        【導讀】數(shù)據(jù)可視化用于以更直接的表示方式顯示數(shù)據(jù),并且更易于理解。它可以用柱狀圖、散點圖、折線圖、餅圖等形式形成。許多人仍然使用Matplotlib作為后端模塊來可視化他們的圖形。在這個故事中,我將給你一些技巧,使用Matplotlib創(chuàng)建一個優(yōu)秀圖表的5個強大技巧。

        1. 使用Latex字體

        默認情況下,我們可以使用Matplotlib提供的一些不錯的字體。但是,有些符號不夠好,不能由Matplotlib創(chuàng)建。例如,符號phi(φ),如圖1所示。

        正如你在y-label中看到的,它仍然是phi(φ)的符號,但是對于某些人來說,它還不足以作為繪圖標簽。為了使它更漂亮,你可以使用Latex字體。如何使用它?答案就在這里。

        plt.rcParams['text.usetex']?=?True
        plt.rcParams['font.size']?=?18

        你可以在python代碼的開頭添加上面的代碼。第1行定義繪圖中使用的LaTeX字體。你還需要定義大于默認大小的字體大小。如果你不換,我想它會給你一個小標簽。我選了18。應用上述代碼后的結(jié)果如圖2所示。

        你需要在符號的開頭和結(jié)尾寫上雙美元符號,像這樣(

        plt.xlabel('x')
        plt.ylabel('$\phi$?(phi)')

        如果你有一些錯誤或沒有安裝使用LaTeX字體所需的庫,則需要通過在Jupyter notebook中運行以下代碼來安裝這些庫。

        !apt?install?texlive-fonts-recommended?texlive-fonts-extra?cm-super?dvipng

        如果你想通過終端安裝,可以輸入

        apt?install?texlive-fonts-recommended?texlive-fonts-extra?cm-super?dvipng

        當然,你可以使用一些不同的字體系列,如serif、sans-serif(上面的示例)等。要更改字體系列,可以使用以下代碼。

        plt.rcParams['font.family']?=?"serif"

        如果你將上面的代碼添加到代碼中,它將給你一個圖,如圖3所示。

        你能理解圖3和圖2之間的區(qū)別嗎?是的,如果你仔細分析,區(qū)別在于字體的尾部。后一個圖形使用serif,而前者使用sans-serif。簡而言之,serif表示尾,sans表示沒有。如果你想了解更多有關(guān)字體系列或字體的信息,我建議你使用此鏈接。

        https://en.wikipedia.org/wiki/Typeface

        你還可以使用Jupyter themes庫設置字體系列/字體。我已經(jīng)做了使用它的教程。只需單擊以下鏈接。Jupyter主題也可以改變你的Jupyter主題,例如暗模式主題:https://medium.com/@rizman18/how-can-i-customize-jupyter-notebook-into-dark-mode-7985ce780f38

        我們希望插入復雜文本,如圖4的標題所示。

        如果你想創(chuàng)建圖4,可以使用這個完整的代碼

        #?導入庫
        import?numpy?as?np
        import?matplotlib.pyplot?as?plt

        #?調(diào)整matplotlib參數(shù)
        plt.rcParams.update(plt.rcParamsDefault)
        plt.rcParams['text.usetex']?=?True
        plt.rcParams['font.size']?=?18
        plt.rcParams['font.family']?=?"serif"

        #?創(chuàng)建模擬數(shù)據(jù)
        r?=?15
        theta?=?5
        rw?=?12
        gamma?=?0.1

        err?=?np.arange(0.,?r,?.1)
        z?=?np.where(err?0,?gamma?*?(err-rw)**2?*?np.sin(np.deg2rad(theta)))
        ????
        #?可視化數(shù)據(jù)
        plt.scatter(err,?z,?s?=?10)
        plt.title(r'$\Sigma(x)?=?\gamma?x^2?\sin(\theta)$',?pad?=?20)
        plt.xlabel('x')
        plt.ylabel('$\phi$')

        #?保存圖表
        plt.savefig('latex.png',?dpi?=?300,?pad_inches?=?.1,?bbox_inches?=?'tight')

        2.創(chuàng)建縮放效果

        在這個技巧中,我將給你一個生成繪圖的代碼,如圖5所示。

        首先,你需要了解「plt.axes」()和「plt.figure()」 你可以在下面的鏈接中查看它。代碼「plt.figure()」 覆蓋單個容器中的所有對象,包括軸、圖形、文本和標簽。代碼「plt.axes」()只包含特定的部分。我想,圖6可以給你一個簡單的理解。

        黑盒子使用「plt.figure()」,紅色和藍色的盒子使用「plt.axes()」. 在圖6中,有兩個軸,紅色和藍色。你可以查看此鏈接以獲取基本參考:https://medium.com/datadriveninvestor/python-data-visualization-with-matplotlib-for-absolute-beginner-python-part-ii-65818b4d96ce

        理解之后,你可以分析如何創(chuàng)建圖5。是的,簡單地說,圖5中有兩個軸。第一個軸是一個大的繪圖,放大版本從580到650,第二個是縮小版本。下面是創(chuàng)建圖5的代碼。

        #?創(chuàng)建主容器
        fig?=?plt.figure()

        #?設置隨機種子
        np.random.seed(100)

        #?創(chuàng)建模擬數(shù)據(jù)
        x?=?np.random.normal(400,?50,?10_000)
        y?=?np.random.normal(300,?50,?10_000)
        c?=?np.random.rand(10_000)

        #?創(chuàng)建放大圖
        ax?=?plt.scatter(x,?y,?s?=?5,?c?=?c)
        plt.xlim(400,?500)
        plt.ylim(350,?400)
        plt.xlabel('x',?labelpad?=?15)
        plt.ylabel('y',?labelpad?=?15)

        #?創(chuàng)建放大圖
        ax_new?=?fig.add_axes([0.6,?0.6,?0.2,?0.2])?#?放大圖的位置與放大圖的比例比較
        plt.scatter(x,?y,?s?=?1,?c?=?c)

        #?保存圖形,留好邊距
        plt.savefig('zoom.png',?dpi?=?300,?bbox_inches?=?'tight',?pad_inches?=?.1)

        如果你需要代碼的解釋,可以訪問此鏈接:https://medium.com/datadriveninvestor/data-visualization-with-matplotlib-for-absolute-beginner-part-i-655275855ec8

        我還提供了另一個版本的縮放效果,你可以使用Matplotlib。如圖7所示。

        要創(chuàng)建圖7,你需要在Matplotlib中使用add_subblot或其他語法(subblot)創(chuàng)建三個軸。為了更容易使用,我在這里加上。要創(chuàng)建它們,可以使用以下代碼。

        fig?=?plt.figure(figsize=(6,?5))
        plt.subplots_adjust(bottom?=?0.,?left?=?0,?top?=?1.,?right?=?1)

        #?創(chuàng)建第一個軸,左上角的圖用綠色的圖
        sub1?=?fig.add_subplot(2,2,1)?#?兩行兩列,第一單元格

        #?創(chuàng)建第二個軸,即左上角的橙色軸
        sub2?=?fig.add_subplot(2,2,2)?#?兩行兩列,第二個單元格

        #?創(chuàng)建第三個軸,第三和第四個單元格的組合
        sub3?=?fig.add_subplot(2,2,(3,4))?#?兩行兩列,合并第三和第四單元格

        代碼將生成一個圖,如圖8所示。它告訴我們它將生成2行2列。軸sub1(2,2,1)是子圖(第一行,第一列)中的第一個軸。順序從左上側(cè)到右開始。軸sub2(2,2,2)被放置在第一行第二列中。軸sub3(2,2,(3,4)),是第二行第一列和第二行第二列之間的合并軸。

        當然,我們需要定義一個模擬數(shù)據(jù),以便在繪圖中可視化。在這里,我定義了線性函數(shù)和正弦函數(shù)的簡單組合,如下面的代碼所示。

        #?使用lambda定義函數(shù)
        stock?=?lambda?A,?amp,?angle,?phase:?A?*?angle?+?amp?*?np.sin(angle?+?phase)

        #?定義參數(shù)
        theta?=?np.linspace(0.,?2?*?np.pi,?250)?#?x軸
        np.random.seed(100)
        noise?=?0.2?*?np.random.random(250)
        y?=?stock(.1,?.2,?theta,?1.2)?+?noise?#?y軸

        如果你將代碼應用到前面的代碼中,你將得到一個圖,如圖9所示。

        下一步是限制第一個和第二個軸(sub1和sub2)的x軸和y軸,為sub3中的兩個軸創(chuàng)建阻塞區(qū)域,并創(chuàng)建代表縮放效果的ConnectionPatch??梢允褂靡韵峦暾拇a來完成(記住,為了簡單起見,我沒有使用循環(huán))。

        #?使用lambda定義函數(shù)
        stock?=?lambda?A,?amp,?angle,?phase:?A?*?angle?+?amp?*?np.sin(angle?+?phase)

        #?定義參數(shù)
        theta?=?np.linspace(0.,?2?*?np.pi,?250)?#?x軸
        np.random.seed(100)
        noise?=?0.2?*?np.random.random(250)
        y?=?stock(.1,?.2,?theta,?1.2)?+?noise?#?y軸

        #?創(chuàng)建大小為6x5的主容器
        fig?=?plt.figure(figsize=(6,?5))
        plt.subplots_adjust(bottom?=?0.,?left?=?0,?top?=?1.,?right?=?1)

        #?創(chuàng)建第一個軸,左上角的圖用綠色的圖
        sub1?=?fig.add_subplot(2,2,1)?#?兩行兩列,第一單元格
        sub1.plot(theta,?y,?color?=?'green')
        sub1.set_xlim(1,?2)
        sub1.set_ylim(0.2,?.5)
        sub1.set_ylabel('y',?labelpad?=?15)

        #?創(chuàng)建第二個軸,即左上角的橙色軸
        sub2?=?fig.add_subplot(2,2,2)?#?兩行兩列,第二個單元格
        sub2.plot(theta,?y,?color?=?'orange')
        sub2.set_xlim(5,?6)
        sub2.set_ylim(.4,?1)

        #?創(chuàng)建第三個軸,第三和第四個單元格的組合
        sub3?=?fig.add_subplot(2,2,(3,4))?#?兩行兩列,合并第三和第四單元格
        sub3.plot(theta,?y,?color?=?'darkorchid',?alpha?=?.7)
        sub3.set_xlim(0,?6.5)
        sub3.set_ylim(0,?1)
        sub3.set_xlabel(r'$\theta$?(rad)',?labelpad?=?15)
        sub3.set_ylabel('y',?labelpad?=?15)

        #?在第三個軸中創(chuàng)建阻塞區(qū)域
        sub3.fill_between((1,2),?0,?1,?facecolor='green',?alpha=0.2)?#?第一個軸的阻塞區(qū)域
        sub3.fill_between((5,6),?0,?1,?facecolor='orange',?alpha=0.2)?#?第二軸的阻塞區(qū)域

        #?在左側(cè)創(chuàng)建第一個軸的ConnectionPatch
        con1?=?ConnectionPatch(xyA=(1,?.2),?coordsA=sub1.transData,?
        ???????????????????????xyB=(1,?.3),?coordsB=sub3.transData,?color?=?'green')
        #?添加到左側(cè)
        fig.add_artist(con1)

        #?在右側(cè)創(chuàng)建第一個軸的ConnectionPatch
        con2?=?ConnectionPatch(xyA=(2,?.2),?coordsA=sub1.transData,?
        ???????????????????????xyB=(2,?.3),?coordsB=sub3.transData,?color?=?'green')
        #?添加到右側(cè)
        fig.add_artist(con2)

        #?在左側(cè)創(chuàng)建第二個軸的ConnectionPatch
        con3?=?ConnectionPatch(xyA=(5,?.4),?coordsA=sub2.transData,?
        ???????????????????????xyB=(5,?.5),?coordsB=sub3.transData,?color?=?'orange')
        #?添加到左側(cè)
        fig.add_artist(con3)

        #?在右側(cè)創(chuàng)建第二個軸的ConnectionPatch
        con4?=?ConnectionPatch(xyA=(6,?.4),?coordsA=sub2.transData,?
        ???????????????????????xyB=(6,?.9),?coordsB=sub3.transData,?color?=?'orange')
        #?添加到右側(cè)
        fig.add_artist(con4)

        #?保存圖形,留好邊距
        plt.savefig('zoom_effect_2.png',?dpi?=?300,?bbox_inches?=?'tight',?pad_inches?=?.1)

        代碼將為你提供一個出色的縮放效果圖,如圖7所示。

        3.創(chuàng)建圖例

        你的圖中是否有許多圖例要顯示?如果是,則需要將它們放置在主軸之外。

        要將圖例放置在主容器之外,需要使用此代碼調(diào)整位置

        plt.legend(bbox_to_anchor=(1.05,?1.04))?#?圖例的位置

        值1.05和1.04位于朝向主容器的x和y軸坐標中。你可以改變它?,F(xiàn)在,把上面的代碼應用到我們的代碼中,

        #?使用lambda創(chuàng)建wave函數(shù)
        wave?=?lambda?amp,?angle,?phase:?amp?*?np.sin(angle?+?phase)

        #?設置參數(shù)值
        theta?=?np.linspace(0.,?2?*?np.pi,?100)
        amp?=?np.linspace(0,?.5,?5)
        phase?=?np.linspace(0,?.5,?5)

        #?創(chuàng)建主容器及其標題
        plt.figure()
        plt.title(r'Wave?Function?$y?=?\gamma?\sin(\theta?+?\phi_0)?$',?pad?=?15)

        #?為每個放大器和階段創(chuàng)建繪圖
        for?i?in?range(len(amp)):
        ????lgd1?=?str(amp[i])
        ????lgd2?=?str(phase[i])
        ????plt.plot(theta,?wave(amp[i],?theta,?phase[i]),?label?=?(r'$\gamma?=?$'+lgd1+',?$\phi?=?$'?+lgd2))
        ????
        plt.xlabel(r'$\theta$?(rad)',?labelpad?=?15)
        plt.ylabel('y',?labelpad?=?15)

        #?調(diào)整圖例
        plt.legend(bbox_to_anchor=(1.05,?1.04))

        #?保存圖形,留好邊距
        plt.savefig('outbox_legend.png',?dpi?=?300,?bbox_inches?=?'tight',?pad_inches?=?.1)

        運行代碼后,它將給出一個圖,如圖11所示。

        如果要使圖例框更漂亮,可以使用以下代碼添加陰影效果。它將顯示一個圖,如圖12所示。

        plt.legend(bbox_to_anchor=(1.05,?1.04),?shadow=True)

        4.創(chuàng)建連續(xù)誤差圖

        在過去的十年里,數(shù)據(jù)可視化的風格被轉(zhuǎn)移到一個干凈的繪圖主題上。通過閱讀國際期刊或網(wǎng)頁上的一些新論文,我們可以看到這種轉(zhuǎn)變。最流行的方法之一是用連續(xù)的誤差可視化數(shù)據(jù),而不是使用誤差條。你可以在圖13中看到它。

        圖13是通過使用「fill_between」生成的。在fill_between語法中,你需要定義上限和下限,如圖14所示。

        要應用它,可以使用以下代碼。

        plt.fill_between(x,?upper_limit,?lower_limit)

        參數(shù)上限和下限可以互換。這是完整的代碼。

        N?=?9
        x?=?np.linspace(0,?6*np.pi,?N)

        mean_stock?=?(stock(.1,?.2,?x,?1.2))
        np.random.seed(100)
        upper_stock?=?mean_stock?+?np.random.randint(N)?*?0.02
        lower_stock?=?mean_stock?-?np.random.randint(N)?*?0.015

        plt.plot(x,?mean_stock,?color?=?'darkorchid',?label?=?r'$y?=?\gamma?\sin(\theta?+?\phi_0)$')

        plt.fill_between(x,?upper_stock,?lower_stock,?alpha?=?.1,?color?=?'darkorchid')
        plt.grid(alpha?=?.2)

        plt.xlabel(r'$\theta$?(rad)',?labelpad?=?15)
        plt.ylabel('y',?labelpad?=?15)
        plt.legend()
        plt.savefig('fill_between.png',?dpi?=?300,?bbox_inches?=?'tight',?pad_inches?=?.1)

        5.調(diào)整邊距

        如果你分析上面的每一行代碼,**plt.savefig()**后面會是一個復雜的參數(shù):bbox_inches和pad_inches。當你在撰寫一篇期刊或文章時,它們會為你提供邊距。如果不包括它們,則保存后,繪圖的邊距將更大。圖15展示了有bbox_inches和pad_inches以及沒有它們的不同繪圖。

        我想你看不出圖15中兩個圖之間的區(qū)別。我將嘗試用不同的背景色來顯示它,如圖16所示。

        同樣,當你在一篇論文或一篇文章中插入你的圖表時,這個技巧會幫助你。你不需要裁剪它來節(jié)省空間。

        結(jié)論

        Matplotlib是一個多平臺庫,可以在許多操作系統(tǒng)使用。它是將數(shù)據(jù)可視化的老庫之一,但它仍然很強大。因為開發(fā)人員總是根據(jù)數(shù)據(jù)可視化的趨勢進行一些更新。上面提到的一些技巧就是更新的例子。

        原文鏈接:https://towardsdatascience.com/5-powerful-tricks-to-visualize-your-data-with-matplotlib-16bc33747e05


        往期精彩回顧





        獲取一折本站知識星球優(yōu)惠券,復制鏈接直接打開:

        https://t.zsxq.com/y7uvZF6

        本站qq群704220115。

        加入微信群請掃碼:

        瀏覽 40
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            逼特逼视频m3m8 | 女人18毛片aa**水真多 | 久操视频新免费 | 爱爱网址 | 24日本视频在线精品 | 干比视频 | 啪啪视频免费网站 | 又粗又大又爽在线观看 | 97资源站人妻 | 日韩黄色大片 |