简体   繁体   English

饼图的图例

[英]Legend for a pie chart

I would like to create a legend with labels and values.我想创建一个带有标签和值的图例。 The dataset contains this column数据集包含此列

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

I am using a pie chart:我正在使用饼图:

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)

Running the above code, I get a legend table which does not contain any value, but only labels.运行上面的代码,我得到一个不包含任何值,而只包含标签的图例表。 I would like to not have any labels or values in the pie chart, but only within the legend.我希望饼图中没有任何标签或值,而仅在图例中。 Can you tell me how to fix the code?你能告诉我如何修复代码吗?

Thanks谢谢

在此处输入图像描述

Is this the output you expect?这是你期待的output吗? I'm used to using pandas, so I'm using dataframe.我习惯用pandas,所以我用的是dataframe。 I have specified the pathces and labels obtained in the referenced code.我已经指定了在引用代码中获得的路径和标签。

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

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM