【问题标题】:Matplotlib customize pie chart labels and dropshadowMatplotlib 自定义饼图标签和阴影
【发布时间】:2017-01-13 19:30:35
【问题描述】:

我正在尝试使用here 显示的示例在 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()

这个的输出如下所示

我正在尝试调整一些与标签和阴影相关的绘图格式,并希望获得一些帮助:

A.10% 分数的标签离粉红色楔形比标签 45% 离蓝色楔形更远。似乎对此存在疑问(1,2),但最新的 Matploltlib 有太多值需要解压。所以,当我从那里使用答案时:

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

它会抛出这个错误:

ValueError: too many values to unpack

有没有办法确保所有百分比标签与其对应的楔形距离相等?

B.投影太厚(或强)。我尝试使用来自herepath_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'

似乎有一个类似的问题here,但没有答案。有没有办法手动减少阴影的厚度?

C.我已经指定了一个带有我想用于饼图百分比标签的字体的字典

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

例如,如果我想在散点图的 x 轴标签上使用它,我一直在使用它:

plt.xlabel('My_label',**labelfont)

我正在尝试为饼图百分比标签做类似的事情。如何指定该字体应用于百分比?

【问题讨论】:

  • 如果你问几个问题,我建议你问几个问题。

标签: python matplotlib pie-chart labels dropshadow


【解决方案1】:

答:

来自mpl pie 文档:

如果 autopct 不是 None,则返回元组(补丁、文本、自动文本),其中补丁和文本同上,而 autotexts 是数字标签的 Text 实例列表。

您需要再解压一个值。所以你需要改变那行:

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

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

乙:

正如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?即这些百分比标签叫什么?
  • 对于 A.,我试过了。我用for label in autotexts: label.set_horizontalalignment('center'); label.set_verticalalalignment('center')。这使我可以水平和垂直移动楔形标签。但是,与其他楔形标签相比,最顶部的楔形标签 (10.0%) 仍然离楔形太远。有没有其他方法可以减少这种分离?
  • 对于 A:您可以使用 label.set_position((x, y)) ,但这似乎不是一个好的解决方案。你也可以增加半径!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多