<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>

          30行Python代碼實(shí)現(xiàn)3D數(shù)據(jù)可視化

          共 5578字,需瀏覽 12分鐘

           ·

          2020-10-09 20:44


          作者:潮汐

          來(lái)源:Python技術(shù)

          歡迎來(lái)到編程教室~

          我們之前的文章中有講解過(guò)不少 Matplotlib 的用法,比如:

          之前我們基本都是用它來(lái)繪制二維的數(shù)據(jù)圖表。而今天文章中,我們將教大家如何用不到 30 行代碼繪制 Matplotlib 3D 圖形。

          回顧 2D 作圖

          用賽貝爾曲線作 2d 圖。此圖是用基于 Matplotlib 的 Path 通過(guò)賽貝爾曲線實(shí)現(xiàn)的,有對(duì)賽貝爾曲線感興趣的朋友們可以深入了解一下。在 matplotlib 中,figure 為畫(huà)布,axes 為繪圖區(qū),fig.add_subplot()、plt.subplot() 方法均可以創(chuàng)建子圖。以下是作圖實(shí)踐。

          import?matplotlib.path?as?mpath
          import?matplotlib.patches?as?mpatches
          import?matplotlib.pyplot?as?plt

          fig,?ax?=?plt.subplots()
          #定義繪圖指令與控制點(diǎn)坐標(biāo)
          Path?=?mpath.Path
          #?Path?控制坐標(biāo)點(diǎn)繪制貝塞爾曲線
          #?圖形數(shù)據(jù)構(gòu)造

          #?MOVETO表示將繪制起點(diǎn)移動(dòng)到指定坐標(biāo)
          #?CURVE4表示使用4個(gè)控制點(diǎn)繪制3次貝塞爾曲線
          #?CURVE3表示使用3個(gè)控制點(diǎn)繪制2次貝塞爾曲線
          #?LINETO表示從當(dāng)前位置繪制直線到指定位置
          #?CLOSEPOLY表示從當(dāng)前位置繪制直線到指定位置,并閉合多邊形
          path_data?=?[
          ????(Path.MOVETO,?(1.88,?-2.57)),
          ????(Path.CURVE4,?(0.35,?-1.1)),
          ????(Path.CURVE4,?(-1.75,?1.5)),
          ????(Path.CURVE4,?(0.375,?2.0)),
          ????(Path.LINETO,?(0.85,?1.15)),
          ????(Path.CURVE4,?(2.2,?3.2)),
          ????(Path.CURVE4,?(3,?0.05)),
          ????(Path.CURVE4,?(2.0,?-1.5)),
          ????(Path.CLOSEPOLY,?(1.58,?-2.57)),
          ????]
          codes,verts?=?zip(*path_data)
          path?=?mpath.Path(verts,?codes)
          patch?=?mpatches.PathPatch(path,?facecolor='r',?alpha=0.5)
          ax.add_patch(patch)
          #?plot?control?points?and?connecting?lines
          x,?y?=?zip(*path.vertices)
          line,?=?ax.plot(x,?y,?'go-')
          ax.grid()
          ax.axis('equal')
          plt.show()
          心型效果圖

          3D 帽子圖1

          Matplotlib 繪制 3D 圖形使用的是 mplot3d Toolkit,即 mplot3d 工具包。繪制 3D 圖可以通過(guò)創(chuàng)建子圖,然后指定 projection 參數(shù) 為 3d 即可,返回的 ax 為 Axes3D 對(duì)象。

          導(dǎo)入包:

          from?matplotlib?import?cm
          from?matplotlib.ticker?import?LinearLocator,?FormatStrFormatter
          from?mpl_toolkits.mplot3d?import?Axes3D

          繪圖全過(guò)程:

          import?matplotlib.pyplot?as?plt
          from?matplotlib?import?cm
          from?matplotlib.ticker?import?LinearLocator,?FormatStrFormatter
          from?mpl_toolkits.mplot3d?import?Axes3D
          import?numpy?as?np

          fig?=?plt.figure()

          #?指定圖形類型是?3d?類型
          ax?=?fig.add_subplot(projection='3d')

          #?構(gòu)造數(shù)據(jù)
          X?=?np.arange(-5,?5,?0.25)
          Y?=?np.arange(-5,?5,?0.25)
          X,?Y?=?np.meshgrid(X,?Y)
          R?=?np.sqrt(X**2?+?Y**2)
          Z?=?np.sin(R)

          #?Plot?the?surface.
          surf?=?ax.plot_surface(X,?Y,?Z,?cmap=cm.coolwarm,
          ???????????????????????linewidth=0,?antialiased=False)
          #?Customize?the?z?axis.
          ax.set_zlim(-1.01,?1.01)
          ax.zaxis.set_major_locator(LinearLocator(10))
          ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
          #?Add?a?color?bar?which?maps?values?to?colors.
          fig.colorbar(surf,?shrink=0.5,?aspect=5)

          plt.show()

          呈現(xiàn)效果:

          帽子圖1

          3D 帽子圖2

          import?numpy?as?np
          import?matplotlib.pyplot?as?plt
          from?mpl_toolkits.mplot3d?import?Axes3D

          fig?=?plt.figure()
          #?指定圖形類型為?3d?類型
          ax?=?fig.add_subplot(111,?projection='3d')
          #?X,?Y?value
          X?=?np.arange(-5,?5,?0.25)
          Y?=?np.arange(-5,?5,?0.25)

          #?設(shè)置?x-y?平面的網(wǎng)格
          X,?Y?=?np.meshgrid(X,?Y)
          R?=?np.sqrt(X?**?2?+?Y?**?2)
          #?height?value
          Z?=?np.sin(R)

          #?rstride:行之間的跨度??cstride:列之間的跨度
          #?rcount:設(shè)置間隔個(gè)數(shù),默認(rèn)50個(gè),ccount:列的間隔個(gè)數(shù)??不能與上面兩個(gè)參數(shù)同時(shí)出現(xiàn)
          #vmax和vmin??顏色的最大值和最小值
          ax.plot_surface(X,?Y,?Z,?rstride=1,?cstride=1,?cmap=plt.get_cmap('rainbow'))

          #?zdir?:?'z'?|?'x'?|?'y'?表示把等高線圖投射到哪個(gè)面
          #?offset?:?表示等高線圖投射到指定頁(yè)面的某個(gè)刻度
          ax.contourf(X,Y,Z,zdir='z',offset=-2)

          #?設(shè)置圖像z軸的顯示范圍,x、y軸設(shè)置方式相同
          ax.set_zlim(-2,2)

          plt.show()
          帽子圖2

          3D 線性圖

          3D 線性圖使用 Axes3D.plot來(lái)繪制。繪畫(huà)的基本方法:Axes3D.plot(xs, ys[, zs, zdir='z', *args, **kwargs])

          參數(shù)說(shuō)明:

          參數(shù)描述
          xs一維數(shù)組,點(diǎn)的 x 軸坐標(biāo)
          ys一維數(shù)組,點(diǎn)的 y 軸坐標(biāo)
          zs一維數(shù)組,可選項(xiàng),點(diǎn)的 z 軸坐標(biāo)
          zdir可選項(xiàng),在 3D 軸上繪制 2D 數(shù)據(jù)時(shí),數(shù)據(jù)必須以 xs,ys 的形式傳遞,若此時(shí)將 zdir 設(shè)置為 ‘y’,數(shù)據(jù)將會(huì)被繪制到 x-z 軸平面上,默認(rèn)為 ‘z’
          **kwargs其他關(guān)鍵字參數(shù),可選項(xiàng),可參見(jiàn) matplotlib.axes.Axes.plot
          import?numpy?as?np
          import?matplotlib.pyplot?as?plt
          from?mpl_toolkits.mplot3d?import?Axes3D

          #?依次獲取畫(huà)布和繪圖區(qū)并創(chuàng)建?Axes3D?對(duì)象
          fig?=?plt.figure()
          ax?=?fig.gca(projection='3d')

          #?第一條3D線性圖數(shù)據(jù)
          theta?=?np.linspace(-4?*?np.pi,?4?*?np.pi,?100)
          z1?=?np.linspace(-2,?2,?100)
          r?=?z1**2?+?1
          x1?=?r?*?np.sin(theta)
          y1?=?r?*?np.cos(theta)

          #?第二條3D線性圖數(shù)據(jù)
          z2?=?np.linspace(-3,?3,?100)
          x2?=?np.sin(z2)
          y2?=?np.cos(z2)

          #?繪制3D線性圖
          ax.plot(x1,?y1,?z1,?color='b',?label='3D?Line1')
          ax.plot(x2,?y2,?z2,?color='r',?label='3D?Line2')

          #?設(shè)置標(biāo)題、軸標(biāo)簽、圖例,也可以直接使用?plt.title、plt.xlabel、plt.legend...
          ax.set_title('3D?Line?View',?pad=15,?fontsize='10')
          ax.set_xlabel('x?',?color='r',?fontsize='14')
          ax.set_ylabel('y?',?color='g',?fontsize='14')
          ax.set_zlabel('z?',?color='b',?fontsize='14')
          ax.legend()
          plt.show()

          結(jié)果顯示:

          線性圖

          3D 散點(diǎn)圖

          繪制 3D 散點(diǎn)圖的基本方法是:Axes3D.scatter(xs, ys[, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs])

          參數(shù)詳解:

          參數(shù)描述
          xs一維數(shù)組,點(diǎn)的 x 軸坐標(biāo)
          ys一維數(shù)組,點(diǎn)的 y 軸坐標(biāo)
          zs一維數(shù)組,可選項(xiàng),點(diǎn)的 z 軸坐標(biāo)
          zdir可選項(xiàng),在 3D 軸上繪制 2D 數(shù)據(jù)時(shí),數(shù)據(jù)必須以 xs,ys 的形式傳遞,若此時(shí)將 zdir 設(shè)置為 ‘y’,數(shù)據(jù)將會(huì)被繪制到 x-z 軸平面上,默認(rèn)為 ‘z’
          s標(biāo)量或數(shù)組類型,可選項(xiàng),標(biāo)記的大小,默認(rèn) 20
          c標(biāo)記的顏色,可選項(xiàng),可以是單個(gè)顏色或者一個(gè)顏色列表支持英文顏色名稱及其簡(jiǎn)寫(xiě)、十六進(jìn)制顏色碼等,更多顏色示例參見(jiàn)官網(wǎng) Color Demo
          depthshadebool 值,可選項(xiàng),默認(rèn) True,是否為散點(diǎn)標(biāo)記著色以提供深度外觀
          **kwargs其他關(guān)鍵字
          import?matplotlib.pyplot?as?plt
          import?numpy?as?np
          from?mpl_toolkits.mplot3d?import?Axes3D

          def?randrange(n,?vmin,?vmax):

          ????return?(vmax?-?vmin)?*?np.random.rand(n)?+?vmin

          fig?=?plt.figure()
          ax?=?fig.add_subplot(111,?projection='3d')

          n?=?100

          #?For?each?set?of?style?and?range?settings,?plot?n?random?points?in?the?box
          #?defined?by?x?in?[23,?32],?y?in?[0,?100],?z?in?[zlow,?zhigh].
          for?c,?m,?zlow,?zhigh?in?[('r',?'o',?-50,?-25),?('b',?'^',?-30,?-5)]:
          ????xs?=?randrange(n,?23,?32)
          ????ys?=?randrange(n,?0,?100)
          ????zs?=?randrange(n,?zlow,?zhigh)
          ????ax.scatter(xs,?ys,?zs,?c=c,?marker=m)

          ax.set_title('3D?Diagram?View',?pad=15,?fontsize='10')
          ax.set_xlabel('x?',?color='r',?fontsize='14')
          ax.set_ylabel('y?',?color='g',?fontsize='14')
          ax.set_zlabel('z?',?color='b',?fontsize='14')

          plt.show()

          結(jié)果顯示為:

          散點(diǎn)圖

          總結(jié)

          本文主要是介紹使用 Python 第三方庫(kù) Matplotlib 來(lái)繪制 3D 圖形,當(dāng)然除了上面演示的這幾種,還有更多豐富的圖形和功能等待你去挖掘。相比于 2D 圖形,3D 圖形可以多展現(xiàn)一個(gè)維度的數(shù)據(jù)特征,在可視化時(shí)會(huì)有更加直觀的效果。在實(shí)際的數(shù)據(jù)可視化過(guò)程中,我們要根據(jù)具體需求來(lái)決定用怎樣的形式來(lái)展現(xiàn),而多了解一些工具就可以更加游刃有余。這些強(qiáng)大的工具也正是 Python 在數(shù)據(jù)分析和可視化方面的一大優(yōu)勢(shì)之一。

          本文相關(guān)代碼下載地址:

          https://github.com/JustDoPython/python-examples/tree/master/chaoxi/Matplotlib_3D

          _往期文章推薦_

          150年前,他對(duì)拿破侖做數(shù)據(jù)可視化




          瀏覽 108
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  中文字幕h | 免费三级成人爱做片 | 欧洲三级片在线 | 色AV天堂 | 三级黄视频 |