Если вы посмотрите исходный код: https://matplotlib.org/3.1.1/_modules/mpl_toolkits/mplot3d/axes3d.html#Axes3D и https://matplotlib.org/_modules/matplotlib/axes/_axes.html#Axes, вы увидите, что не существует метода ax.annotate()
для трехмерных графиков. Следовательно, ax.annotate()
get вызывается как метод Axes
. Следовательно, он не имеет соответствующих преобразований для 3D-графиков. Один из способов обойти это - следовать инструкциям в этом сообщении. Matplotlib: аннотирование трехмерной диаграммы рассеяния .
Следует примеру с использованием решений публикации:
from mpl_toolkits.mplot3d.proj3d import proj_transform
from matplotlib.text import Annotation
import matplotlib as mpl
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(projection="3d")
class Annotation3D(Annotation):
'''Annotate the point xyz with text s'''
def __init__(self, s, xyz, *args, **kwargs):
Annotation.__init__(self,s, xy=(0,0), *args, **kwargs)
self._verts3d = xyz
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.xy=(xs,ys)
Annotation.draw(self, renderer)
def annotate3D(ax, s, *args, **kwargs):
'''add anotation text s to to Axes3d ax'''
tag = Annotation3D(s, *args, **kwargs)
ax.add_artist(tag)
return tag
annotate3D(ax, "HEllo world", [1, 1, 1])
plt.show()