У меня есть диаграмма рассеяния с несколькими точками, иногда перекрывающимися, поэтому для каждой точки есть аннотация с парящим квадратом (для ее создания использовалось решение ).Чтобы справиться с несколькими точками и иногда длинными описаниями, в аннотации есть разрыв строки.Проблема в том, что с несколькими строками поле аннотации растет, а не вниз, заставляя его выходить за пределы оси, как показано ниже.Есть ли способ, чтобы текст начинался со строки прямо под осью, а затем встраивался в график?
Соответствующий код:
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
x = np.random.rand(15)
y = np.random.rand(15)
names = np.array(list("ABCDEFGHIJKLMNO"))
c = np.random.randint(1,5,size=15)
norm = plt.Normalize(1,4)
cmap = plt.cm.RdYlGn
fig,ax = plt.subplots()
sc = plt.scatter(x,y,c=c, s=100, cmap=cmap, norm=norm)
annot = ax.annotate("", xy=(0.05, 0.95), xycoords='axes fraction',
bbox=dict(boxstyle="round", fc="w"),
zorder=1000)
annot.set_visible(False)
def update_annot(ind):
pos = sc.get_offsets()[ind["ind"][0]]
annot.xy = pos
text = "{}".format("\n".join([f"{n}: {names[n]}" for n in ind["ind"]]))
annot.set_text(text)
annot.get_bbox_patch().set_facecolor(cmap(norm(c[ind["ind"][0]])))
annot.get_bbox_patch().set_alpha(0.4)
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = sc.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
Как это выглядит с однострочным текстом в аннотации

Как это выглядит с двухстрочным текстом в аннотации (точка наведения перекрывает две точки).В идеале было бы 0: A
, где 8: I
, тогда 8: I
под ним
