matplotlib饼图自定义每一个饼内显示的文本信息

有几个要点:

  1. 使用plt.pie()绘制饼图,同时需要有一个参数autopct(比如autopct='%.2f%%')这样就可以返回一个auto_texts的返回值
  2. 循环auto_texts的每个元素,是一个Text类,使用.set_text()就可以重新设置显示的数据了

示例程序

import os
import warnings

import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import font_manager as fm

warnings.filterwarnings('ignore')

plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体
plt.rcParams["axes.unicode_minus"] = False  # 正常显示负号


def plot_pie(value_series, title):
    plt.cla()
    plt.clf()
    plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体
    plt.rcParams["axes.unicode_minus"] = False  # 正常显示负号
    fig, axes = plt.subplots(figsize=(10, 7), ncols=2)  # 设置绘图区域大小
    ax1, ax2 = axes.ravel()
    patches, texts, auto_texts = ax1.pie(value_series.values, labels=value_series.index, autopct='%.2f%%',
                                         shadow=False, startangle=170, normalize=True)
    
    # ================= 核心 ! ===================
    # 这里设置每一个不同的份额显示内容
    for _auto_i, _auto_text in enumerate(auto_texts):
        _auto_text.set_text(
            f"{value_series.values[_auto_i]}/{value_series.sum()}({round(value_series.values[_auto_i] / value_series.sum() * 100, 2)}%)")

    # 调整图例
    ax1.axis('equal')
    # 重新设置字体大小
    font_prop = fm.FontProperties()
    font_prop.set_size('large')
    plt.setp(auto_texts, fontproperties=font_prop)
    plt.setp(texts, fontproperties=font_prop)
    if title:
        ax1.set_title(title, loc='center')
    # ax2 只显示图例(legend)
    ax2.axis('off')
    ax2.legend(patches, value_series.index, loc='center left')
    plt.tight_layout()
    # 保存在当前目录下
    plt.savefig(os.path.join(os.path.dirname(os.path.realpath(__file__)), f"{title}.png"),
                dpi=100, bbox_inches='tight')
    plt.show()


def main():
    series_value = pd.Series({
        "份额1": 25,
        "份额2": 25,
        "份额3": 40,
        "份额4": 100,
    })
    plot_pie(series_value, title="示例图")


if __name__ == '__main__':
    main()

原来:
在这里插入图片描述

最终效果:
在这里插入图片描述

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值