Вручную добавьте легенду Элементы Python matplotlib
Я использую matlibplot, и я хотел бы вручную добавить элементы к легенде, которые являются цветом и ярлыком. Я добавляю данные к сюжету, чтобы указать, что это приведет к большому количеству дубликатов.
Я думал:
ax2.legend(self.labels,colorList[:len(self.labels)])
plt.legend()
Где self.labels - это количество элементов, которые я хочу использовать для таблиц легенд, для которых требуется подмножество большого списка цветов. Однако это ничего не дает, когда я запускаю его.
Я что-то пропустил?
благодаря
Ответы
Ответ 1
Вы проверили руководство по легенде?
Для практичности я приведу пример из руководства.
Не все ручки могут автоматически превращаться в записи легенд, поэтому часто бывает необходимо создать художника, который может. Легендарные ручки не должны существовать на рисунке или осях для использования.
Предположим, мы хотели создать легенду, в которой есть запись для некоторых данных, которые представлены красным цветом:
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
red_patch = mpatches.Patch(color='red', label='The red data')
plt.legend(handles=[red_patch])
plt.show()
редактировать
Чтобы добавить два патча, вы можете сделать это:
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
red_patch = mpatches.Patch(color='red', label='The red data')
blue_patch = mpatches.Patch(color='blue', label='The blue data')
plt.legend(handles=[red_patch, blue_patch])
Ответ 2
Я добавляю код для построения ответа на https://stackoverflow.com/users/2029132/gabra и комментарий от https://stackoverflow.com/users/5946578/brady-forcier. Здесь я вручную добавляю элементы в легенду через цикл "for".
Сначала я создаю словарь с именами легенд и желаемыми цветами. Я действительно делаю это, когда загружаю свои данные, но здесь я просто явно определяю:
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
legend_dict = { 'data1' : 'green', 'data2' : 'red', 'data3' : 'blue' }
Затем я прокручиваю словарь и для каждой записи определяю патч и добавляю к списку "patchList". Затем я использую этот список для создания моей легенды.
patchList = []
for key in legend_dict:
data_key = mpatches.Patch(color=legend_dict[key], label=key)
patchList.append(data_key)
plt.legend(handles=patchList)
plt.savefig('legend.png', bbox_inches='tight')
Здесь мой вывод:
Я не беспокоюсь о том, что записи легенды находятся в определенном порядке, но вы, вероятно,
plt.legend(handles=sorted(patchList))
Это мой первый ответ, поэтому заранее приносим извинения за ошибки /faux pas.
Ответ 3
Вот решение, которое позволит вам контролировать ширину и стиль ваших легендарных линий (среди множества других вещей).
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
colors = ['black', 'red', 'green']
lines = [Line2D([0], [0], color=c, linewidth=3, linestyle='--') for c in colors]
labels = ['black data', 'red data', 'green data']
plt.legend(lines, labels)
plt.show()
Для получения дополнительных возможностей взгляните на этот пример галереи matplotlib.
Ответ 4
В итоге я написал это:
def plot_bargraph_with_groupings(df, groupby, colourby, title, xlabel, ylabel):
"""
Plots a dataframe showing the frequency of datapoints grouped by one column and coloured by another.
df : dataframe
groupby: the column to groupby
colourby: the column to color by
title: the graph title
xlabel: the x label,
ylabel: the y label
"""
import matplotlib.patches as mpatches
# Makes a mapping from the unique colourby column items to a random color.
ind_col_map = {x:y for x, y in zip(df[colourby].unique(),
[plt.cm.Paired(np.arange(len(df[colourby].unique())))][0])}
# Find when the indicies of the soon to be bar graphs colors.
unique_comb = df[[groupby, colourby]].drop_duplicates()
name_ind_map = {x:y for x, y in zip(unique_comb[groupby], unique_comb[colourby])}
c = df[groupby].value_counts().index.map(lambda x: ind_col_map[name_ind_map[x]])
# Makes the bargraph.
ax = df[groupby].value_counts().plot(kind='bar',
figsize=FIG_SIZE,
title=title,
color=[c.values])
# Makes a legend using the ind_col_map
legend_list = []
for key in ind_col_map.keys():
legend_list.append(mpatches.Patch(color=ind_col_map[key], label=key))
# display the graph.
plt.legend(handles=legend_list)
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
Ответ 5
Для тех, кто хочет добавить элементы легенды вручную в одну/общую легенду с автоматически сгенерированными элементами:
# where some data has already been plotted to ax
handles, labels = ax.get_legend_handles_labels()
# manually define a new patch
patch = mpatches.Patch(color='grey', label='Manual Label')
# handles is a list, so append manual patch
handles.append(patch)
# plot the legend
plt.legend(handles=handles, loc='upper center')
Пример общей легенды с элементами, созданными вручную и автоматически: