我有一个使用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)
最后一行是我认为可行的,但显然不起作用。
我使用ax.legend(loc=(0.15,0.65),frameon=0)
通过反复试验达到了该位置,因为图例在轴旋转时不会移动。问题在于我会做几个图,因此我试图避免试错法。
感谢。
答案 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()