我正在学习如何使用mplot3d来生成漂亮的三维数据图表,到目前为止我非常高兴.我此刻想做的是一个旋转表面的小动画.为此,我需要为3D投影设置摄像机位置.我想这一定是可行的,因为在交互式使用matplotlib时可以使用鼠标旋转表面.但是如何从脚本中执行此操作?我在mpl_toolkits.mplot3d.proj3d中发现了很多变换,但是我无法找到如何将这些变换用于我的目的,而我没有找到任何我想要做的例子.
我试图从海底500米乘40米部分的声纳数据绘制海底的3D图像.我正在使用带有Axes3D的matplotlib/mplot3d,我希望能够更改轴的纵横比,以便x&y轴可以缩放.生成数据而不是实际数据的示例脚本是:
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# Create figure.
fig = plt.figure()
ax = fig.gca(projection = '3d')
# Generate example data.
R, Y = np.meshgrid(np.arange(0, 500, 0.5), np.arange(0, 40, 0.5))
z = 0.1 * np.abs(np.sin(R/40) * np.sin(Y/6))
# Plot the data.
surf = ax.plot_surface(R, Y, z, cmap=cm.jet, linewidth=0)
fig.colorbar(surf)
# Set viewpoint.
ax.azim = -160
ax.elev = 30
# Label axes.
ax.set_xlabel('Along track (m)')
ax.set_ylabel('Range (m)')
ax.set_zlabel('Height (m)')
# …
Run Code Online (Sandbox Code Playgroud) 我只是试图用3D绘制曲面及其轮廓,就像在这个例子中一样.
这是我用来做的代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
import numpy
def plot_3d_contour(x_dim, y_dim, x_steps, y_steps, scalar_field, file_path):
fig = plt.figure()
x, y = numpy.mgrid[-x_dim/2:x_dim/2:x_steps*1j, -y_dim/2:y_dim/2:y_steps*1j]
v_min = numpy.min(scalar_field)
v_max = nupmy.max(scalar_field)
ax = fig.gca(projection='3d')
cset = ax.contourf(x, y, scalar_field, zdir='z', offset=v_min, cmap=cm.coolwarm)
cset = ax.contourf(x, y, scalar_field, zdir='x', offset=-x_dim/2-1, cmap=cm.coolwarm)
cset = ax.contourf(x, y, scalar_field, zdir='y', offset=y_dim/2+1, cmap=cm.coolwarm)
ax.plot_surface(x, y, scalar_field, rstride=10, cstride=10, alpha=0.3)
ax.set_xlabel('X')
ax.set_xlim(-x_dim/2-1, x_dim/2+1)
ax.set_ylabel('Y')
ax.set_ylim(-y_dim/2-1, y_dim/2+1)
ax.set_zlabel('Z')
ax.set_zlim(v_min, …
Run Code Online (Sandbox Code Playgroud) 这是一个准系统的例子:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
f = fig.add_subplot(2, 1, 1, projection='3d')
t = fig.add_subplot(2, 1, 2, projection='3d')
# axes
for d in {f, t}:
d.plot([-1, 1], [0, 0], [0, 0], color='k', alpha=0.8, lw=2)
d.plot([0, 0], [-1, 1], [0, 0], color='k', alpha=0.8, lw=2)
d.plot([0, 0], [0, 0], [-1, 1], color='k', alpha=0.8, lw=2)
f.dist = t.dist = 5.2 # 10 is default
plt.tight_layout()
f.set_aspect('equal')
t.set_aspect('equal')
r = 6
f.set_xlim3d([-r, r])
f.set_ylim3d([-r, r])
f.set_zlim3d([-r, r])
t.set_xlim3d([-r, …
Run Code Online (Sandbox Code Playgroud) 如何旋转z-label以使文本读取(bottom => top)而不是(top => bottom)?
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_zlabel('label text flipped', rotation=90)
ax.azim = 225
plt.show()
Run Code Online (Sandbox Code Playgroud)
编辑:本文末尾的解决方法.
其中一个例子是:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')
plt.show()
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py:842: MatplotlibDeprecationWarning: The set_scale function was deprecated in version 1.3.
self.zaxis.set_scale('linear')
Traceback (most recent call last): …
Run Code Online (Sandbox Code Playgroud) 我正在运行此示例脚本,并进行了以下修改:
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='parametric curve')
ax.legend()
ax.set_xlabel('$X$', fontsize=20, rotation=150)
ax.set_ylabel('$Y$')
ax.set_zlabel(r'$\gamma$', fontsize=30, rotation=60)
ax.yaxis._axinfo['label']['space_factor'] = 3.0
plt.show()
Run Code Online (Sandbox Code Playgroud)
如何将轴刻度调整为我选择的轴刻度?即,我如何让z轴仅标记为2,0和-2,以及我想要的字体大小?我知道如何在2D而不是3D中执行此操作.
上面的脚本产生以下内容:
为什么x轴标签失真,我想用这个脚本做,但不是z轴标签(gamma)?这根本不符合逻辑.我需要在希腊字母中标注这个轴.我该如何解决?
在下面的代码中,如何在.show()指令之前创建连接由两行代码创建的每对散点图(即将绿色圆圈连接到黄色箭头)的行连接到末尾的行?
import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D
dates = [20020514, 20020515, 20020516, 20020517, 20020520]
highs = [1135, 1158, 1152, 1158, 1163]
lows = [1257, 1253, 1259, 1264, 1252]
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0]
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0]
zaxisvalues0= [0, 0, 0, 0, 0]
zaxisvalues1= [1, 1, 1, 1, 1]
zaxisvalues2= [2, 2, 2, 2, 2]
fig = matplotlib.pyplot.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b')
ax.plot(dates, zaxisvalues2, upperLimits, color = …
Run Code Online (Sandbox Code Playgroud) 我有离散的规则网格a,b
点及其对应的c
值,我进一步插值以获得平滑的曲线.现在从插值数据,我还想创建一个曲线拟合的多项式方程.如何在多项式中拟合三维图?
我试着在MATLAB中这样做.我在MATLAB(r2010a)中使用了Surface拟合工具箱来曲线拟合三维数据.但是,如何在MATLAB/MAPLE或任何其他软件中找到适合一组数据的公式以获得最佳效果.有什么建议?最有用的还有一些真实的代码示例,可以在Web上查看PDF文件等.
这只是我数据的一小部分.
a = [ 0.001 .. 0.011];
b = [1, .. 10];
c = [ -.304860225, .. .379710865];
Run Code Online (Sandbox Code Playgroud)
提前致谢.
mplot3d ×10
matplotlib ×9
python ×8
3d ×1
aspect-ratio ×1
contourf ×1
latex ×1
maple ×1
matlab ×1
python-2.7 ×1