Python进阶之Matplotlib入门(八)
- 2019 年 11 月 28 日
- 筆記
引言
Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。
学完这课你将会:
1、掌握Matplotlib中的3D画图功能;
2、学会使用text函数玩出手稿效果;
3D图
为了画3D图,我们除了导入maplotlib.pyplot模块,我们还需要导入一个叫做mpl_toolkits的模块:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
然后我们需要用figure()函数定义一个窗口,给它装备好一个3D坐标:
fig = plt.figure() ax = Axes3D(fig)
可以获得如下效果图:

这个是3D坐标轴,可以通过鼠标旋转观察到不同的角度,大家把代码输入进去亲自感受,手感非常好。
现在我们要输入数据了,因为是一个3D的图,所以我们要X,Y,Z三个维度的坐标。我们先通过meshgrid函数建立一个二维平面网格,然后直接用函数映射的方法或者Z轴坐标。
一切就绪后,就可以plot_surface的方式把3D曲面图给画出来:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) X = np.arange(-4, 4, 0.25) Y = np.arange(-4, 4, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) ax.plot_surface(X, Y, Z, rstride=6, cstride=6, cmap='hot') plt.show()
运行结果:

在这个函数中,首先输入的是X,Y,Z三个维度,没毛病。然后是rstride以及cstride,它们分别控制row和column的密度。这里的密度可以理解为用多少条线来画3D的图,比如我们将rstride和cstride设置成6,看一下效果:

瞬间拉跨,不好看。
手稿图
前面在介绍如何给图片添加文字的时候,引入了text函数。现在我们要利用这个函数,玩一个花样出来:

代码如下:
import numpy as np import matplotlib.pyplot as plt eqs = [] eqs.append((r"$W^{3beta}_{delta_1 rho_1 sigma_2} = U^{3beta}_{delta_1 rho_1} + frac{1}{8 pi 2} int^{alpha_2}_{alpha_2} d alpha^prime_2 left[frac{ U^{2beta}_{delta_1 rho_1} - alpha^prime_2U^{1beta}_{rho_1 sigma_2} }{U^{0beta}_{rho_1 sigma_2}}right]$")) eqs.append((r"$frac{drho}{d t} + rho vec{v}cdotnablavec{v} = -nabla p + munabla^2 vec{v} + rho vec{g}$")) eqs.append((r"$int_{-infty}^infty e^{-x^2}dx=sqrt{pi}$")) eqs.append((r"$E = mc^2 = sqrt{{m_0}^2c^4 + p^2c^2}$")) eqs.append((r"$F_G = Gfrac{m_1m_2}{r^2}$")) plt.axes([0.025,0.025,0.95,0.95]) for i in range(24): index = np.random.randint(0,len(eqs)) eq = eqs[index] size = np.random.uniform(12,32) x,y = np.random.uniform(0,1,2) alpha = np.random.uniform(0.25,.75) plt.text(x, y, eq, ha='center', va='center', color="#11557c", alpha=alpha, transform=plt.gca().transAxes, fontsize=size, clip_on=True) plt.xticks([]), plt.yticks([]) # savefig('../figures/text_ex.png',dpi=48) plt.show()
我们一共写了五个公式,但是图上“这么多”公式的效果是怎么来的呢?关键点就在于“随机”,有位置的随机,有大小的随机,还有透明度的随机。综合效果出来就感觉有很多不同的公式一样。