python - Matplotlib:3D 数据的正交投影(在 2D 图中)

标签 python matplotlib 2d projection orthographic

我正在尝试使用正交投影以 2D 形式绘制 3D 数据。这是我正在寻找的部分内容:

Graph obtained by the following code

import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
fig = plt.figure(figsize=(10,10),facecolor='white')
axs = [fig.add_subplot(223)]
axs.append(fig.add_subplot(224))#,sharey=axs[0]))
axs.append(fig.add_subplot(221))#,sharex=axs[0]))
rng = np.random.default_rng(12345)
values = rng.random((100,3))-.5
values[:,1] = 1.6*values[:,1]
values[:,2] = .5*values[:,2]

for ax,axis in zip(axs,['y','x','z']):
    axis1,axis2={'x':(1,2),'y':(0,2),'z':(0,1)}[axis]
    ax.add_patch(plt.Circle([0,0], radius=.2, color='pink',zorder=-20))
    ax.scatter(values[:,axis1],values[:,axis2])
axs[0].set_xlabel('x')
axs[2].set_ylabel('y')
axs[1].set_xlabel('y')
axs[0].set_ylabel('z')
fig.subplots_adjust(.08,.06,.99,.99,0,0)
plt.show()

这个图和我尝试的修复存在一些问题:我需要“相等”方面,以便圆圈实际上是圆圈。我还需要每个子图中的圆圈大小相同。最后,我希望优化空间(即子图内部和子图之间的空白尽可能少)。

我尝试在子图之间共享轴,然后执行 .axis('scaled').set_aspect('equal','box',share=True) 对于每个轴,但轴最终没有被正确共享,并且每个子图中的圆圈最终大小不同。虽然它将子图裁剪为数据,但它在子图之间留下了很多空间。没有轴共享的 .axis('equal').set_aspect('equal','datalim',share=True) 会在子图中留下空白,而共享轴则在子图中留下空白轴,它遗漏了一些数据。

有什么办法可以让它发挥作用吗?如果能在matplotlib 3.4.3上运行就完美了。

最佳答案

您可以为子图使用常见的 xlimylim 并使用 ax.set_aspect(aspect='equal', adjustment=' 设置相等比例datalim'): 请参阅下面的完整代码:

import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
fig = plt.figure(figsize=(10,10),facecolor='white')

axs = [fig.add_subplot(223)]
axs.append(fig.add_subplot(224))#,sharey=axs[0]))
axs.append(fig.add_subplot(221))#,sharex=axs[0]))
rng = np.random.default_rng(12345)
values = rng.random((100,3))-.5
values[:,1] = 1.6*values[:,1]
values[:,2] = .5*values[:,2]


for ax,axis in zip(axs,['y','x','z']):
    axis1,axis2={'x':(1,2),'y':(0,2),'z':(0,1)}[axis]
    ax.add_patch(plt.Circle([0,0], radius=.2, color='pink',zorder=-20))
    ax.scatter(values[:,axis1],values[:,axis2])
    ax.set_xlim([np.amin(values),np.amax(values)])
    ax.set_ylim([np.amin(values),np.amax(values)])
    ax.set_aspect('equal', adjustable='datalim')

axs[0].set_xlabel('x')
axs[2].set_ylabel('y')
axs[1].set_xlabel('y')
axs[0].set_ylabel('z')
fig.subplots_adjust(.08,.06,.99,.99,0,0)
plt.show()

输出给出: enter image description here

关于python - Matplotlib:3D 数据的正交投影(在 2D 图中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70553682/

相关文章:

javascript - 如何获取 Canvas 上下文(2D)的当前图案对象内容?

java - LibGDX - 每当我的主角接触硬币时,IllegalArgumentException 都会导致我的游戏崩溃

python - 当组名称在多列中时,pandas 前 n 个值

python - 使用 pandas matplotlib 在 x 轴上显示文本描述而不是数字

python - 在matplotlib中动态更新多轴

android - 2d 游戏物理,做对了

python - 间歇性 Python 线程错误, "main thread is not in main loop"

python - 如何处理并发客户端请求?

python - 将 pygame 表面设置为圆角

python - 为什么 torch.from_numpy 需要不同的字节顺序而 matplotlib 不需要?