利用python绘制二三维曲面和矢量流线图

2023-11-12

       为了实现不同数据的可视化,最近研究了python环境下的可视化方案,为后续的流体运动仿真模拟做好储备,由于python处理数据的便利性,导致目前很多后端处理或者可视化成图操作都在python中实现,比如前端是vue,加上简单的交互操作,后端搭建webserver,可采用java或者python来搭建,并利用python在后端处理数据,形成可视化图件等;本文主要在python3.10环境下,利用 matplotlib.pyplot、scipy.interpolate、numpy、pandas实现数据的处理,网格数据的生成,各自平面图和三维图形的绘制,并加入自定义颜色栏。在绘图开始之前,需要准备数据,一般包括读取和准备数据,以及简单的数据处理过滤等,后续会在此基础上进行绘图操作或继续进行数据处理及可视化等。

准备数据阶段

# 准备数据 读取数据
# 0.读写实际数据生成三维曲面,数据格式为x y z
filename=r'D:\project\PythonProject\ECL\data\geochemical-data\2018_T28.txt'
dataTop = pd.read_csv(filename, sep='\t', header=None, names=['x', 'y', 'z'])
# 去掉无效数据,一般为-99999.0000
data = dataTop[dataTop['z'] != -99999.0000]
x = data.iloc[:, 0]
y = data.iloc[:, 1]
z = data.iloc[:, 2]*(-1) #深度值是负数,要取反。
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
xi, yi = np.meshgrid(xi, yi) # 将一维数据处理为二维的网格数据
zi = griddata(data.iloc[:,0:2], z, (xi, yi), method='cubic') # 用法详见附录1

2018_T28.txt文件内容

读取后的数据样式,xyz的shape形状,都是相同长度的一维数组,即(12766,) (12766,) (12766,).

一、利用xyz绘制三维曲面

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(x, y, z, color='white', edgecolors='grey', alpha=0.5) #绘制三角网格组成的三维曲面
ax.scatter(x, y, z, c='red')  # 绘制三维散点图
plt.show()

 利用三角网格绘制的三维曲面图和三维散点图

二、利用xyz生成网格后绘制三维曲面

fig = plt.figure()
# ax = plt.axes(projection='3d')
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xi, yi, zi, cmap='BuPu', linewidth=0, antialiased=True)  #绘制三维曲面
# surf = ax.scatter(xi, yi, zi, cmap='BuPu', linewidth=0, antialiased=True)     #绘制三维散点图
# surf = ax.contourf(xi, yi, zi, zdim='z',offset=0.3, cmap='BuPu')   #等高线面图(contourf)或等高线图(contour),要设置offset,为Z的最小值,
fig.colorbar(surf)
ax.set_title('三维图')
ax.set_zlim3d(np.min(z), np.max(z))
plt.show()

三维曲面图、散点图和等值线图

三、利用xyz实现三维等值线绘制,降雨量三维等值线图

filename = r'D:\project\PythonProject\ECL\data\geochemical-data\0.txt'  # 数据文件地址,附件1
df = pd.read_csv(filename, sep="\t")  # 读取文件
df1 = df["1"]  # 读取第一列数据
df2 = df['2']  # 读取第二列数据
df3 = df['3']  # 读取第三列数据
odf1 = np.linspace(100, 1900, 50)  # 设置网格经度
odf2 = np.linspace(10, 600, 50)  # 设置网格纬度
odf1, odf2 = np.meshgrid(odf1, odf2)  # 网格化,生成网络,生成网格形状是第一个维度对应odf1,第二个维度对应odf2
func = Rbf(df1, df2,df3, function='linear')  # 定义插值函数plt.cm.hot
odf3_new = func(odf1, odf2)  # 获得插值后的网格累计降水量
fig = plt.figure(figsize=(12, 7))
ax1 = plt.axes(projection='3d')  # 创建三维坐标轴
ax1.plot_surface(odf1, odf2, odf3_new,alpha=0.3,cmap='rainbow') #绘制三维曲面,alpha-控制透明度,cmap-控制颜色
# 绘制z方向投影填充图,等高线面图,投到x-y平面,offset为z最小值。
cs=plt.contourf(odf1, odf2, odf3_new,zdir='z',offset=0,
             levels=np.arange(odf3_new.min(), odf3_new.max(), (odf3_new.max() - odf3_new.min()) / 10), cmap='GnBu',
             extend='both')  # 画图
