Вручную добавить легенду Предметы Python matplotlib

Я использую matlibplot, и я хотел бы вручную добавить в легенду элементы цвета и метки. Я добавляю данные к сюжету, чтобы указание там привело к большому количеству дубликатов.

Моя мысль должна была сделать:

    ax2.legend(self.labels,colorList[:len(self.labels)])
    plt.legend()

Где self.labels - это количество элементов, для которых я хочу использовать ярлыки легенд, которые занимают подмножество в большом списке цветов. Однако это ничего не дает, когда я запускаю его.

Я что-то пропустил?

Спасибо

6 ответов

Вы проверили руководство легенды?

Для практичности приведу пример из руководства.

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

Предположим, мы хотели создать легенду, в которой есть запись для некоторых данных, которая представлена ​​красным цветом:

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])

введите описание изображения здесь

Для тех, кто хочет добавить элементы легенды вручную в единую / общую легенду с автоматически созданными элементами:

# 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')

Пример общей легенды с элементами, созданными вручную и автоматически:

Вот решение, которое позволяет вам контролировать ширину и стиль линий легенды (среди множества других вещей).

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.

Я добавляю некоторый код для построения ответа на gabra и комментарий на 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))

Это мой первый ответ, поэтому заранее извиняюсь за любые ошибки / ошибки.

Я закончил писать это:

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)

Самый простой способ - просто принудительно установить метки, если они нужны:

      # add the following line after the code that plots your graph

plt.legend(['Name1', 'Name2'])

Пример:

       axes[ax] = sns.lineplot(x='days', y='value', data=dataset, palette = 'coolwarm', lw=5)
        axes[ax].set_title('Value Across Days')
        axes[ax].set_xlabel('Days')
        axes[ax].set_ylabel('Value')
        axes[ax].legend(['Measurement1', 'Measurement2'], loc='best')

Результат:

Другие вопросы по тегам