matplotlib 3D散点未正确放置

8gsdolmq  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(120)

我试图做一些简单的3D图,但散点似乎没有与轴正确对齐。此图应具有与x=1、y=1、z=1对齐的点。使用tkinter后端也会出现此问题。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.array([-1, -0.5, 0, 0.5, 1]) 
y = np.array([-1, -0.5, 0, 0.5, 1]) 
z = np.array([-1, -0.5, 0, 0.5, 1]) 

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

xyz = np.meshgrid(x,y,z)
ax.scatter(xyz[0], xyz[1], xyz[2], marker='.')

plt.show()

下面的链接似乎松散相关,但我无法把一个具体的解决方案。
https://github.com/matplotlib/matplotlib/issues/11836
https://github.com/matplotlib/matplotlib/issues/1077/
Python 3.11.1、Matplotlib 3.7.1、Windows 10

ctzwtxfj

ctzwtxfj1#

正如@jared在评论中指出的,点按预期对齐。你可以通过旋转图表来看到它。下面是另一个视图,使用您提供的代码的复制粘贴,在旋转图形以面向其中一个轴之后:

6l7fqoea

6l7fqoea2#

你所看到的不是错位,而是以2D形式查看3D信息的结果,即这是由投影引起的。一般来说,我不建议显示静态3D散点图;或者将它们作为交互式媒体共享,或者创建图形旋转的动画(例如由@matleg共享的this link)。
注意:Matplotlib中还有其他投影选项,如here文档所示,但它们无法解决此问题。正交本质上是使用平行的视觉线,而默认的(透视)更真实地反映了我们实际上是如何看待事物的。下图显示了使用这两个投影选项时示例的不同之处。

import numpy as np
import matplotlib.pyplot as plt

plt.close("all")

x = np.array([-1, -0.5, 0, 0.5, 1]) 
y = np.array([-1, -0.5, 0, 0.5, 1]) 
z = np.array([-1, -0.5, 0, 0.5, 1]) 
X, Y, Z = np.meshgrid(x,y,z)

fig, (ax1, ax2) = plt.subplots(1, 2, subplot_kw={"projection":"3d"})
ax1.scatter(X, Y, Z, marker='.')
ax1.view_init(elev=0, azim=0, roll=0)
ax1.set_title("Default")
ax2.scatter(X, Y, Z, marker='.')
ax2.view_init(elev=0, azim=0, roll=0)
ax2.set_proj_type("ortho")
ax2.set_title("Orthogonal")
fig.show()

zphenhs4

zphenhs43#

可以移除每个轴开始处的小偏移,这可以改善对准的外观。
参见Correctly setting the axes limits in 3d plots

相关问题