圆环图本质上是一个中间切出一块区域的饼状图。可以使用python和matplotlib库来实现。本文主要介绍基于matplotlib实现圆环图。本文所有代码见:Python-Study-Notes

# 去掉警告
import warnings
warnings.filterwarnings("ignore")
# 多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

1 基础圆环图绘制 Basic donut plot

下面是使用matplotlib库制作的基本圆环图的实例。这里的诀窍是做一个饼图,在中间加一个白色的圆圈。注意另一个选择是使用半径radius和宽度width参数。

首先创建一个饼图,如下所示

# library
import matplotlib.pyplot as plt # ----- 步骤一 # create data
# 创建数据
size_of_groups=[12,11,3,30] # 设置等比例轴,x和y轴等比例
plt.axis('equal')
# Create a pieplot
# 创建饼图
plt.pie(size_of_groups);
plt.show();

然后在饼图中间添加一个白色的圆,就能够得到圆环图

# library
import matplotlib.pyplot as plt # ----- 步骤一 # create data
# 创建数据
size_of_groups=[12,11,3,30] # Create a pieplot
# 创建饼图
plt.pie(size_of_groups)
#plt.show() # ----- 步骤二 # add a circle at the center
# 添加一个圆
my_circle=plt.Circle( (0,0), 0.7, color='white')
# 获得当前显示的图表,也就是前面画的饼图
p=plt.gcf()
# 将两图相加
p.gca().add_artist(my_circle) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

上面创建饼图的方式太麻烦,事实上matplotlib可以直接设定pie中wedgeprops参数来实现饼图绘制,wedgeprops中通过width参数设定内部圆的半径,edgecolor设置内部圆的颜色。

# library
import matplotlib.pyplot as plt # create data
# 创建数据
size_of_groups=[12,11,3,30] # Create a pieplot
# 创建饼图
plt.pie(size_of_groups,wedgeprops=dict(width=0.3, edgecolor='w')) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

2 自定义圆环图 Custom matplotlib donut plot

本节旨在描述如何自定义圆环图,包括自定义颜色,标签,这些操作都是通用的。

2.1 自定义颜色

通过设置饼图的颜色便能够实现圆环图的颜色自定义

以下示例设置不同类别的不同颜色来展示圆环图

# library
import matplotlib.pyplot as plt # create data
# 创建数据
names='groupA', 'groupB', 'groupC', 'groupD',
size=[12,11,3,30] # Give color names
# 画饼图,label设置标签名,colors代表颜色
plt.pie(size, labels=names, colors=['red','green','blue','skyblue'],wedgeprops=dict(width=0.3, edgecolor='w')) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

以下示例设置循环使用颜色来展示圆环图

# library
import matplotlib.pyplot as plt # create data
# 创建数据
names='groupA', 'groupB', 'groupC', 'groupD',
size=[12,11,3,30] # Create a circle for the center of the plot
# 创建中间白色圆
my_circle=plt.Circle( (0,0), 0.7, color='white') # Custom colors --> colors will cycle
# 自定义颜色,如果颜色长度和数据长度不一致,则会循环使用颜色,即'red','green','red','green'
# 但是这种方法必须通过创建中间白色圆实现
plt.pie(size, labels=names, colors=['red','green'])
p=plt.gcf() # 设置等比例轴,x和y轴等比例
plt.axis('equal')
p.gca().add_artist(my_circle)
plt.show();

以下示例展示通过Palettable utility库来设置颜色, Palettable utility库说明见palettable

通过以下命令安装palettable

pip install palettable

# library
import matplotlib.pyplot as plt # create data
# 创建数据
names='groupA', 'groupB', 'groupC', 'groupD',
size=[12,11,3,30] from palettable.colorbrewer.qualitative import Pastel1_7
plt.pie(size, labels=names, colors=Pastel1_7.hex_colors,wedgeprops=dict(width=0.3, edgecolor='w')) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

2.2 自定义标签

以下示例展示自定义标签的位置

# library
import matplotlib.pyplot as plt # create data
# 创建数据
names='groupA', 'groupB', 'groupC', 'groupD',
size=[12,11,3,30] # Label distance: gives the space between labels and the center of the pie
# labeldistance给出标签和饼图中心之间的间距
plt.pie(size, labels=names, labeldistance=0.85,wedgeprops=dict(width=0.3, edgecolor='w')) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

以下示例展示自定义标签的颜色

# library
import matplotlib.pyplot as plt # create data
# 创建数据
names='groupA', 'groupB', 'groupC', 'groupD',
size=[12,11,3,30] # Label color
# 标签颜色
plt.rcParams['text.color'] = 'red'
plt.pie(size, labels=names,wedgeprops=dict(width=0.3, edgecolor='w')) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

对于各个类别边缘大小和颜色可以设置饼图的wedgeprops参数来实现

