有很多方法可以做到这一点,但在这种情况下使用代理艺术家可能是最简单的。您可以使用任意文本作为标记,因此很容易伪造Line2D 的显示标签而不是线条。
作为一个例子(其中大部分是对annotate 的相对“花哨”的调用):
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
def main():
labels = ['A', 'B', 'C']
positions = [(2, 5), (1, 1), (4, 8)]
descriptions = ['Happy Cow', 'Sad Horse', 'Drooling Dog']
# Plot the data, similar to what you described...
fig, ax = plt.subplots()
ax.imshow(np.random.random((10, 10)), interpolation='none')
for label, xy in zip(labels, positions):
ax.annotate(label, xy, xytext=(20, 20), size=15,
textcoords='offset points',
bbox={'facecolor':'white'},
arrowprops={'arrowstyle':'->'})
# Create a legend with only labels
proxies = [create_proxy(item) for item in labels]
ax.legend(proxies, descriptions, numpoints=1, markerscale=2)
plt.show()
def create_proxy(label):
line = matplotlib.lines.Line2D([0], [0], linestyle='none', mfc='black',
mec='none', marker=r'$\mathregular{{{}}}$'.format(label))
return line
main()