Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在三维轴matplotlib中指定三维位置的图例_Python_Matplotlib_Legend - Fatal编程技术网

Python 在三维轴matplotlib中指定三维位置的图例

Python 在三维轴matplotlib中指定三维位置的图例,python,matplotlib,legend,Python,Matplotlib,Legend,我有一个使用matplotlib的三维散点图 我想做的是把传说放在情节里。我已经阅读了,似乎只能选择预定义的位置或仅指定x和y坐标 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(-

我有一个使用matplotlib的三维散点图

我想做的是把传说放在情节里。我已经阅读了,似乎只能选择预定义的位置或仅指定x和y坐标

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()
有没有办法定位图例,指定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)通过反复试验达到了这个位置,因为轴旋转时,图例不会移动。问题是,我将做几个情节,因此我试图避免尝试和错误的方法


谢谢。

要使用数据坐标将图例放置在三维绘图中,首先可以使用

mpl_toolkits.mplot3d.proj3d.proj_transform(x,y,z, ax.get_proj())
并将它们提供给图例的
bbox\u to\u anchor
参数。然后将
bbox\u变换
更改为数据坐标系,生成所需的绘图

下面将图例的左下角放置在数据坐标中的位置
(701000,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()

无法在三维坐标中定位图例。既然图例是一个2D对象,那么想要得到什么结果呢?谢谢。理想的结果是,使用轴坐标系,选择轴内图例框的位置。目前,将图例框放置在轴内的唯一方法是使用选项
center
及其变体作为
loc
参数的值。但在我的情况下,这并不是我试图放置图例的地方。我认为使用可能是一个选项,但对于这样一个简单的任务来说似乎需要很多工作。预期的结果是什么?为什么
ax.legend(loc=(0.5,0.5),frameon=0)
不能完全满足您的要求?