# 绘制等高线图
line = plt.contour(odf1, odf2, odf3_new,zdir='z',offset=0,cmap="rainbow",levels=np.arange(odf3_new.min(), odf3_new.max(), (odf3_new.max() - odf3_new.min()) / 10))
plt.clabel(line, inline=True, fontsize=12)
ax1.set_title('降雨量三维等值线图')
plt.colorbar(cs)
plt.show()

效果图和数据格式

四、绘制二维等值线

# 绘制二维等值线
levels = np.linspace(np.min(z), np.max(z), 50)
fig, ax = plt.subplots(figsize=(8, 6))

# # 1.设置颜色条  第一种方式
# print(cm.colors.cnames)
# 默认颜色标如 jet,coolwarm,gnuplot2_r,RdBu_r,PuBuGn_r,ocean_r,输入的颜色名称错误时,会自动输出色标的列表
cmap = cm.get_cmap('seismic_r')
# cmap = cm.get_cmap('jet', 10)  # 将色条分成10截
norm = cm.colors.Normalize(vmin=np.min(z), vmax=np.max(z))  # 设置色条表示的数值范围
im1 = cm.ScalarMappable(norm=norm, cmap=cmap)               # 设置映射很重要
# # 绘制颜色条(left, bottom, width, height)--表示figure的百分比,从figure 从横向92%,纵向10%的位置开始绘制, 宽是figure的3%,高是figure的78%,
ax9 = fig.add_axes([0.92, 0.1, 0.03, 0.78])
cb = plt.colorbar(im1, cax=ax9, orientation='vertical', extend='neither') #纵向绘制,两端无箭头
# ticks与norm对应
# # cb = plt.colorbar(im1, cax=ax9, orientation='horizontal', extend='max', ticks=np.linspace(1900,2600, 51))
# cs = ax.contour(xi, yi, zi, levels=levels, cmap=cmap)         # 不存在颜色间隔分段,并指定颜色条
# cs = ax.contour(xi, yi, zi, levels=levels,cmap='coolwarm')  # 存在颜色间隔分段
cs = ax.contourf(xi, yi, zi, levels=levels,cmap='jet',extend='neither') # 等值线填充
ax.clabel(cs, inline=True, fontsize=6)
ax.set_title('等高线图')
plt.show()

# # 2.设置颜色条 第二种方式
# cs = ax.contourf(xi, yi, zi, levels=levels, cmap='jet', extend='neither')  # 等值线填充,存在颜色间隔分段
# # ax.clabel(cs, inline=True, fontsize=6)
# ax.set_title('等高线图')
# plt.colorbar(cs)
# plt.show()

两种二维等值线图

五、绘制矢量流线图

# 1.矢量场流线图 样例
# 0:5表示数组中数值所在的区间。100j表示划分的密度,值越大,图片越清晰
Y1, X1 = np.mgrid[-5:5:1000j, -5:5:10j]
# (X,Y)是一维numpy数组的等距网格,(U,V)参数匹配的是(X,Y)速率的二维numpy数组
# U,V矩阵在维度上的行数必须等于Y的长度,列的数量必须匹配X的长度
U = -1 - X1 ** 2 + Y1
V = 1 + X1 - Y1 ** 2
# 可视化矢量场
# 矢量场中的种子点坐标
seed_points = np.array([[-2, -1, 0, 1, 2, -1], [-2, -1, 0, 1, 2, 2]]) # 种子点
# cs=plt.streamplot(X1, Y1, U, V,density=[0.5,1],color=U,cmap="autumn",linewidth=1,start_points=seed_points.T)
cs = plt.streamplot(X1, Y1, U, V, color=U, cmap="Accent", linewidth=1)
# plt.plot(seed_points[0], seed_points[1], "+", color="g") # 绘制折线图,使用marker属性标记
plt.colorbar()
plt.show()

