在3D轴matplotlib中指定3d位置的图例

时间:2018-01-25 12:21:45

标签: python matplotlib legend

我有一个使用matplotlib的散点图。

我想要做的是将图例放在图中。我已阅读documentation,似乎只能选择预定义位置或仅指定x和y坐标。

有没有办法定位指定3个坐标的图例?

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#more code
ax.legend(loc=(0.5,0.5,0.5), frameon=0)

最后一行是我认为可行的,但显然不起作用。

这就是我现在所做的: This is what I have now

我试图将图例放在轴内,有点像: The sought outcome

我使用ax.legend(loc=(0.15,0.65),frameon=0)通过反复试验达到了该位置,因为图例在轴旋转时不会移动。问题在于我会做几个图,因此我试图避免试错法。

感谢。

1 个答案:

答案 0 :(得分:0)

要使用数据坐标将图例放置在3D图中,可以先使用

获取3D空间中点的投影坐标。
mpl_toolkits.mplot3d.proj3d.proj_transform(x,y,z, ax.get_proj())

并将其提供给图例的bbox_to_anchor参数。将bbox_transform更改为数据坐标系会产生所需的图。

以下将图例的左下角放在数据坐标中的(70,1000,80)位置。

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

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

theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = 25 * r * np.sin(theta)
y = 350* r * np.cos(theta)
ax.plot(x, y, 70*z, label='parametric curve')
ax.plot(x*.6, y*0.5, 70*z, label='parametric curve 2')

f = lambda x,y,z: proj3d.proj_transform(x,y,z, ax.get_proj())[:2]
ax.legend(loc="lower left", bbox_to_anchor=f(70,1000,80), 
          bbox_transform=ax.transData)

plt.show()

enter image description here