首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在matplotlib中旋转三维曲面

如何在matplotlib中旋转三维曲面
EN

Stack Overflow用户
提问于 2016-07-12 11:00:46
回答 5查看 22.3K关注 0票数 8

我已经编写了代码来绘制matplotlib中的一个准parabaloid的三维曲面。

我如何旋转图形,使图形保持不变(即没有垂直或水平移动),然而,它通过θ的角度围绕直线y=0和z=0旋转(我突出显示了图形应该以绿色旋转的线)。这里有一个例子来帮助我想象我所描述的:

例如,如果图形是通过180度的角度绕直线旋转,那么这将导致图形被“倒转”,因此原点现在是最大点。

我也想旋转轴,以便保持彩色地图。下面是绘制该图形的代码:

代码语言:javascript
复制
#parabaloid
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

#creating grid
y = np.linspace(-1,1,1000)
x = np.linspace(-1,1,1000)
x,y = np.meshgrid(x,y)

#set z values
z = x**2+y**2

#label axes
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')


#plot figure
ax.plot_surface(x,y,z,linewidth=0, antialiased=False, shade = True, alpha = 0.5)

plt.show()
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-12 12:58:07

以下是我的评论:

代码语言:javascript
复制
import mayavi.mlab as mlab
import numpy as np
x,y = np.mgrid[-1:1:0.001, -1:1:0.001]
z = x**2+y**2
s = mlab.mesh(x, y, z)
alpha = 30  # degrees
mlab.view(azimuth=0, elevation=90, roll=-90+alpha)

mlab.show()

或者跟随@Tamas的回答:

代码语言:javascript
复制
#parabaloid
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from math import sin, cos, pi
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

#creating grid
y = np.linspace(-1,1,200)
x = np.linspace(-1,1,200)
x,y = np.meshgrid(x,y)

#set z values
z0 = x**2+y**2

# rotate the samples by pi / 4 radians around y
a = pi / 4
t = np.transpose(np.array([x,y,z0]), (1,2,0))
m = [[cos(a), 0, sin(a)],[0,1,0],[-sin(a), 0, cos(a)]]
x,y,z = np.transpose(np.dot(t, m), (2,0,1))
# or `np.dot(t, m)` instead `t @ m`


#label axes
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

#plot figure
ax.plot_surface(x,y,z,linewidth=0, antialiased=False, shade = True, alpha = 0.5, facecolors=cm.viridis(z0))

plt.show()

票数 5
EN

Stack Overflow用户

发布于 2016-07-12 11:26:42

像这样吗?

代码语言:javascript
复制
ax.view_init(-140, 30)

plt.show()命令之前插入它。

票数 17
EN

Stack Overflow用户

发布于 2016-07-12 11:59:51

我能想到的最好的方法就是旋转数据本身。

代码语言:javascript
复制
#parabaloid
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from math import sin, cos, pi

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

#creating grid
y = np.linspace(-1,1,200)
x = np.linspace(-1,1,200)
x,y = np.meshgrid(x,y)

#set z values
z = x**2+y**2

# rotate the samples by pi / 4 radians around y
a = pi / 4
t = np.transpose(np.array([x,y,z]), (1,2,0))
m = [[cos(a), 0, sin(a)],[0,1,0],[-sin(a), 0, cos(a)]]
x,y,z = np.transpose(t @ m, (2,0,1))
# or `np.dot(t, m)` instead `t @ m`


#label axes
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

#plot figure
ax.plot_surface(x,y,z,linewidth=0, antialiased=False, shade = True, alpha = 0.5)

plt.show()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38326983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档