Matplotlib 自定义饼图标签和阴影效果

4

我正在尝试使用Python 2.7生成Matplotlib饼图,使用的示例如此处所示。以下是我使用的代码:

import matplotlib.pyplot as plt

# The slices will be ordered and plotted counter-clockwise.
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs')

plt.pie(sizes, explode=explode, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90, radius=0.4,
        center=(0.5,0.5),
        frame=True, pctdistance=1.125)
# Set aspect ratio to be equal so that pie is drawn as a circle.
plt.axis('equal')

plt.show()

这个的输出如下所示below

有一些关于标签和阴影处理的细节需要调整,我想在这方面寻求帮助:

A. 图表中10%比例的标签与粉色楔形图相比距离很远,而45%比例的标签则比蓝色楔形图近。这似乎引发了一些疑问(12),但最新的Matploltlib版本拆分了太多的值。因此,当我使用那里的答案时:

patches, texts = plt.pie(...)

它抛出了这个错误:

ValueError: too many values to unpack

有没有一种方法可以确保所有百分比标签与其对应的楔形图块等距?

B. 投影太厚(或强烈)。我尝试使用这里path_effects参数进行自定义:

plt.pie(sizes, explode=explode, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90, radius=0.4,
        center=(0.5,0.5),
        frame=True, pctdistance=1.125,
        path_effects=[path_effects.SimpleLineShadow(),
        path_effects.Normal()])

然而,我遇到了一个错误:
 TypeError: pie() got an unexpected keyword argument 'path_effects'

这里似乎有一个类似的问题(链接),但是没有答案。是否有一种方法可以手动减少投影的厚度?

C. 我已经指定了一个字典,用于饼图百分比标签所使用的字体

labelfont = {'fontname':'Times New Roman', 'size':'14', 'color':'black', 'weight':'bold'}

例如,如果我想在散点图的x轴标签上使用它,我一直在使用以下内容:
plt.xlabel('My_label',**labelfont)

我正在尝试类似的事情来处理饼图百分比标签,如何指定这个字体用于百分比?


我建议你如果有多个问题,请提出多个问题。 - Lucas
1个回答

2

A:

根据mpl pie文档:

如果autopct不是None,则返回元组(patches, texts, autotexts),其中patches和texts与上文相同,而autotexts是数字标签的Text实例列表。

需要拆分出一个额外的值。因此,您需要更改该行:

patches, texts = plt.pie(...)

对于

patches, texts, autotexts = plt.pie(...)

B:

plt.pie错误所述,不存在path_effects参数。您可以循环处理补丁并设置自定义阴影:

for patch in patches:
    patch.set_path_effects([path_effects.SimpleLineShadow(),
        path_effects.Normal()])

C:

你可以使用plt.rc来实现。


谢谢。对于C语言,我正在考虑使用pl.rcParams.update({'legend.font':labelfont})。但是,我应该使用什么代替legend?也就是说,这些百分比标签叫什么? - edesz
对于A.,我试过了。我使用了 for label in autotexts: label.set_horizontalalignment('center'); label.set_verticalalalignment('center')。这使我能够水平和垂直移动楔形图标签。然而,最顶部的楔形图标签(10.0%)与其他标签相比仍然漂浮得太远了。是否有其他方法可以减少这种分离? - edesz
1
对于A:你可以使用label.set_position((x, y)),但这似乎不是一个好的解决方案。你也可以增加半径! - Lucas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接