在matplotlib 3d plot中移动刺?

时间:2018-01-25 12:18:47

标签: python matplotlib plot 3d

我正在尝试在3D matplotlib轴对象中移动刺。

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

我可以在matplotlib 2D图中设置刺的位置。以下代码:

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

生产: super sick 2d plots

然而,当我用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))

上面的代码告诉我:

really lame 3d plots

即。没有效果,即使代码仍然运行。此外,对于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...方法。
  • This question显示了如何使用ax.w_zaxis.line.set_color()设置主干颜色。我想过制作一个可怕的解决方法来手动设置ax.w_zaxis.line.set_data,但它只有x和y数据;没有z!即使x轴和y轴也没有z数据。

1 个答案:

答案 0 :(得分:5)

目前似乎没有明显的方法可以做到这一点。未实现轴投影为3D时设置刺。但是,有一个小的黑客here

ax.spines设置用于2D渲染。在图的初始化中设置projection=3d时,将忽略某些2D属性(如ax.spines等)。这就是为什么在设置2D刺时没有得到任何响应的原因。

3D图形轴线(每个轴的粗黑线)位置由参数ax.xaxis._axinfo['juggled']确定(对于y轴和z轴也类似)。这指定3D绘图边界框的六个外边界中的哪一个被绘制为粗黑线。

您可以通过覆盖juggled值来移动x,y,z轴每个轴线的位置,该值指定哪些轴线是主轴线,如下面的x轴示例, enter image description here 默认设置ax.xaxis._axinfo['juggled'] = (1,0,2) enter image description here 新设置,ax.xaxis._axinfo['juggled'] = (2,0,1) 所有六个外边界的参数是, enter image description here