python - 饼图的图例
问题描述
我想创建一个带有标签和值的图例。数据集包含此列
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)
运行上面的代码,我得到一个不包含任何值,而只包含标签的图例表。我希望饼图中没有任何标签或值,而仅在图例中。你能告诉我如何修复代码吗?
谢谢
解决方案
这是您期望的输出吗?我习惯使用熊猫,所以我使用的是数据框。我已经指定了在引用代码中获得的路径和标签。
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()
推荐阅读
- jakarta-ee - Web 应用程序可以在 Tomcat 10 和 Tomcat 9 中运行吗
- powerbi - 计算百分比,包括小计作为 Power BI 中的度量
- android - 由于以下错误,安装失败
- java - 没有可用类型的合格 bean - 预计至少有 1 个有资格作为自动装配候选者的 bean
- wordpress - WordPress 类别到菜单
- c++ - 如何使控制台应用程序在 C++ 中的命令后自动关闭?
- recursion - newLISP 无效函数
- recursion - Pygame 中的递归曲面
- javascript - 使用范围滑块更改 SVG 圆的半径
- python - 如何在 pandas 中对不同的数据框进行分组和聚合