饼图的图例

Legend for a pie chart

我想创建一个带有标签和值的图例。 数据集包含此列

ID          LETTER
    2        C
    26       C
    40       C
    63       D
    83       E
    139      C
    141      E
    145      C
    148      E
    156      E

我正在使用饼图:

from itertools import chain
from collections import Counter
import matplotlib.pyplot as plt

plt.figure(figsize=(16,8))

cts = Counter(chain.from_iterable(df.LETTER.str.split('|').values))
_ = plt.pie(cts.values(), labels=cts.keys(), autopct='%1.1f%%')

patches = cts.values()
labels = cts.keys()

sort_legend = True
if sort_legend:
   patches,labels, dummy =  zip(*sorted(zip(patches, labels, df.LETTER),
                                          key=lambda x: x[2],
                                          reverse=True))
    
plt.legend(cts.values(), labels=cts.keys(), loc='center left', bbox_to_anchor=(-0.1, 1.),
           fontsize=8)

运行 上面的代码,我得到一个图例 table,它不包含任何值,只包含标签。我不想在饼图中有任何标签或值,而只在图例中。 你能告诉我如何修复代码吗?

谢谢

这是您期望的输出吗?我习惯用pandas,所以我用的是dataframe。我在参考代码中指定了获取的路径和标签。

import pandas as pd
import numpy as np
import io

data = '''
ID          LETTER
    2        C
    26       C
    40       C
    63       O
    83       N
    139      C
    141      O
    145      C
    148      N
    156      N
'''

df = pd.read_csv(io.StringIO(data), delim_whitespace=True)


from itertools import chain
from collections import Counter
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4,3),dpi=144)
ax = fig.add_subplot(111)

cts = df.LETTER.value_counts().to_frame()
percent = 100.*cts.LETTER / cts.LETTER.sum()
ax.pie(cts.LETTER)

patches = cts.index
labels = ['{0} - {1:1.2f} %'.format(i,j) for i,j in zip(cts.index, percent)]

sort_legend = True
if sort_legend:
    patches,labels, dummy =  zip(*sorted(zip(patches, labels, df.LETTER),
                                          key=lambda x: x[2],
                                          reverse=True))

plt.legend(patches, labels=labels, loc='center left', bbox_to_anchor=(-0.1, 1.), fontsize=8)
plt.show()