# library
import matplotlib.pyplot as plt # create data
# 创建数据
names='groupA', 'groupB', 'groupC', 'groupD',
size=[12,11,3,30] # Custom wedges
# wedgeprops设置各个类别边缘宽度和颜色
plt.pie(size, labels=names, wedgeprops = { 'linewidth' : 7, 'edgecolor' : 'white','width':0.3, 'edgecolor':'w' }) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

2.4 自定义背景颜色

以下示例展示了如何改变背景颜色

# library
import matplotlib.pyplot as plt # Data
names='groupA', 'groupB', 'groupC', 'groupD',
size=[12,11,3,30] # create a figure and set different background
fig = plt.figure()
# 设置背景颜色
fig.patch.set_facecolor('black') # Change color of text
plt.rcParams['text.color'] = 'white' # Pieplot + circle on it
plt.pie(size, labels=names,wedgeprops=dict(width=0.3, edgecolor='w')) # 设置等比例轴,x和y轴等比例
plt.axis('equal')
plt.show();

2.5 自定义标记

以下示例显示引出标记,来自定义圆环图

# Libraries
import matplotlib.pyplot as plt
import numpy as np fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal")) # 类别名
recipe = ["225 g flour",
"90 g sugar",
"1 egg",
"60 g butter",
"100 ml milk",
"1/2 package of yeast"] data = [225, 90, 50, 60, 100, 5] # startangle 设置方向
wedges, texts = ax.pie(data, wedgeprops=dict(width=0.5), startangle=-40) # 每一类别说明框
# boxstyle框的类型,fc填充颜色,ec边框颜色,lw边框宽度
bbox_props = dict(boxstyle="square,pad=0.3", fc='white', ec="black", lw=0.72)
# 设置框引出方式
kw = dict(arrowprops=dict(arrowstyle="-"),
bbox=bbox_props, zorder=0, va="center") # 添加标签
for i, p in enumerate(wedges):
ang = (p.theta2 - p.theta1)/2. + p.theta1
y = np.sin(np.deg2rad(ang))
x = np.cos(np.deg2rad(ang))
# 设置方向
horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
connectionstyle = "angle,angleA=0,angleB={}".format(ang)
kw["arrowprops"].update({"connectionstyle": connectionstyle})
# 设置标注
ax.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
horizontalalignment=horizontalalignment,color='black', **kw) ax.set_title("Matplotlib bakery: A donut") plt.show();

3 多层级圆环图 Donut plot with subgroups

以下示例展示了具有三个类别,每个类别具有多个子类别的圆环图。你可以使用半径和宽度选项来设置2个圆级别的位置。然后,为每个组指定一个调色板。

首先绘制外圈图形,注意该实例通过setp函数实现在内部添加圆

# Libraries
import matplotlib.pyplot as plt # Make data: I have 3 groups and 7 subgroups
# 设置数据
group_names=['groupA', 'groupB', 'groupC']
group_size=[12,11,30]
subgroup_names=['A.1', 'A.2', 'A.3', 'B.1', 'B.2', 'C.1', 'C.2', 'C.3', 'C.4', 'C.5']
subgroup_size=[4,3,5,6,5,10,5,5,4,6] # Create colors
# 设置颜色
a, b, c=[plt.cm.Blues, plt.cm.Reds, plt.cm.Greens] # First Ring (outside)
# 外圈
fig, ax = plt.subplots()
# 设置等比例轴,x和y轴等比例
ax.axis('equal')
# 画饼图
mypie, _ = ax.pie(group_size, radius=1.3, labels=group_names, colors=[a(0.6), b(0.6), c(0.6)],wedgeprops=dict(width=0.3, edgecolor='white'));

然后再画内圈圆,如下所示

# Libraries
import matplotlib.pyplot as plt # Make data: I have 3 groups and 7 subgroups
# 设置数据
group_names=['groupA', 'groupB', 'groupC']
group_size=[12,11,30]
subgroup_names=['A.1', 'A.2', 'A.3', 'B.1', 'B.2', 'C.1', 'C.2', 'C.3', 'C.4', 'C.5']
subgroup_size=[4,3,5,6,5,10,5,5,4,6] # Create colors
# 设置颜色
a, b, c=[plt.cm.Blues, plt.cm.Reds, plt.cm.Greens] # First Ring (outside)
# 外圈
fig, ax = plt.subplots()
# 设置等比例轴,x和y轴等比例
ax.axis('equal')
# 画饼图
mypie, _ = ax.pie(group_size, radius=1.3, labels=group_names, colors=[a(0.6), b(0.6), c(0.6)],wedgeprops=dict(width=0.3, edgecolor='white')); # Second Ring (Inside)
# 画第二个圆
mypie2, _ = ax.pie(subgroup_size, radius=1.3-0.3, labels=subgroup_names, labeldistance=0.7, colors=[a(0.5), a(0.4), a(0.3), b(0.5), b(0.4), c(0.6), c(0.5), c(0.4), c(0.3), c(0.2)],wedgeprops=dict(width=0.4, edgecolor='white')); plt.margins(0,0);

