python三维网格图_【python】获取三维图形的某个截面

在数据可视化实践过程中经常需要对三维甚至更高纬度数据进行可视化。由于视线阻挡,人们在看三维物体时并不能观测清楚完全。有时候需要获取三维图形的某个截面来单独分析数据。

# -*- coding: utf-8 -*-

import numpy as np

from mpl_toolkits.mplot3d import Axes3D

import matplotlib as mpl

from scipy import interpolate

import matplotlib.cm as cm

import matplotlib.pyplot as plt

xmin=-10

ymin=-10

xmax=10

ymax=10

rawStrideNum=50#原始数据x,y的分段数

InterpolationNum=100#使用插值方法获取某个截面数据 获取数据时将数据分割的分段数

#生成原始数据的f value

def fm((x, y)):

return (np.sin(x) + 0.05 * x ** 2+ np.sin(y) + 0.05 * y ** 2)

#原始数据获取

x = np.linspace(xmin, xmax, rawStrideNum)

y = np.linspace(ymin,ymax,rawStrideNum)

X, Y = np.meshgrid(x, y)#50*50的网格数据

Z = fm((X, Y))

#开始作图

fig = plt.figure(figsize=(9, 6))

#Draw sub-graph1

ax=plt.subplot(1, 2, 1,projection = '3d')

surf = ax.plot_surface(X, Y, Z, rstride=2, cstride=2, cmap=cm.coolwarm,linewidth=0.5, antialiased=True)

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_zlabel('f(x, y)')

plt.colorbar(surf, shrink=0.5, aspect=5)#标注

#subplot2data preparation

#(1)用插值函数拟合数据

newfun=interpolate.interp2d(X, Y, Z,kind="cubic")#返回的是一个函数 newfun为一个函数

xnew = np.linspace(xmin, xmax, InterpolationNum)#重新划分x,y间隔数为InterpolationNum个

ynew = np.linspace(ymin, ymax, InterpolationNum)

fnew=newfun(xnew,ynew)#得到重新划分x,y间隔后fnew值 fnew为InterpolationNum*InterpolationNum的二维数组

def getXCrossSectionData(f,xval):

index=(xval-xmin)*1.0/(xmax-xmin)*InterpolationNum

print " x index ",int(index)

FixedX=np.empty(InterpolationNum)

FixedX.fill(xval)

return FixedX,f[int(index)]

def getYCrossSectionData(f,yval):

index2=(yval-ymin)*1.0/(ymax-ymin)*InterpolationNum

print "y index",int(index2)

FixedY=np.empty(InterpolationNum)

FixedY.fill(yval)

return FixedY,f[:,int(index2)]

FixedX,Z_FixedX=getXCrossSectionData(fnew,-9)#设置想要获取的x截面

FixedY,Z_FixedY=getYCrossSectionData(fnew,5)

#在原图上添加直线,从吻合性判断数据的准确性

ax.plot(FixedX, ynew, Z_FixedX)

ax.plot(xnew, FixedY, Z_FixedY)

#Draw sub-graph2单独抽取某个截面

ax2=plt.subplot(122, projection = '3d')

ax2.plot(FixedX, ynew, Z_FixedX)

ax2.plot(xnew, FixedY, Z_FixedY)

plt.show()

python三维网格图_【python】获取三维图形的某个截面_第1张图片 由上图可知,左图在描绘三维物品时,因为视觉阻挡,并不能很好观察底部数据。通过抽取数据的某些截面,可以单独分析数据。

你可能感兴趣的:(python三维网格图)