Как аннотировать 3D-график на Matplotlib? - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь аннотировать текст слова на своей трехмерной диаграмме, я знаю, что ax.text может отображать текст на моем трехмерном графике, однако plt.annotate справляется с этим лучше, поскольку он направляет текст на координата, которая мне нужна. Есть ли способ использовать plt.annotate для построения трехмерной диаграммы? Знаю только, что на 2д работает. Сообщите мне решение.

plt.annotate(s='pppppp', xy=(1.5,0), xytext=(1.5,0)) //doesnt work on 3d
ax.text(1.5,0,0,'pppppp')

1 Ответ

1 голос
/ 19 июня 2020

Если вы посмотрите исходный код: 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...