Matplotlib更多实用图形的绘制

简介: 我们已经学习了一系列统计图来描绘两个变量间的基本关系,但是,仅仅使用这些图形并不足以应对所有场景。例如,需要显示降雨在各个地区的分布情况。因此,我们需要更多的实用图形来表达现实世界的复杂关系。

前言

我们已经学习了一系列统计图来描绘两个变量间的基本关系,同时也学习了如何高度自定义统计的呈现样式,但是,仅仅使用这些图形并不足以应对所有场景。例如,我们需要可视化地显示降雨在各个地区的分布情况。 因此,我们需要更多的实用图形来表达现实世界的复杂关系。

可视化二维数组的内容

让我们从最简单的场景开始,假设我们有一个二维数组——著名的分形形状 Mandelbrot,我们想将其可视化。  

首先需要创建一个二维数组,然后调用 plt.imshow() 将其可视化。

importnumpyasnpimportmatplotlib.cmascmfrommatplotlibimportpyplotaspltdefiter_count(c, max_iter):
x=cforninrange(max_iter):
ifabs(x) >2.:
returnnx=x**2+creturnmax_itern=512max_iter=64xmin, xmax, ymin, ymax=-2.2, .8, -1.5, 1.5x=np.linspace(xmin, xmax, n)
y=np.linspace(ymin, ymax, n)
z=np.empty((n, n))
fori, y_iinenumerate(y):
forj, x_jinenumerate(x):
z[i, j] =iter_count(complex(x_j, y_i), max_iter)
plt.imshow(z, cmap=cm.Spectral)

绘图99.png

Tips:imshow() 接受一个 2D 数组作为参数置,用于渲染图片,其中每个像素代表一个从 2D 数组中提取的值。像素的颜色从 colormap 中选取。2D 数组中的数据也可以是自文件或其他源,例如我们完全可以将读取的图片绘制在图形中。

# 读取图片img=plt.imread('img.png')
# 绘制图片plt.imshow(img)

绘图100.png

我们也可以使用不同的颜色映射观察效果,只需要修改 plt.imshow() 可选参数 cmap 的值即可.

plt.imshow(z, cmap=cm.binary, extent=(xmin, xmax, ymin, ymax))

绘图101.png

Tips:plt.imshow() 的可选参数 extent 指定存储在二维数组中的数据的坐标系——由四个值组成的元组,分别表示水平轴和垂直轴上的最小、最大范围。

接下来,将数组的尺寸由从 512x512 减少到 32x32,看看效果如何:

n=64

绘图102.png

Tips:使用 32x32 的数组表示 Mandelbrot 集时,得到的图片的尺寸并没有缩小,但和 512x512 数组产生的图片仍有明显差别。这是由于,生成一张给定大小的图片,如果输入的数据小于或大于该图片尺寸,plt.imshow() 将执行插值操作。默认的插值是线性插值,可以看出效果并不总是理想的。可以通过 imshow() 函数的可选参数 interpolation 指定要使用的插值类型。

使用双三次插值算法(interpolation = 'bicubic')查看效果:

绘图103.png

二维标量场的可视化

可以使用 numpy.meshgrid() 函数从 2D 函数中生成样本。然后,使用 plt.pcolormesh() 显示此函数图形:

n=256x=np.linspace(-3., 3., n)
y=np.linspace(-3., 3., n)
x_list, y_list=np.meshgrid(x, y)
z_list=x_list*np.cos(x_list**2+y_list**2)
plt.pcolormesh(x_list, y_list, z_list, cmap=cm.Spectral)
cb=plt.colorbar(orientation='horizontal', shrink=.75)

绘图104.png

Tips:使用颜色映射可以帮助我们快速判断相应点的符号和大小。

np.meshgrid() 函数的作用是:获取两个坐标列表,并构建坐标网格。因为两个坐标列表都是 numpy 数组,所以我们可以以处理单个变量的方式处理它们,这使得计算标量场的过程简洁易读。最后,调用函数 plt.pcolormesh() 呈现图片。

等高线的可视化

等高线将具有相同值的所有点连接起来,可以更容易看到数据的分布特征。

defiter_count(c, max_iter):
x=cforninrange(max_iter):
ifabs(x) >2.:
returnnx=x**2+0.98*creturnmax_itern=512max_iter=80xmin, xmax, ymin, ymax=-0.32, -0.22, 0.8, 0.9x=np.linspace(xmin, xmax, n)
y=np.linspace(ymin, ymax, n)
z=np.empty((n, n))
fori, y_iinenumerate(y):
forj, x_jinenumerate(x):
z[j, i] =iter_count(complex(x_j, y_i), max_iter)
plt.imshow(z, cmap=cm.Spectral,  
interpolation='bicubic',
origin='lower',
extent=(xmin, xmax, ymin, ymax))
levels= [8, 12, 16, 20]
ct=plt.contour(x, y, z, levels, cmap=cm.binary)
plt.clabel(ct, fmt='%d')