# 2.用实际数据进行绘制,UV如何计算得到,要根据不同的目的进行计算。
U,V=vectorComputeUV(xi,yi,zi)
cs = plt.streamplot(xi, yi, U, V, color=U, cmap="Accent", linewidth=1)
# cs = plt.quiver(xi, yi, U, V)
plt.colorbar()
plt.show()

# 计算矢量场的速度矢量
def vectorComputeUV(xi,yi,zi):
    # U = np.log10((xi/10000)) - zi/1000
    # V = 1 + np.log10(yi/100000) - (zi/1000) ** 3
    U = -1 - (xi/10000) ** 2 + (yi/100000)
    V = 1 + (xi/10000)  - (yi/100000) ** 2
    return U,V

示例效果图和实际数据案例图

附录

1.scipy.interpolate.griddata参数说明

scipy.interpolate.griddata的参数说明如下
插入非结构化D-D 数据
    points: 具有形状 (n, D) 的浮点数的二维 ndarray,或具有形状 (n,) 的一维 ndarray 的长度 D 元组。
    数据点坐标。
    values: 浮点数或复数的ndarray,形状(n,)
    数据值。
    xi: 具有形状 (m, D) 或长度为 D 的 ndarray 元组的二维 ndarray 可广播到相同形状。
    插入数据的点。
    method: {‘linear’, ‘nearest’, ‘cubic’},可选
    插值方法。之一
    fill_value: 浮点数,可选
    用于填充输入点凸包之外的请求点的值。如果未提供,则默认值为 nan 。此选项对‘nearest’ 方法无效。
    rescale: 布尔型,可选
    在执行插值之前将点重新缩放到单位立方体。如果某些输入维度具有不可比较的单位并且相差许多数量级,这将很有用。
返回
    ndarray
    插值数组。

2.streamplot()参数说明

matplotlib.pyplot.streamplot()参数说明如下:
  x,y:表示间距均匀的网格数据。
  u,v:表示(x, y)速率的二维数组。
  density:表示流线的密度,默认为1。
   color:表示流线颜色。一般设置为U
   cmap:表示线条颜色系,一般有'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens'
  linewidth:表示流线的宽度。
  arrowsize:表示箭头的大小。
  arrowstyle:表示箭头的类型。
  minlength:表示流线的最小长度。
  maxlength:表示流线的最大长度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用python绘制二三维曲面和矢量流线图 的相关文章

  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • python的hash()是持久的吗?

    Is the hash python 中的函数保证对于给定的输入始终相同 无论输入的时间 地点如何 到目前为止 仅从反复试验来看 答案似乎是肯定的 但最好了解其工作原理的内部原理 例如 在测试中 python gt gt gt from i
  • 如何在 Django QuerySet 中将 DateField() + TimeField() 转换为本地时间?

    我的模型为这些字段 date models DateField 开始时间 models TimeField 结束时间 models TimeField 我想用以下方式注释查询集start datetime and end datetime
  • 仅将 pandas df 的前 N ​​行写入 csv

    如何仅将前 N 行或从 P 到 Q 行从 pandas 数据帧写入 csv 而不首先对 df 进行子集化 由于内存问题 我无法对要导出的数据进行子集化 我正在考虑一个逐行写入 csv 的函数 谢谢 Use head https pandas
  • TensorFlow:在训练时更改变量

    如果我将输入管道从 feed dict 更改为 tf data dataset 如何在每次迭代后的训练期间更改网络内参数的值 澄清一下 旧代码看起来像这样 Define Training Step model is some class t
  • 更改 3D 图形颜色 (matplotlib)

    我使用以下代码在 matplotlib 中绘制了 3D 图形 Previously defines lists of data to plot fig plt figure ax fig add subplot 111 projection
  • Python 非贪婪正则表达式

    我如何制作一个像这样的Python正则表达式 这样 给定 a b c d e 蟒蛇匹配 b 代替 b c d 我知道我可以使用 代替 但我正在寻找一种更通用的解决方案 使我的正则表达式更加干净 有没有办法告诉python 嘿 尽快匹配这个
  • 如何限制 python 回溯到特定文件

    我编写了大量使用外部库的 Python 代码 我经常会编写一个错误 当我运行代码时 我会在 Python 控制台中看到一个很长的回溯 99 999999 的情况是由于我的代码中的编码错误 而不是由于包中的错误 但是回溯一直到包代码中的错误行
  • 如何在Django项目中使用PostgreSQL的存储过程或函数

    我正在开发一个 Django 项目 我决定在 PostgreSQL 中编写逻辑代码 而不是用 Python 编写 因此 我在 PostgreSQL 中创建了一个存储过程 例如 存储过程如下所示 create or replace proce
  • 将 NumPy 数组按元素映射到更多维度的数组

    我想要地图anumpy array从 NxM 到 NxMx3 其中三个元素的向量是原始条目的函数 lambda x f1 x f2 x f3 x 然而 像这样的事情numpy vectorize不允许改变尺寸 当然 我可以创建一个零数组并进
  • 使用 Docker 在本地主机上的“requests”连接错误

    我正在尝试开发客户端服务器应用程序 但遇到了一些问题 我的两个服务都是在单独的 docker 容器中本地开发的 客户端使用 api 从 api 获取数据requestspython 库 它可以在生产中使用 但在本地 我无法使用 reques
  • 使用 scikit-image 在 HSV 中进行颜色旋转

    目的是将纯红色图像转换为色轮的任何色调 A monochrome image is first converted into a RGB red image ex 然后转化为HSV 通过添加一个角度值来修改色调分量 与车轮颜色相匹配 然后将
  • 如何使用Python在Django for Windows中激活虚拟环境?

    我被告知要在 Django for Windows 中激活虚拟环境 我应该尝试 environment path Scripts activate 但是当我输入该命令时 cmd 返回此错误 该系统找不到指定的路径 我通过输入以下命令创建了虚
  • 在 Python/Django 中将用户的 facebook/twitter 好友与网站用户进行比较

    我想知道是否有人可以帮助指导解决这个相当常见的问题的方法 我正在构建一个简单的网站 用户可以连接他们的 Twitter 帐户进行注册 我想创建一个界面 向他们显示哪些推特好友已经在使用该网站 因此 我可以获得用户的 Twitter 朋友列表
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用

