如何断行 ax.legend

How to break line ax.legend

我想更改图表的图例,我想在图表图例的每个标签后添加一个换行符。我有两个字典,一个有值,一个有与标签关联的颜色,我无法与之交互。

dico_valeur = {'A': [5, 2, 2, 6, 2, 0, 0, 1],
 'B': [6, 5, 0, 0, 0, 0, 1, 0],
 'C': [6, 22, 2, 5, 3, 1, 2, 1],
 'D': [13, 3, 2, 1, 3, 0, 0, 0],
 'E': [14, 6, 12, 1, 4, 2, 2, 0],
 'F': [3, 3, 0, 0, 0, 1, 0, 0],
 'G': [6, 11, 3, 6, 1, 0, 1, 1],
 'H': [3, 2, 2, 1, 3, 0, 0, 1],
 'I': [2, 0, 0, 0, 0, 1, 0, 0],
 'J': [6, 10, 1, 5, 3, 1, 0, 0],
 'K': [2, 4, 1, 1, 0, 0, 0, 0],
 'L': [1, 0, 0, 0, 0, 0, 0, 0],
 'M': [1, 0, 0, 0, 0, 0, 0, 0],
 'N': [10, 7, 2, 3, 3, 3, 0, 0]}

dico_couleur = {"a very very very very very very very very very very very very very very very very very very very very long legend": 'C0',
 'another very very very very very very very very very very very very very very very very very very very very long legend, démarreur,…': 'C1',
 'a very very very very very very very very very very very very very very very very very long legend': 'C2',
 "a very very very very very very very very very very very very very very very vry very very very long legend": 'C3',
 'a very very very very very veryy very very very very very very long legend': 'C4',
 'a very very very very very very very very very very very very very very very very very very very very long legend': 'C5',
 "a very very very very very very very very very very very very very very very very very very long legend": 'C6',
 'a very very very very very very very very veryery very very very very very very very very long legend': 'C7'}

for i in dico_couleur: category_names.append(i)
results = dico_valeur
labels = list(results.keys())
data = np.array(list(results.values()))
data_cum = data.cumsum(axis=1)
category_colors = list(dico_couleur.values())

fig, ax = plt.subplots(figsize=(15, 7))
ax.invert_yaxis()
ax.xaxis.set_visible(False)
ax.set_xlim(0, np.sum(data, axis=1).max())

for i, (colname, color) in enumerate(zip(category_names, category_colors)):
    widths = data[:, i]
    starts = data_cum[:, i] - widths
    ax.barh(labels, widths, left=starts, height=0.5,
            label=colname, color=color)
    xcenters = starts + widths / 2


    for y, (x, c) in enumerate(zip(xcenters, widths)):
        if c != 0:
            ax.text(x, y, str(int(c)), ha='center', va='center',
                        color=text_color)
ax.legend(ncol=len(category_names), bbox_to_anchor=(1, 0, 0.5, 1),
          loc='lower left', fontsize='small')

plt.show()  

结果如下图,但是我还没有找到在每个之后换行的方法category_names enter image description here

谢谢

发生这种情况是因为您在调用 ax.legend() 时指定了 ncol 参数。这是图例将显示的列数。您将其设置为 category_names 变量的长度,在您的示例中为 7。因此,图例显示七列,每个标签之间没有换行符。

要解决此问题,只需从您的函数调用中删除此参数即可。它默认为 1,因此将为您提供下面的图。

ax.legend(bbox_to_anchor=(1, 0, 0.5, 1), loc='lower left', fontsize='small')