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

news2024/9/23 8:14:22

       为了实现不同数据的可视化,最近研究了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:表示流线的最大长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全国时尚CIO峰会丨实在智能:“数字员工”成企业数字化关键纽带

时尚,是不断演进的艺术。“中国时尚行业转型高峰论坛暨时尚行业CIO夏季峰会”作为时尚界的重要盛事,已经成为业界领袖、品牌大咖与创新者们的汇聚之地。近日,以“数智极智未来:新纪元 新生命”为主题的第八届时尚行业盛会在广东佛…

Linux驱动开发:Linux内核启动流程详解

前言:Linux 内核同样作为 Linux 驱动开发的 “三巨头” 之一,Linux 内核的启动流程要比 uboot 复杂的多,涉及到的内容也更多。但秉持着 “知其然知其所以然” 的学习态度,作者将给读者朋友大致的过一遍 Linux 内核的启动流程。(考…

Jmeter的常用设置(二)

文章目录 前言一、察看结果树响应结果是乱码_解决方法 方法一:在察看结果树之前添加 后置处理器 中的 “BeanShell PostProcessor” 来动态修改结果处理编码方法二:在配置文件中修改二、使用步骤 1.引入库2.读入数据总结 前言 接口测试中遇到的各种问题…

VN积分法卷径计算

卷径计算的其他方法请参看专栏的相关文章,链接如下: 卷径计算(V/N法)_RXXW_Dor的博客-CSDN博客卷径计算(厚度累计法/膜厚叠加法)_RXXW_Dor的博客-CSDN博客卷径计算的截面积法请参看下面的文章链接:卷径计算详解(通过卷绕的膜长和膜厚进行计算)_RXXW_Dor的博客-CSDN博客有关…

高清视频如何转成gif动画?手把手教你在线转换高清gif

说到gif动图相信大家并不陌生,随着gif表情包越来越火爆,大家也不满足于收藏转载别人的表情包了。都开始自己制作gif表情包了,那么,如何将视频转换成高清gif呢?很简单,使用GIF中文网的视频转gif(…

Protobuf类型定义

"都甩掉吧,我们的世界一定会更美好!其他不重要!" 前面呢,我们讲了如何在Linux环境下安装Protobuf所需的库,那么本篇的着眼点在于Protobuf的编写以及语法规则。 什么是proto3? ProtocolBuffers语⾔版本3&am…

CClink IE转Modbus TCP网关连接三菱FX5U PLC

远创智控YC-CCLKIE-TCP 是自主研发的一款 CCLINK IE FIELD BASIC 从站功能的通讯网关。该产品主要功能是将各种 MODBUS-TCP 设备接入到 CCLINK IE FIELD BASIC 网络中。 远创智控YC-CCLKIE-TCP网关连接到 CCLINK IE FIELD BASIC 总线中做为从站使用,连接到 MODBUS-T…

[MMDetection]COCO数据集可视化验证

在使用MMDetection训练之前,需要对图像进行可视化验证,验证数据和标签是否对齐。 # 数据集可视化 import os import matplotlib.pyplot as plt from PIL import Imageoriginal_images [] images [] texts [] plt.figure(figsize(16,12))image_paths …

MySQL阶段_DAY17-DAY19(附笔记)

【注意】:管家婆知识的目录结构,一个针对于CRUD的小案例,也就是后端的CRUD 1、控制层 接收view传递的数据, 向service传递数据(调用service层) 向view返回结果 package controller;import java.util.List;import domain.ZhangWu; import servi…

路径规划算法:基于冠状病毒群体免疫优化的路径规划算法- 附代码

路径规划算法:基于冠状病毒群体免疫优化的路径规划算法- 附代码 文章目录 路径规划算法:基于冠状病毒群体免疫优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要…

使用信号量Semaphore 实现多线程访问

一 semaphore多线程访问 1.1 代码 public class Xinhaoliang {public static void main(String[] args) {Semaphore semaphorenew Semaphore(3);for(int k1;k<8;k){final int mk;new Thread(new Runnable() {Overridepublic void run() {try {semaphore.acquire();Syste…

使用ResponseBodyAdvice返回值为String出现cannot be cast to java.lang.String异常

使用ResponseBodyAdvice返回值为String出现cannot be cast to java.lang.String异常 背景 由于项目中为了全局返回统一的JSON格式&#xff0c;使用ResponseBodyAdvice进行拦截&#xff0c;拦截的时候会将返回的信息统一一个对象返回到前端。但是有的同事将一个String的响应对象…

【Linux】高级IO(一)

文章目录 高级IO阻塞IO模型非阻塞IO模型多路转接IOselect简介socket 就绪条件select服务器select的优缺点多路转接的使用场景 高级IO 非阻塞IO&#xff0c;记录锁&#xff0c;系统V流机制&#xff0c;I/O多路转接&#xff08;I/O&#xff09;多路复用&#xff0c;readv 和 wri…

English Learning - L3 综合练习 10 口语语法串讲与思维回顾 2023.07.5 周三

English Learning - L3 综合练习 10 口语语法串讲与思维回顾 2023.07.5 周三 [知识点 1] 名词性从句问题&#xff1a;到底什么是名词笥从句&#xff1f;例 1&#xff1a;我的东西你都可以随便用例 2&#xff1a;不管是谁&#xff0c;放你鸽子就是混蛋例 3&#xff1a;说那种话的…

CMU15-445 2022 Fall 通关记录 —— Project 2:B+ Tree(下篇)

Project 2&#xff1a;B Tree Project #2 - BTree | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) NOTE&#xff1a; 记录完成该Pro中&#xff0c;一些可能会遇到的问题&#xff1a; 本实验中&#xff0c;有很多API是需要自己去实现的&#xff0c;因此&#x…

Mycat【Mycat高可用(安装配置HAProxy、安装配置Keepalived)】(八)-全面详解(学习总结---从入门到深化)

目录 Mycat高可用_安装配置HAProxy Mycat高可用_安装配置Keepalived 复习&#xff1a; Mycat高可用_安装配置HAProxy 安装配置HAProxy 查看列表 yum list | grep haproxy yum安装 yum -y install haproxy 修改配置文件 $ vim /etc/haproxy/haproxy.cfg 启动HAProxy …

安全漏洞的检测利用

安全漏洞的检测&利用 一、安全漏洞的基本概念1.1、什么是漏洞1.2、漏洞的简单理解1.3、微软的RPC漏洞与蠕虫病毒1.4、微软经典的蓝屏漏洞1.5、Heartbleed&#xff08;心脏滴血&#xff09;漏洞1.6、破壳漏洞CVE-2014-62711.7、漏洞的危害1.8、漏洞的成因1.9、漏洞的信息的组…

mysql工具sequel pro

一、安装sequel pro 下载地址&#xff1a;https://www.sequelpro.com/ 需要翻墙 二、安装mysql 下载地址&#xff1a;https://www.mysql.com/ 傻瓜式安装即可 记得设置密码 三、配置环境变量 &#xff08;1&#xff09;打开终端 &#xff08;2&#xff09;open ~/.bash_profile…

【送书福利-第十五期】计算机全栈高手到底该怎么发展?

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、书籍介绍1、《前端…

0代码训练GPT-5?MIT微软证实GPT-4涌现自我纠错能力迭代

我们都知道&#xff0c;大模型具有自省能力&#xff0c;可以对写出的代码进行自我纠错。 这种自我修复背后的机制&#xff0c;究竟是怎样运作的&#xff1f; 对代码为什么是错误的&#xff0c;模型在多大程度上能提供准确反馈&#xff1f; 近日&#xff0c;MIT和微软的学者发…