随机推荐

  • stm32通过esp8266实现温湿度实时监控和控制灯光

    stm32通过esp8266实现温湿度实时监控和控制灯光 前言 准备材料 一 硬件方面 二 软件方面 三 建立工程 1 工程创建 2 代码编写 三 关于一些C语言函数运用 结果演示 视频演示 前言 WiFi具有两种功能模式 一种叫 AP A
  • VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/cpuid.c:376 bugNr=1036521

    这个问题的原因有几个 第一个原因就是网上说的要开启BIOS的Interl virtual technology 而我当时开启了之后依然报错 最后找到问题的原因在VMWare Workstation 右键我们的虚拟机 选择最下面的设置 然后注
  • 梁山派GD32F470 CMSIS-DAPv1驱动错误

    请先参考嘉立创提供的解决方法 https dri8c0qdfb feishu cn wiki wikcnsGSBwwp15hr9dqRqbiKqxe 我的错误出现情况非常特别 仅供参考 本人电脑 2021拯救者r9000p win11 串口
  • 遗传算法--旅行商问题(TSP问题)-Matlab

    1 问题 2 仿真过程 3 代码实现 1 旅行商问题 TSP问题 假设有一个旅行商人要拜访全国31个省会城市 它需要选择所要走的路径 路径的限制是每个城市只能拜访一次 而且最后要回到原来出发的城市 对路径选择的要求是 所选路径的路成为所有路
  • QT笔记-PDF阅读器(附带完整源码)- 导入PDF文件,在窗体上显示,并提取PDF的文字内容

    环境搭建 1 mupdf 1 17 0 source库 mupdf 1 17 0 source默认是VS2019的工程 由于示例用的是VS2017 所以需要用VS2017重新编译mupdf 1 17 0 source工程 生成LIB库文件
  • k8s部署redis一主两从三哨兵

    目录 一 部署思路 二 部署 1 编写namespace脚本 2 编写configmap脚本 3 编写secret脚本 4 编写StorageClass脚本 1 编写ServiceAccount ClusterRole ClusterRol
  • 建站心得之discuz门户程序相比ZBLOG具有哪些优势[图]

    以前我是采用discuz门户程序建站的 因为个人觉得 这套程序确实不错 而门户discuz门户也可以生成纯静态HTML文件 这对于我们有特殊要求的站长来说 非常重要 因为纯静态不仅可以提升网页的访问速度 还可以节省服务器成本 因为我们都知道
  • Java异步执行方法

    一 利用多线程 直接new线程 Thread t new Thread Override public void run longTimeMethod 使用线程池 private ExecutorService executor Execu
  • 机器学习实验1---决策树预测泰坦尼克数据集

    泰坦尼克号乘客数据集分析 ID3算法决策树 泰坦尼克问题是一个比较经典的案例 此次实验的目的在于用决策树进行乘客的生存预测 数据集中的具体字段为 数据 含义 PassengerId 乘客编号 Survived 是否幸存 Pclass 船票等
  • 为什么要做一款ERP软件——开源软件诞生7

    技术之外的探讨 第7篇 用日志记录 开源软件 的诞生 赤龙ERP开源地址 点亮星标 感谢支持 与开发者交流 kzca2000 码云 https gitee com redragon redragon erp GitHub https git
  • 微搭低代码学习之销售员销售目标采集系统开发

    四月二十三 春意渐浓 草木抽出新枝 鸟儿唱响欢融 花开满园 香气袭人 阳光明媚 人们心情舒畅 愿这美好的日子 伴随你一生 使用Notion AI提问 写一首关于4月23日的诗 文章目录 前言 一 销售员销售目标采集系统需求分析 一 需求背景
  • Matplotlib绘制混淆矩阵及colorbar标签设置

    本文提供一种通过Matplotlib绘制混淆矩阵并调整colorbar标签的程序 直接上程序 from sklearn metrics import confusion matrix import matplotlib pyplot as
  • JS从编译到运行代码的过程

    js运行分为两个阶段 具体AST树以及bytecode等名词看我上一篇文章 浏览器工作原理 1 编译阶段 js代码 gt AST树 代码被解析的过程 v8引擎内部会在堆内存帮助我们创建一个对象 GlobalObject gt GO 简称GO
  • JS闭包理解

    JS闭包 1 闭包 每次看到jQuery的时候 首先想到的就是闭包 这是个常谈的问题了 今天重新回忆了一下闭包 什么是闭包 当有一个函数想要访问另一个函数内部的变量 这个是访问不了的 所有我们要用闭包来访问 所以简单的来说 闭包就是连接函数
  • STM32使用IIC协议驱动0.96寸OLED屏

    IIC是常用的协议之一 它通过不同的地址来区分设备 并且端口需要是开漏模式 并且需要接上拉电阻 要使用IIC驱动OLED 首先要配置IIC void I2C Configuration void I2C InitTypeDef I2C In
  • 程序员工资大概组成【刚毕业的大学生看过来】

    一 程序员的薪资组成是什么样子的呢 薪资组成因人而异 受到很多因素的影响 如工作地点 工作经验 工作职责 专业领域等 一般而言 中国程序员的薪资组成包括基本工资 绩效工资 津贴和奖金等 在中国 程序员的平均薪资水平受到地区 行业和职业经验等
  • C++实现一个线程池

    一 为什么使用线程池 大家都知道C 支持多线程开发 也就是支持多个任务并行运行 我们也知道线程的生命周期中包括创建 就绪 运行 阻塞 销毁等阶段 所以如果要执行的任务很多 每个任务都需要一个线程的话 那么频繁的创建 销毁线程会比较耗性能 有
  • 【计算机视觉

    文章目录 一 检测相关 9篇 1 1 Boosting Detection in Crowd Analysis via Underutilized Output Features 1 2 CircleFormer Circular Nucl
  • 油猴安装错误问题(下载中断问题)及脚本安装

    第一步 在电脑c盘找到这个文件 C Windows System32 drivers etc 然后用记事本打开hots 打开之后如此图 2 在host文件最后面 添加 131 253 33 219 edge microsoft com 13
  • 利用python绘制二三维曲面和矢量流线图

    为了实现不同数据的可视化 最近研究了python环境下的可视化方案 为后续的流体运动仿真模拟做好储备 由于python处理数据的便利性 导致目前很多后端处理或者可视化成图操作都在python中实现 比如前端是vue 加上简单的交互操作 后端