Python 如何在matplotlib中进行三维旋转打印?

Python 如何在matplotlib中进行三维旋转打印?,python,numpy,matplotlib,Python,Numpy,Matplotlib,假设您有一条二维曲线,例如: from matplotlib import pylab t = numpy.linspace(-1, 1, 21) z = -t**2 pylab.plot(t, z) 产生 我想执行一次旋转以实现3d绘图(请参阅)。绘制三维曲面不是问题,但它不会产生我期望的结果: 如何在3d绘图中旋转此蓝色曲线?您的图形上的绘图似乎使用笛卡尔网格。matplotlib网站上有一些3D圆柱函数的示例,如Z=f(R)(此处:)。 这就是你要找的吗? 下面是函数Z=-R**2的

假设您有一条二维曲线,例如:

from matplotlib import pylab
t = numpy.linspace(-1, 1, 21)
z = -t**2
pylab.plot(t, z)
产生

我想执行一次旋转以实现3d绘图(请参阅)。绘制三维曲面不是问题,但它不会产生我期望的结果:


如何在3d绘图中旋转此蓝色曲线?

您的图形上的绘图似乎使用笛卡尔网格。matplotlib网站上有一些3D圆柱函数的示例,如Z=f(R)(此处:)。 这就是你要找的吗? 下面是函数Z=-R**2的结果:

要在函数中添加截断,请使用以下示例: (需要matplotlib 1.2.0)

冲浪成绩:

和surfc:


您是否在问为什么蓝色曲线位于3D曲面的前面?Matplotlib没有“真实”三维打印,因此它不处理其他对象后面对象的遮挡等。如果要进行完整的三维打印,则需要使用
mayavi
或类似工具。(Mayavi的
mlab
界面非常容易入门:)不,这不是问题所在。我将蓝色曲线与3D曲面一起添加,以更好地指定我想要的内容。3D曲面是我能得到的,但我想用蓝色曲线旋转,得到一个我不知道如何得到的曲面。我想要得到的曲面类型显示在RevolutionPlot3D.html链接中。我怀疑您的问题至少部分是轴限制。在
matplotlib
中,您将获得给定x-y足迹中所有z值的绘图,mathematica示例选择一个z截止点,然后使x-y足迹足够大,以便用zy捕获所有点。您的注释是有意义的。有什么简单的方法可以用matplotlib来模拟吗?看起来很有希望。我将如何绘制z=max(abs(xi),abs(yi)),即L1范数?哼。。如果你想用x和y绘制L1范数,它不再是一个旋转图。。。无论如何,您可以使用函数numpy.where(),例如:Z=np.where(abs(X)>abs(Y),X,Y)您可以使用另一个matplotlib示例,如下图所示。一般来说,所有matplotlib 3D示例都是。我以前见过这些示例。我不知道为什么你认为L1范数不能用3D表示在一个旋转中。让我们把它限制在某个域中,比如[-1,1],它肯定会给出一条二维曲线。为什么我不能进行一次旋转?你如何得到你的二维曲线,它的方程是什么?我认为你需要在公式z=max(abs(x),abs(y))中修正x或y,这样你就只有一个维度并绘制一条曲线。在1D中,我们得到f(x)=y=abs(x)。为了得到一个凹形曲线,如前面的例子,我们可以考虑f(x)=-ABS(x)。例如,在2D中,我们可以将x和y限制为[-n,n]。所以f(x,y)=z=-(abs(x)+abs(y))。如果我们改为执行z=-max(abs(x),abs(y)),那么我们使用的是L无穷范数。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)

Z = -(abs(X) + abs(Y))

## 1) Initial surface
# Flatten mesh arrays, necessary for plot_trisurf function
X = X.flatten()
Y = Y.flatten()
Z = Z.flatten()

# Plot initial 3D surface with triangles (more flexible than quad)
#surfi = ax.plot_trisurf(X, Y, Z, cmap=cm.jet, linewidth=0.2)

## 2) Cut off
# Get desired values indexes
cut_idx = np.where(Z > -5)

# Apply the "cut off"
Xc = X[cut_idx]
Yc = Y[cut_idx]
Zc = Z[cut_idx]

# Plot the new surface (it would be impossible with quad grid)
surfc = ax.plot_trisurf(Xc, Yc, Zc, cmap=cm.jet, linewidth=0.2)

# You can force limit if you want to compare both graphs...
ax.set_xlim(-5,5)
ax.set_ylim(-5,5)
ax.set_zlim(-10,0)

plt.show()