我正在尝试使用正交投影以 2D 形式绘制 3D 数据。这是我正在寻找的部分内容:
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上运行就完美了。
最佳答案
您可以为子图使用常见的 xlim
、ylim
并使用 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()
关于python - Matplotlib:3D 数据的正交投影(在 2D 图中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70553682/