在matplotlib 3d plot中移动spines?

jchrr9hc  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(146)

我正在尝试移动3D matplotlib axes对象中的脊椎。

这似乎是一个非常简单的问题,但我没有找到任何直接解决这个问题的问题/答案。我在这个问题的底部列出了我对这个主题的研究。

我可以在matplotlib 2D plots中设置spines的位置。下面的代码:

import matplotlib.pyplot as plt, numpy as np

fig, axes = plt.subplots(1, 2)
r, theta = 1, np.linspace(0, 2*np.pi, 100)
x, y = r*np.cos(theta), r*np.sin(theta)
for ax in axes:  # plot the same data on both axes
    ax.plot(x, y)
    ax.set_aspect("equal")
for spine in ax.spines.values():  # adjust spines on last active axis 
    spine.set_position(("data", 0))

生产:x1c 0d1x
然而,当我尝试用3D轴做同样的事情时。..

z = np.zeros(x.shape)  # exciting stuff
fig = plt.figure()
for i in range(2):  # create two 3D subplots
    ax = plt.subplot(1,2,i+1, projection="3d", aspect="equal")
    plt.plot(x, y, z)
for spine in ax.spines.values():  # adjust spines on last active axis
    spine.set_position(("data", 0))

上面的代码给我:

也就是说,没有效果,即使代码仍然运行。此外,对于3D轴,ax.spines看起来像:

OrderedDict([('left', <matplotlib.spines.Spine at 0x120857b8>),
             ('right', <matplotlib.spines.Spine at 0xfd648d0>),
             ('bottom', <matplotlib.spines.Spine at 0xe89e4e0>),
             ('top', <matplotlib.spines.Spine at 0xe89eef0>)])

我不确定“左”,“右”,“底”,“顶”在3D轴的上下文中指的是什么。我试过改变其他的属性比如棘的颜色;也没有运气。我怎样才能得到轴上的实际x,y,z脊?

研究:

  • 在stackoverflow中搜索“matplotlib spines 3d”,在撰写本文时会得到5个结果(包括这个问题)。
  • mplot3d文档根本没有提到脊柱。
  • This question显示了如何使用ax.w_xaxis.set_pane_color()设置窗格颜色,但没有类似的ax.w_zaxis.set_spine...方法。
  • 此问题说明如何使用ax.w_zaxis.line.set_color()设置书脊颜色。我想做一个可怕的变通方法来手动设置ax.w_zaxis.line.set_data,但它只有x和y数据;没有z!甚至x和y轴都没有z数据。
5ssjco0h

5ssjco0h1#

目前似乎没有明显的方法来做到这一点。未实现轴投影为3D时的脊椎设置。但是,有一个小黑客here
ax.spines设置用于2D渲染。当您在图形初始化中设置projection=3d时,某些2D属性(如ax.spines等)将被禁用。)被忽略。这就是为什么设置2D脊椎时没有任何响应的原因。
3D图形轴线(每个轴的粗黑线)位置由参数ax.xaxis._axinfo['juggled']确定(y轴和z轴也同样如此)。此选项指定将三维打印边界框的六个外部边界中的哪些绘制为粗黑线。
可以通过覆盖juggled值来移动x、y、z轴中每个轴的轴线位置,该值指定哪些轴线是主要轴线,如以下x轴示例所示,

默认设置,ax.xaxis._axinfo['juggled'] = (1,0,2)

新设置,ax.xaxis._axinfo['juggled'] = (2,0,1)所有六个外部边界的参数为

相关问题