我希望能够看到 3D 表面上的线(和点)位于表面顶部(第二张图像),而不是后面(第一张图像)。这是我的 3D 函数:
def f(x, y):
return np.sin(2*x) * np.cos(2*y)
Run Code Online (Sandbox Code Playgroud)
3D 表面的 X、Y、Z:
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
Run Code Online (Sandbox Code Playgroud)
我生成了 x 点 (xx) 和 y 点 (yy) 的向量,其中 zz = f(xx,yy)
fig = plt.figure(figsize=(8,6))
ax = plt.axes(projection='3d')
ax.scatter(xx, yy, zz, c='r', marker='o')
#ax.plot(xx,yy,zz, c= 'r')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='viridis', edgecolor='none')
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,点在图后面,图形覆盖了点。我想看看情节上的要点。我应该怎么办?
我希望能够看到像这样的点和线:
编辑:这是我生成点的方式:
for i in range(1,2000):
[a, b] = np.random.rand(2,1)*np.sign(np.random.randn(2,1))*2
xx = …Run Code Online (Sandbox Code Playgroud) 我在 matplotlib 中为 3d 图设置限制时遇到问题;我发现无论我如何设置 x、y 和 z 轴的限制,3dplots 的绘图例程都会添加额外的缓冲区。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.axes.set_xlim3d(left=0, right=10)
ax.axes.set_ylim3d(bottom=0, top=10)
ax.axes.set_zlim3d(bottom=0, top=10)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这会产生以下图:
正如您所看到的,限制应该位于 x, y, z = {0, 10},但是 3D 绘图总是向每个边缘添加一点缓冲区。有谁知道如何关闭此效果?
我还使用过 plt.xlims(); 和 ax.axes.set_xlims() 但它们产生相同的效果。
我正在制作一个 3 面金字塔,我使用 add_collection3d(Poly3DCollection
但我想添加一个基于 z 轴的颜色图,以便顶部为红色,并逐渐变为蓝色,但细节并不重要。我尝试了 cmap 选项,但这确实改变了颜色。
我添加了一个一侧的脚本来说明问题。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
fig = plt.figure()
ax = Axes3D(fig)
#Pyramid side 1
xp1 = [1.1184,2.46,2.46]
yp1 = [0.5592, 1.23,2.73]
zp1 = [-1.5,0,-1.5]
verts1= [zip(xp1,yp1,zp1)]
cmhot = plt.cm.get_cmap("hot")
ax.add_collection3d(Poly3DCollection(verts1,cmap=cmhot))
ax.set_xlim(0,5)
ax.set_ylim(0,5)
ax.set_zlim(-2.5,5)
plt.show()
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
提前谢谢了。
我在 matplotlib 中有一个 3D 线图,使用以下代码创建:
def view(self):
from mpl_toolkits.mplot3d import Axes3D #noqa
import matplotlib.pyplot as plt
ax = plt.figure().gca(projection='3d')
history = np.array(self.position_history)
x, y ,z = history[:, 0], history[:, 1], history[:, 2]
ax.plot(x, y, z)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这history是一个 Mx3 点数组。这工作正常并按预期弹出一个情节。我可以通过单击并拖动来交互修改方位角和仰角。我可以通过右键单击和拖动来缩放。
但是我想知道是否可以修改平移和缩放的中心点?我想放大右上角,然后以右上角为旋转中心平移。如果您曾经使用过 SolidWorks 或其他 CAD 程序,这就是我所追求的行为。这可行吗?如果不是交互式的,我可以通过编程来完成吗?
最后,如果这一切在 matplotlib 中都不可能实现,是否还有另一个库可以实现我想要的功能?
我正在尝试使用 matplotlib 制作一个简单的 3D 曲面图,但该图最终没有显示;我只得到空的 3D 轴。
这是我所做的:
from mpl_toolkits.mplot3d import Axes3D
x = np.arange(1, 100, 1)
y = np.arange(1, 100, 1)
z = np.arange(1, 100, 1)
fig = figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x, y, z, rstride=5, cstride=5)
show()
Run Code Online (Sandbox Code Playgroud)
...我明白了:
有什么建议么?
我希望能够在 matplotlib 中制作可以立体 3D 显示的 3D 绘图,如下所示:
左图像的相机相对于右图像稍微平移。如果您稍加练习,您就可以欺骗您的大脑,让您的左眼看左图像,右眼看右图像,从而在任何屏幕上看到 3D!
不管怎样,我希望能够使任何 matplotlib 3d 图显示两次,并且一台相机稍微平移。我已经成功地通过翻译数据来获得立体图本身:
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(10,5))
axl = fig.add_subplot(1,2,1,projection='3d')
axr = fig.add_subplot(1,2,2,projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
axr.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
axl.plot_surface(X, Y-5, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
for ax …Run Code Online (Sandbox Code Playgroud) 我正在使用 matplotlib 准备 3d 绘图,并且我对多个数据集有一个非常奇怪的行为。我有两个数据集,基本上描述了 3d 中的两个壳:一个内壳和一个外壳。为了在 3d 中绘制它们,我这样做:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(outer_z[:n], outer_x[:n], outer_y[:n], c='black', marker='.', lw=0)
ax.scatter(inner_z[:n], inner_x[:n], inner_y[:n], c='red', marker='.', lw=0)
ax.set_xlabel("Z")
ax.set_ylabel("X")
ax.set_zlabel("Y")
ax.set_xlim([-5,5])
ax.set_ylim([5,-5])
ax.set_zlim([-5,5])
Run Code Online (Sandbox Code Playgroud)
(轴的顺序仅用于透视目的)。然而,当我保存该图时,我没有得到两个外壳:
我将一层覆盖在另一层上,后面清晰可见的点出现在前面。您可以在图片中看到,外壳上本应位于内壳后面的一些点绘制在内壳前面。这确实很烦人,因为它不追求“3D情节”的目的。有谁知道为什么会发生这种情况以及如何解决这个问题?
我正在使用 mpl_toolkits 库中的 mplot3d。当在图形上显示 3D 表面时,我意识到轴没有按照我希望的方式定位。
让我展示一下,我已将每个轴的位置添加到以下屏幕截图中:
有没有办法改变轴的位置以获得这个结果:
这是工作代码:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
ax = Axes3D(plt.figure())
def f(x,y) :
return -x**2 - y**2
X = np.arange(-1, 1, 0.02)
Y = np.arange(-1, 1, 0.02)
X, Y = np.meshgrid(X, Y)
Z = f(X, Y)
ax.plot_surface(X, Y, Z, alpha=0.5)
# Hide axes ticks
ax.set_xticks([-1,1])
ax.set_yticks([-1,1])
ax.set_zticks([-2,0])
ax.set_yticklabels([-1,1],rotation=-15, va='center', ha='right')
plt.show()
Run Code Online (Sandbox Code Playgroud)
我尝试过使用xaxis.set_ticks_position('left')声明,但它不起作用。
我正在做 PCA,有 10 个组件。我想根据它们的组类型绘制前 3 个组件和颜色。
from mpl_toolkits.mplot3d import Axes3D
df=pd.DataFrame(np.random.rand(30,20))
grp=round(pd.DataFrame(np.random.rand(30)*10),0)
df['grp']=grp
fig = plt.figure(figsize=(12, 9))
ax = Axes3D(fig)
y = df.iloc[:,1]
x = df.iloc[:,0]
z = df.iloc[:,2]
c = df['grp']
ax.scatter(x,y,z, c=c, cmap='coolwarm')
plt.title('First 3 Principal Components')
ax.set_ylabel('PC2')
ax.set_xlabel('PC1')
ax.set_zlabel('PC3')
plt.legend()
Run Code Online (Sandbox Code Playgroud)
这是可行的,但不幸的是并没有显示一个传说,也不相信所有可能的群体。
我们怎样才能使半径为 R 的球体以给定坐标(x,y,z)为中心。就像有 10 组球心坐标和相应的 10 个不同的半径值一样。我们如何在 python 中绘制它?有什么方法可以在 python 中执行此操作,就像在 MATLAB 中一样,可以使用 surf 命令来完成此操作。在Python中我们如何实现这一点?
matplotlib-3d ×10
python ×10
matplotlib ×9
surface ×3
mplot3d ×2
scatter3d ×2
axis ×1
pandas ×1
plot ×1
stereoscopy ×1