我使用Matplotlib基本上绘制了一张'图片,而不是用于绘制数据。
在'图片中'我使用plt.annotate
标记图片的某些部分。
我现在想制作一个完全自定义的图例来表示符号的含义。
有没有办法定义自定义handles
和labels
,其中handles
必须是字母数字字母而不是'*'
或'o'
等常规标记
这是可能的,还是我必须使用plt.annotation
手动构建图例?
答案 0 :(得分:13)
有很多方法可以做到,但在这种情况下使用代理艺术家可能最容易。您可以使用任意文本作为标记,因此使用假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()
答案 1 :(得分:1)
在大多数情况下,您可能还希望在自定义图例中使用颜色说明图形上的元素。在这种情况下,我只使用matplotlib自己的函数,而不需要编写自己的复杂函数。
import matplotlib
red_line = matplotlib.lines.Line2D([], [], color='red',markersize=100, label='Blue line')
blue_line = matplotlib.lines.Line2D([], [], color='blue', markersize=100, label='Green line')
purple_line = matplotlib.lines.Line2D([], [], color='purple', markersize=100, label='Green line')
handles = [blue_line,red_line, purple_line]
labels = [h.get_label() for h in handles]
ax.legend(handles=handles, labels=labels)
plt.show()