标签: matplotlib-3d

在曲面图上画线

我希望能够看到 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)

python plot matplotlib matplotlib-3d

9
推荐指数
1
解决办法
1万
查看次数

正确设置 3d 图中的轴限制

我在 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)

这会产生以下图:

3d 轴图像

正如您所看到的,限制应该位于 x, y, z = {0, 10},但是 3D 绘图总是向每个边缘添加一点缓冲区。有谁知道如何关闭此效果?

我还使用过 plt.xlims(); 和 ax.axes.set_xlims() 但它们产生相同的效果。

python axis matplotlib mplot3d matplotlib-3d

7
推荐指数
1
解决办法
3万
查看次数

将颜色图添加到 add_collection(3d 图中的表面)

我正在制作一个 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)

为什么这不起作用?

提前谢谢了。

python matplotlib color-mapping matplotlib-3d

6
推荐指数
1
解决办法
1439
查看次数

更改 3D 绘图中的旋转中心

我在 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 中都不可能实现,是否还有另一个库可以实现我想要的功能?

python matplotlib matplotlib-3d

5
推荐指数
1
解决办法
3627
查看次数

3D 曲面图未显示

我正在尝试使用 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)

...我明白了: 在此输入图像描述

有什么建议么?

python matplotlib surface matplotlib-3d

5
推荐指数
1
解决办法
2万
查看次数

如何创建立体 3D 曲面图

我希望能够在 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)

python matplotlib stereoscopy matplotlib-3d

5
推荐指数
0
解决办法
4087
查看次数

后面的 3d 散点与前面的重叠点

我正在使用 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情节”的目的。有谁知道为什么会发生这种情况以及如何解决这个问题?

python matplotlib scatter3d matplotlib-3d

5
推荐指数
1
解决办法
5060
查看次数

更改 Axes3D 上轴的位置

我正在使用 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')声明,但它不起作用。

python surface mplot3d matplotlib-3d

5
推荐指数
1
解决办法
8791
查看次数

根据数据框绘制 3D 散点图并按组着色

我正在做 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)

这是可行的,但不幸的是并没有显示一个传说,也不相信所有可能的群体。

python matplotlib pandas scatter3d matplotlib-3d

5
推荐指数
1
解决办法
2万
查看次数

绘制半径为 R 的球体

我们怎样才能使半径为 R 的球体以给定坐标(x,y,z)为中心。就像有 10 组球心坐标和相应的 10 个不同的半径值一样。我们如何在 python 中绘制它?有什么方法可以在 python 中执行此操作,就像在 MATLAB 中一样,可以使用 surf 命令来完成此操作。在Python中我们如何实现这一点?

python matplotlib surface matplotlib-3d

4
推荐指数
1
解决办法
4563
查看次数