翼度科技»论坛 编程开发 python 查看内容

利用python绘制二三维曲面和矢量流线图的代码示例

5

主题

5

帖子

15

积分

新手上路

Rank: 1

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

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

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

一、利用xyz绘制三维曲面
  1. fig = plt.figure()
  2. ax = fig.add_subplot(111, projection='3d')
  3. ax.plot_trisurf(x, y, z, color='white', edgecolors='grey', alpha=0.5) #绘制三角网格组成的三维曲面
  4. ax.scatter(x, y, z, c='red')  # 绘制三维散点图
  5. plt.show()
复制代码
利用三角网格绘制的三维曲面图和三维散点图


二、利用xyz生成网格后绘制三维曲面
  1. fig = plt.figure()
  2. # ax = plt.axes(projection='3d')
  3. ax = fig.gca(projection='3d')
  4. surf = ax.plot_surface(xi, yi, zi, cmap='BuPu', linewidth=0, antialiased=True)  #绘制三维曲面
  5. # surf = ax.scatter(xi, yi, zi, cmap='BuPu', linewidth=0, antialiased=True)     #绘制三维散点图
  6. # surf = ax.contourf(xi, yi, zi, zdim='z',offset=0.3, cmap='BuPu')   #等高线面图(contourf)或等高线图(contour),要设置offset,为Z的最小值,
  7. fig.colorbar(surf)
  8. ax.set_title('三维图')
  9. ax.set_zlim3d(np.min(z), np.max(z))
  10. plt.show()
复制代码
三维曲面图、散点图和等值线图


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


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


五、绘制矢量流线图
  1. # 1.矢量场流线图 样例
  2. # 0:5表示数组中数值所在的区间。100j表示划分的密度,值越大,图片越清晰
  3. Y1, X1 = np.mgrid[-5:5:1000j, -5:5:10j]
  4. # (X,Y)是一维numpy数组的等距网格,(U,V)参数匹配的是(X,Y)速率的二维numpy数组
  5. # U,V矩阵在维度上的行数必须等于Y的长度,列的数量必须匹配X的长度
  6. U = -1 - X1 ** 2 + Y1
  7. V = 1 + X1 - Y1 ** 2
  8. # 可视化矢量场
  9. # 矢量场中的种子点坐标
  10. seed_points = np.array([[-2, -1, 0, 1, 2, -1], [-2, -1, 0, 1, 2, 2]]) # 种子点
  11. # cs=plt.streamplot(X1, Y1, U, V,density=[0.5,1],color=U,cmap="autumn",linewidth=1,start_points=seed_points.T)
  12. cs = plt.streamplot(X1, Y1, U, V, color=U, cmap="Accent", linewidth=1)
  13. # plt.plot(seed_points[0], seed_points[1], "+", color="g") # 绘制折线图,使用marker属性标记
  14. plt.colorbar()
  15. plt.show()
  16. # 2.用实际数据进行绘制,UV如何计算得到,要根据不同的目的进行计算。
  17. U,V=vectorComputeUV(xi,yi,zi)
  18. cs = plt.streamplot(xi, yi, U, V, color=U, cmap="Accent", linewidth=1)
  19. # cs = plt.quiver(xi, yi, U, V)
  20. plt.colorbar()
  21. plt.show()
  22. # 计算矢量场的速度矢量
  23. def vectorComputeUV(xi,yi,zi):
  24.     # U = np.log10((xi/10000)) - zi/1000
  25.     # V = 1 + np.log10(yi/100000) - (zi/1000) ** 3
  26.     U = -1 - (xi/10000) ** 2 + (yi/100000)
  27.     V = 1 + (xi/10000)  - (yi/100000) ** 2
  28.     return U,V
复制代码
示例效果图和实际数据案例图

附录
1.scipy.interpolate.griddata参数说明
  1. 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()参数说明
  1. 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:表示流线的最大长度。
复制代码
以上就是利用python绘制二三维曲面和矢量流线图的详细内容,更多关于python二三维曲面和矢量流线图的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/python/292022epc.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具