圆环图本质上是一个中间切出一块区域的饼状图。可以使用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. 使用idea操作git(ssh协议)

    问题 我们发现,使用IDEA上的git功能,当使用ssh协议出现了可以commit但无法push和pull的问题,经过测试发现原因是Could not read from remsitory.直接翻译 ...

  2. 2022年整理最详细的java面试题、掌握这一套八股文、面试基础不成问题[吐血整理、纯手撸]

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.面向对象 2.JDK.JRE.JVM区别和联系 3.==和equals 4.final 5.String .Strin ...

  3. 京东云开发者|ElasticSearch降本增效常见的方法

    Elasticsearch在db_ranking 的排名又(双叒叕)上升了一位,如图1-1所示;由此可见es在存储领域已经蔚然成风且占有非常重要的地位. 随着Elasticsearch越来越受欢迎,企 ...

  4. CSS 动画一站式指南

    CSS 动画一站式指南 目录 CSS 动画一站式指南 1. CSS 动画 1.1 变换 1.1.1 变换属性介绍 1.1.2 变换动画实践 1.2 过渡 1.2.1 过渡属性介绍 1.2.2 过渡动画 ...

  5. SketchUp2020免费中文完整版官网2021教程模型库下载

    SketchUp2022 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载SU22_CN_x64安装包到电脑磁盘里,并鼠标右击进行解压缩,然后找到SketchUpPr ...

  6. 18道经典链表题刷题总结——WeetCode1 链表系列

    系列文章目录和关于我 前言: WeetCode = Week leetCode 寓意每周刷点leetCode 题目 链表是我恢复刷题手感最喜欢做的系列,其没用太多的算法思想,单纯考验对指针的理解,和c ...

  7. 第2-3-7章 个人网盘服务接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

    目录 5.8 导入其他接口代码 5.8.1 接口导入-分页查询附件 5.8.2 接口导入-根据业务类型/业务id查询附件 5.9 导入网盘服务接口 5.9.1 导入FileController 5.9 ...

  8. 云原生学习笔记-1-docker

    一.基础环境说明 1.操作系统:Centos7.6:1master:2node 2.docker版本:docker-ce 19.03.8-3 二.docker安装 1.使用阿里镜像仓库,mirror. ...

  9. ES文件传输助手1.0.0

    软件下载地址 1.软件功能 与 ES文件浏览器 的快传功能 直接传输文件 支持接受文件点击预览 可以多台电脑使用该软件,从而实现电脑与电脑局域网互传文件 单个文件夹上传会递归上传该文件夹下所有文件夹与 ...

  10. PLSql在Oracle中创建表空间

    create tablespace db_test --表空间名 datafile 'D:\oracle\product\11.2.0\dbhome_1\oradata\orcl\test.dbf' ...