matplotlib:添加引导线及多组数据直方图

概述

由于饼图/圆环图的饼块大小和饼块背景色影响,直接在饼块上添加注释或标签效果并不好,往往需要在饼块外添加标签,并在标签与饼块之间添加引导线。matplotlib没有提供直接绘制引导线的接口,需要自己定义。

添加引导线的思路如下:

  1. 计算饼块的角度。
  2. 计算注释标签的坐标。
  3. 判断饼块位于圆环的左侧或右侧,确定标签文本的对齐方式。
  4. 确定引导线的连接样式,使引导线从饼块指向注释标签。
  5. 使用annotate函数绘制注释标签和引导线。

一、绘制圆环图的引导线

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = ["simhei"]

data = {"机械": 120, "电子": 90, "计算机": 50, "经管": 60, "建筑": 100, "汽车": 50}
# 构造数据
data = pd.DataFrame([data])
# 绘制圆环图,并返回饼块对象
wedges, texts = plt.pie(data.iloc[0], wedgeprops={"width": 0.5})
# 构造annotate函数的**kwargs参数,设置引导线线型
kw = dict(arrowprops=dict(arrowstyle="-"), zorder=0, va="center")
# 遍历饼块绘制注释标签和引导线
for i, p in enumerate(wedges):
    # 根据matplotlib.patches.Wedge对象的theta1和theta2参数计算饼块均分点的角度
    ang = (p.theta2 - p.theta1) / 2.0 + p.theta1
    # 根据角度的弧度计算 饼块均分点的坐标(引导线的起点)
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    # print(p.theta1, p.theta2, ang, np.deg2rad(ang), x, y)
    # 演示引导线起点位置
    # plt.plot(x, y, "or")
    # 根据x的值即角度所在象限确定引导线的对齐方式
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    # 设置引导线的连接方式
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    # 绘制注释标签和引导线
    plt.annotate(
        data.columns[i],
        xy=(x, y),
        xytext=(1.35 * np.sign(x), 1.4 * y),
        horizontalalignment=horizontalalignment,
        **kw
    )

plt.title("专业人数占比")
plt.show()

matplotlib_文字注释 plt.text();plt.annotate()

二、多组数据直方图

data = np.random.randn(1000,2)
 
plt.hist(x = data,            # 绘图数据
        bins = 20,            # 指定直方图的条形数为20个
        edgecolor = 'w',      # 指定直方图的边框色
        color = ['c','r'],    # 指定直方图的填充色
        label = ['第一组','第二组'],     # 为直方图呈现图例
        density = False,      # 是否将纵轴设置为密度,即频率
        alpha = 0.6,          # 透明度
        rwidth = 1,           # 直方图宽度百分比:0-1
        stacked = False)      # 当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放
 
ax = plt.gca()                # 获取当前子图
ax.spines['right'].set_color('none')  # 右边框设置无色
ax.spines['top'].set_color('none')    # 上边框设置无色
# 显示图例
plt.legend()
# 显示图形
plt.show()

三、参考 

matplotlib_文字注释 plt.text();plt.annotate()

为饼图或圆环图添加引导线_mighty13的博-CSDN博客

你可能感兴趣的:(#,matplotlib系列,matplotlib)