MENU

Data Visualization with Matplotlib: 场问题的可视化

• September 25, 2019 • Read: 4382 • Knowledge,Python,Data Visualization

笛卡尔坐标系下的物理场可视化的描述-场的矢量图quiver及streamplot

对于数值结果的呈现,往往是了解物理场问题的一个重要途径,也是分析计算后的极为重要的一步。对于数据可视化的理解,个人觉得,最为重要的一点是“到底理解不理解什么是数值解?”。

在对绝大多数现实问题的求解过程中,尤其对于“物理场”问题而言,由于边界复杂度的影响,或者场函数定义域形状的复杂度影响,使得无法进行解析求解;由此数值方法成为了研究解决问题的唯一途径,数值方法的本质在于将原本的连续函数的值的描述,用离散点来替代,离散的程度符合实际问题的要求即可;从数据结果的保存方式来看,结果矩阵的就是存储着每一个离散点处的场函数值,通过云图、等值线图等都可以将结果进行良好的可视化。

物理场的两个重要方面

物理场本身通过物理规律进行数学上的描述,一般得到PDE,我们要进行求解,最终的解是一个函数,这个函数就是场函数,也称之为场的状态量;一般而言,多数物理问题,场函数是一个标量,而其梯度是一个向量,物理规律往往是依据梯度进行描述的;比如:渗流场中,水头就是一个标量,但是它的梯度可以直接描述水流速度,速度是一个矢量,这个由达西定律来描述;静电场问题中,电势就是一个标量,而电势梯度是一个矢量,表示电场强度;温度场的研究也有着如此的规律。所以对场问题结果的描述,一方面是对场函数(标量)自身值的大小的描述,另一方面,梯度矢量也是一个十分值得研究的量,因为往往梯度这类矢量,都是具有某种物理意义的矢量,它反映了场的一些特性,所以,场状态量的梯度的可视化也是一个重要方面。可视化必须,也应当包括:

  1. 场状态量的可视化描述
  2. 场状态量梯度的可视化描述

可视化工具的描述选择

场状态量的可视化手段

对场自身值的描述,一般通过云图来反映,值映射到颜色,形成的色彩图;等值线(云)图,这一可视化主要建立值的变化的认识,确定等值点的分布特性;当然还可以利用三维绘图来反映。所以,总结为如下:

  1. 色彩图,pcolormesh方法来构建色彩图,当然函数不唯一,imshow、matshow等亦可完成。
  2. 等值线,contour函数,contourf函数是带色彩的等值线图,通常两者结合一起完成可视化。
  3. 三维图,对于二元函数,其图像是一个空间中的曲面,因此,三维图可以描述

场状态量梯度的可视化手段

梯度是一个矢量,具有一定的物理意义,矢量的描述方向是一个十分重要的方面,表示着变化的方向。主要通过下述函数来描述:

  1. 矢量箭头图quiver:这一方法依据场中事先确定好的哥哥离散的点的位置,依据各点处的梯度值(笛卡尔坐标中就是x,y两个方向),给出这两个矢量和的方向,箭头的长度表示该矢量的模大小,而梯度(具体来说是矩阵的梯度)可以方便地由numpy中的gradient函数直接给出。
  2. 流线图streamplot:对于流线图的理解,可以理解为矢量箭头的连线,一般用于速度场的描述,即流线、电场线。

example

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 4 * np.pi, 50)
y = np.linspace(0, 4 * np.pi, 50)
xx, yy = np.meshgrid(x, y)
z = (np.sin(0.5 * xx) + np.cos(yy))
from mpl_toolkits.mplot3d import Axes3D
plt.style.use('ggplot')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
cb = ax.plot_surface(xx, yy, z, cmap='RdBu',rstride=2, cstride=2, alpha=0.5)
ax.contour(xx, yy, z, zdir='z', offset=-2, cmap='RdBu')
fig.colorbar(cb, ax=ax)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('The value of function z')
plt.show()

三维空间的函数图像

# 对于场状态量的描述,仅是对场函数值的描述
fig, ax = plt.subplots()
cb = ax.contourf(x, y, z, cmap='RdBu')
cs = ax.contour(x, y, z, colors='k')
ax.clabel(cs, inline=True)
fig.colorbar(cb, ax=ax)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('the contour image of function z')
plt.show()

等值线图

# 这是采用pcolormesh函数进行场函数值的描述,
# 对于值-颜色的映射,较为连续
fig, ax = plt.subplots(1, 1)
cb1 = ax.pcolormesh(xx, yy, z, cmap='viridis', shading='flat')
fig.colorbar(cb1, ax=ax)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('the color image of function z')
plt.show()

![色彩图pcolormesh

# 对于场状态量导数的可视化描述
# 场值的梯度:通常场函数为一个标量,
# 而其的导数必定为向量,在x,y方向上
# 一般称之为梯度。数值解一般为矩阵形式,
# 其都是采用求解区域中的采样点处的值来描述,
# 因此,函数值矩阵的梯度由各点的值来描述,
# 在笛卡尔坐标系下,因为都是矩阵区域,所以,
# 梯度可以直接用gradient来完成获取。
grad_x, grad_y = np.gradient(z)
# 研究梯度,一般用于描述场值变化的方向
# 可以用矢量图来进行可视化
fig, ax = plt.subplots()
# 由于原始采样点太密,因此,可以适当放宽采样间隔,以保证
# 矢量图的显示效果。
ax.quiver(xx[::4,::4], yy[::4,::4], grad_x[::4, ::4], grad_y[::4, ::4], color='tab:blue')
ax.scatter(xx[::4,::4], yy[::4,::4], s=10)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('the image of quiver')
label=['direction','the describe point']
ax.legend(label, loc='best', shadow='True')
plt.show()

矢量图

# 对于场的梯度的描述,矢量图一般提供了
# 各个点处两个方向的梯度的矢量和的方向信息。
# 当这种点如果足够的连续,那么就成为了“流线”
# 通俗来说,就是电场线、流体的流线等。
# streamplot能够给出这样的可视化结果
fig, ax = plt.subplots()
ax.streamplot(xx, yy, grad_x, grad_y, color='tab:orange')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('the gradient of the z value')

plt.show()

流线图

Last Modified: October 6, 2019
Archives Tip
QR Code for this page
Tipping QR Code