python画饼图(两种偶)

 

Pie(芒果派还是草莓派)

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pylab import mpl
import seaborn as sns
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(facecolor='snow')
sns.set_style("darkgrid", {"font.sans-serif": ['simhei', 'Droid Sans Fallback']})
font_size = 11
font_family = "SimHei"
font_weight = "bold"
plt.rc("font", size=font_size, family=font_family, weight=font_weight)

def myPie():
    data = [1249,1462,1728,1771,978]
    labels = ['2015','2016','2017','2018','2019']
    explode = [0,0,0.3,0,0]
    colors = ['red','hotpink','purple','orange','yellow']
    plt.axes(aspect="equal") #保证正圆
    plt.xlim(0,8)
    plt.ylim(0,8)

    plt.gca().spines['right'].set_color('white')
    plt.gca().spines['top'].set_color('white')
    plt.gca().spines['left'].set_color('white')
    plt.gca().spines['bottom'].set_color('white')

    # 绘制饼图
    plt.pie(x=data,  # 绘制数据
            labels=labels,  # 添加编程语言标签
            explode=explode,  # 突出显示Python
            colors=colors,  # 设置自定义填充色
            autopct='%.2f%%',  # 设置百分比的格式,保留2位小数
            pctdistance=0.8,  # 设置百分比标签和圆心的距离
            labeldistance=1.37,  # 设置标签和圆心的距离
            startangle=160,  # 设置饼图的初始角度
            center=(4, 4),  # 设置饼图的圆心(相当于X轴和Y轴的范围)
            radius=2.6,  # 设置饼图的半径(相当于X轴和Y轴的范围)
            counterclock=False,  # 是否为逆时针方向,False表示顺时针方向
            wedgeprops={'linewidth': 1, 'edgecolor': 'pink'},  # 设置饼图内外边界的属性值
            # textprops={'fontsize': 19, 'color': 'black', 'fontproperties': my_font},  # 设置文本标签的属性值
            textprops={'fontsize': 10, 'color': 'black'},  # 设置文本标签的属性值
            frame=1)  # 是否显示饼图的圆圈,1为显示

    # 不显示X轴、Y轴的刻度值
    plt.xticks(())
    plt.yticks(())
    # 添加图形标题
    # plt.title('专利分布', fontproperties=my_font)
    # plt.title('distribution of Food')
    # 显示图形
    plt.show()
    fig.savefig('res/pic/4.png')

def axPie():
    fig, ax = plt.subplots(figsize=(8, 4), subplot_kw=dict(aspect="equal"))
    recipe  = ['2015y 1249',
               '2016y 1462',
               '2017y 1728',
               '2018y 1771',
               '2019y 978']
    data = [1249,1462,1728,1771,978]

    """
    参数wedgeprops以字典形式传递,设置饼图边界的相关属性,例如圆环宽度0.5
    饼状图默认从x轴正向沿逆时针绘图,参数startangle可指定新的角(例如负40度)度起画
    """
    wedges, texts = ax.pie(data, wedgeprops=dict(width=0.5), startangle=-40)

    # 创建字典bbox_props,设置文本框的边框样式(boxstyle:方框,pad设置方框尺寸)、前景色(fc)为白色(w)、边框颜色(ec)为黑色(k)、线粗(lw)为0.72
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)

    """
    参数集kw以字典形式传递,包含一系列用于绘图标注的指定参数
    xycoords用于指定点xy的坐标环境,xycoords='data'表示沿用被注释的对象所采用的坐标系(默认设置)
    textcoords用于指定点xytext的坐标环境,textcoords='data'表示沿用被注释的对象所采用的坐标系(默认设置)
    参数arrowprops以字典形式传递,用于控制箭头的诸多属性,如箭头类型(arrowstyle)、箭头连接时的弯曲程度(connectionstyle)
    """
    kw = dict(xycoords='data', textcoords='data', arrowprops=dict(arrowstyle="-"),
              bbox=bbox_props, zorder=0, va="center")

    for i, p in enumerate(wedges):  # 遍历每一个扇形

        ang = (p.theta2 - p.theta1) / 2. + p.theta1  # 锁定扇形夹角的中间位置,对应的度数为ang

        # np.deg2rad(x)将度数x转为弧度(x*pi)/180
        y = np.sin(np.deg2rad(ang))  # np.sin()求正弦
        x = np.cos(np.deg2rad(ang))  # np.cos()求余弦

        """
        np.sign()符号函数:大于0返回1.0,小于0返回-1.0,等于0返回0.0
        参数horizontalalignment用于设置垂直对齐方式,可选参数:left、right、center
        当余弦值x大于0(即标签在饼图右侧时,按框左侧对齐)时,horizontalalignment="left"
        当余弦值x小于0(即标签在饼图左侧时,按框右侧对齐)时,horizontalalignment="right" 
        """
        horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]

        connectionstyle = "angle,angleA=0,angleB={}".format(ang)  # 参数connectionstyle用于控制箭头连接时的弯曲程度
        kw["arrowprops"].update({"connectionstyle": connectionstyle})  # 将connectionstyle更新至参数集kw的参数arrowprops中

        """
        用一个箭头/横线指向要注释的地方,再写上一段话的行为,叫做annotate
        ax.annotate()用于对已绘制的图形做标注
        recipe[i]是第i个注释文本
        size设置字体大小
        xy=(x1, y1)表示在给定的xycoords中,被注释对象的坐标点
        xytext=(x2, y2)表示在给定的textcoords中,注释文本的坐标点
        """
        ax.annotate(recipe[i], size=15, xy=(x, y), xytext=(1.35 * np.sign(x), 1.4 * y),
                    horizontalalignment=horizontalalignment, **kw)

    ax.set_title("")
    plt.show()
    fig.savefig('res/pic/3.png')



if __name__ == "__main__":
    # drawLineStyle()
    # axPie()
    myPie()

 

myPie:

 

axPie:

 

posted @ 2020-12-24 19:37  浅忆~  阅读(3760)  评论(0编辑  收藏  举报