绘图105.png

Tips:pyplot.contour() 函数获取样本网格的坐标列表 x 和 y 以及存储在矩阵 z 中的值。然后,该函数将渲染在 "level" 列表中指定的值相对应的轮廓,可以使用可选参数 cmap 运用色彩映射进行着色,也可以使用可选参数 color  为所有轮廓指定一种唯一的颜色。

每个轮廓可以用颜色条显示,也可以直接在图形上显示。plt.contour() 函数返回一个 Contour 实例。pyplot.clabel() 函数获取 contour 实例和一个可选的格式字符串来呈现每个等高线的标签。

Tips:默认情况下,填充轮廓不具抗锯齿性。可以使用了可选参数 antialiased 来获得更令人满意的结果。

ct=plt.contour(x, y, z, levels, cmap=cm.binary, antialiased=True)

绘图106.png

二维向量场的可视化

向量场将二维向量与二维平面的每个点相关联,在物理学中很常见。

本例中,为了进行符号计算,我们借助 SymPy 包,这个软件包只用于保持代码的简短。如果未安装此包,可以使用 pip install sympy 命令进行安装。

我们不必关系向量场的计算方法,记住,本文的主要目的是可视化,因此我们只需要关心如何显示向量场——使用 pyplot.quiver() 函数。

importsympyfromsympy.abcimportx, ydefcylinder_stream_function(u=1, r=1):
radius=sympy.sqrt(x**2+y**2)
theta=sympy.atan2(y, x)
returnu* (radius-r**2/r) *sympy.sin(theta)
defvelocity_field(psi):
u=sympy.lambdify((x, y), psi.diff(y), 'numpy')
v=sympy.lambdify((x, y), -psi.diff(x), 'numpy')
returnu, vu_func, v_func=velocity_field(cylinder_stream_function() )
xmin, xmax, ymin, ymax=-2.5, 2.5, -2.5, 2.5y, x=np.ogrid[ymin:ymax:16j, xmin:xmax:16j]
u, v=u_func(x, y), v_func(x, y)
m= (x**2+y**2) <1.u=np.ma.masked_array(u, mask=m)
v=np.ma.masked_array(v, mask=m)
shape=patches.Circle((0, 0), radius=1., lw=2., fc='w', ec='c', zorder=0)
plt.gca().add_patch(shape)
plt.quiver(x, y, u, v, color='c', zorder=1)
plt.axes().set_aspect('equal')

绘图107.png

Tips:向量场存储在矩阵 u 和 v 中,我们从向量场中采样的每个向量的坐标;矩阵 x 和 y 表示样本位置。矩阵 x、y、u 和 v 被传递给 pyplot.quiver(),即可呈现向量场。

相关文章
|
4月前
|
存储 编解码 数据可视化
【Matplotlib】figure方法之图形的保存
【Matplotlib】figure方法之图形的保存
139 1
|
4月前
|
数据可视化 Python
GEE Colab——如何利用Matplotlib在colab中进行图形制作
GEE Colab——如何利用Matplotlib在colab中进行图形制作
97 3
|
2月前
|
数据可视化 Linux 数据格式
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
|
2月前
|
Python
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
|
2月前
|
数据采集 数据可视化 数据处理
我们来看一个简单的`matplotlib`代码示例,它使用`plot()`和`scatter()`函数来绘制二维图形。
我们来看一个简单的`matplotlib`代码示例,它使用`plot()`和`scatter()`函数来绘制二维图形。
|
4月前
|
存储 数据可视化 算法
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
|
4月前
|
缓存 Linux API
如何使用Matplotlib绘制出美观实用的图形?
如何使用Matplotlib绘制出美观实用的图形?
|
4月前
|
编解码 数据可视化 索引
【Matplotlib】Figure图形中的图表元素怎么获取,你掌握了吗!?
【Matplotlib】Figure图形中的图表元素怎么获取,你掌握了吗!?
53 1
|
4月前
|
Python
Matplotlib figure图形对象
Matplotlib figure图形对象
67 1
|
数据可视化 前端开发 UED
matplotlib图形整合之多个子图一起绘制
matplotlib图形整合之多个子图一起绘制
657 0
matplotlib图形整合之多个子图一起绘制