4 参考

[python] 基于matplotlib实现圆环图的绘制的更多相关文章

  1. pyhton中matplotlib箱线图的绘制(matplotlib双轴图、箱线图、散点图以及相关系数矩阵图))

    //2019.07.23 1.箱形图,又称为盒式图,一般可以很好地反映出数据分布的特征,也可以进行多项数据之间分布特征的比较,它主要包含五个基础数据:中位数,两个上下分位数以及上下边缘线数据 其中的一 ...

  2. python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)

    最近在用python中的matplotlib画折线图,遇到了坐标轴 "数字+刻度" 混合显示.标题中文显示.批量处理等诸多问题.通过学习解决了,来记录下.如有错误或不足之处,望请指 ...

  3. python基于matplotlib绘图

    import math import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import F ...

  4. python3绘图示例5(基于matplotlib:正弦图等)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import numpy as npimport pylab as pyimport matplotlib as ...

  5. python用matplotlib画折线图

    折线图: import matplotlib.pyplot as plt y1=[10,13,5,40,30,60,70,12,55,25] x1=range(0,10) x2=range(0,10) ...

  6. python3绘图示例3(基于matplotlib:折线图等)

    #!/usr/bin/env python# -*- coding:utf-8 -*-from pylab import *from numpy import *import numpy # 数据点图 ...

  7. python使用matplotlib绘制折线图教程

    Matplotlib是一个Python工具箱,用于科学计算的数据可视化.借助它,Python可以绘制如Matlab和Octave多种多样的数据图形.下面这篇文章主要介绍了python使用matplot ...

  8. 【Python环境】matplotlib - 2D 与 3D 图的绘制

    2015-10-30数据科学自媒体 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. 让我们加载它: from pylab import ...

  9. Python培训:绘制饼图或圆环图

    使用pyplot的pie()函数可以快速地绘制饼图或圆环图,pie()函数的语法格式如下所示: 该函数常用参数的含义如下. ·x:表示扇形或楔形的数据. ·explode:表示扇形或楔形离开圆心的距离 ...

  10. 【Python】matplotlib绘制折线图

    一.绘制简单的折线图 import matplotlib.pyplot as plt squares=[1,4,9,16,25] plt.plot(squares) plt.show() 我们首先导入 ...

随机推荐

  1. spark之交集并集差集拉链

    spark之交集并集差集拉链 def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setMaster(&qu ...

  2. 绝杀processOn,这款UML画图神器,阿里字节都用疯了,你还不知道?

    大家好,我是陶朱公Boy,又和大家见面了. 前言 在文章开始前,想先问大家一个问题,大家平时在项目需求评审完后,是直接开始编码了呢?还是会先写详细设计文档,后再开始进行编码开发? ☆现实 这个时候可能 ...

  3. Conda的使用

    conda常用的命令 在Anaconda Powershell Prompt 输入: 1.conda -V检验是否安装及当前conda的版本. 2.conda list查看安装了哪些包 3.conda ...

  4. UEC 利用代理/委托写一个生命组件

    首先基于ActorComponent创建一个组件 HealthComponent,将需要的变量与函数创建 #include "CoreMinimal.h" #include &qu ...

  5. Docker中数据卷(Volume)的使用

    数据卷有两种形式,一种是容器中的某个目录,它可以被别的容器引用,只要有一个容器引用了这个数据卷,数据就不会被删除:另一种数据卷是将容器中的数据卷和宿主机的目录进行挂载. 数据卷可以在多个容器之间共享, ...

  6. 2022NISACTF--WEB

    easyssrf 打开题目,显示的是 尝试输入, 发现输入flag有东西 读取文件 访问下一个网站 读取文件 不能以file开头 直接伪协议,base64解码 checkIn 奇怪的unicode编码 ...

  7. VP记录

    预计在最后的日子里适量VP 简单记录一下 CF 1037 Link 上来秒了ABCD,很快啊 A是二进制拆分,B是一眼贪心,C是一个非常简单且好写的dp D把边遍历顺序按照所需的bfs顺序排序,最后比 ...

  8. Pwn学习随笔

    Pwn题做题流程 使用checksec检查ELF文件保护开启的状态 IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试) 编写python的exp脚本进行攻击 (若攻击不成功)进行GDB动态调试 ...

  9. 用 vue3 中的 reduce(累加器) 随机生成100个字母,放入数组中,统计每个字母出现的次数

    一.首先不用 reduce() 来实现  代码如下: <template lang=""> <div> <h1>统计每个字母出现的次数,不使用r ...

  10. 2022春每日一题:Day 21

    题目:[SCOI2007]降雨量 这题比较坑,分几种情况,但是可以总起来说,分开写,两个月份都没出现,maybe,否则如果两个月份都大于[l+1,r-1]的最大值,如果两个月份差值=r-l输出,tru ...