大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
在matplotlib
中pie()
不单可以绘制饼图,还可以绘制圆环图(donut)。圆环图可以看成饼图的变种,matplotlib
没有提供专门绘制圆环图的接口。
在matplotlib之pyplot模块之饼图(pie():基础参数,返回值)中,我们提到了wedgeprops
参数,通过wedgeprops
参数传递饼块对象Wedge
的width
参数即可快速实现圆环图。
下面通过三个案例简单说明圆环图、二层圆环图、三层圆环图(旭日图)的制作方法。
案例:简易圆环图
通过案例可知,圆环图与饼图的实现相比,仅多了参数wedgeprops={'width': 0.5}
。
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
x = [1, 5, 4, 3]
labels = ['a', 'b', 'c', 'd']
plt.subplot(121)
plt.pie(x, labels=labels)
plt.title("饼图")
plt.subplot(122)
plt.pie(x, labels=labels, wedgeprops={
'width': 0.5})
plt.title("圆环图")
plt.show()
案例:二层圆环图
多层圆环图一般用于展示分组数据。本案例需要展示的数据为二层嵌套列表[[60., 32.], [37., 40.], [29., 10.]]
,内层圆环展示分组合计,外层圆环展示每个项目。
案例提供了两种写法,一种使用numpy处理数据,一种使用Python内置方法,主要牵扯到嵌套列表的分组求和,嵌套列表展平操作。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
size = 0.4
data = [[60., 32.], [37., 40.], [29., 10.]]
plt.subplot(121)
# 使用numpy处理数据
vals = np.array(data)
# 内层圆环
plt.pie(vals.sum(axis=1), radius=1-size, autopct='%1.1f%%', pctdistance=0.6,
wedgeprops=dict(width=size, edgecolor='w'))
# 外层圆环
plt.pie(vals.flatten(), radius=1, autopct='%1.1f%%', pctdistance=0.8,
wedgeprops=dict(width=size, edgecolor='w'))
plt.title('双层圆环图')
plt.subplot(122)
# 使用Python内置方法处理数据
# 按分组求和作为内层圆环数据源
sums = [sum(i) for i in data]
# 展平数据作为外层圆环数据源
flatten = sum(data, [])
# 内层圆环
plt.pie(sums, radius=1-size, autopct='%1.1f%%', pctdistance=0.6,
wedgeprops=dict(width=size, edgecolor='w'))
# 外层圆环
plt.pie(flatten, radius=1, autopct='%1.1f%%', pctdistance=0.8,
wedgeprops=dict(width=size, edgecolor='w'))
plt.title('双层圆环图')
plt.show()
案例:三层圆环图(旭日图)
本案例需要展示的数据为三层嵌套列表[[[20, 30], 32], [37, [20, 15]], [29, 10, [10, 5]]]
,外层圆环展示每个项目,第二层展示二级分组合计,内层圆环展示一级分组合计。
案例的关键在于如何处理三层圆环的数据,由于数据不规则,使用numpy也比较麻烦,因此采用循环处理。
原始数据为:
[[[20, 30], 32], [37, [20, 15]], [29, 10, [10, 5]]]
目标数据为:
[20, 30, 32, 37, 20, 15, 29, 10, 10, 5]
[50, 32, 37, 35, 29, 10, 15]
[82, 72, 54]
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
size = 0.4
data = [[[20, 30], 32], [37, [20, 15]], [29, 10, [10, 5]]]
# data = [[[20, 30], [32]], [[37], [20, 15]], [[29, 10], [10, 5]]]
# 3个圆环图数据的临时变量
group1_data= []
group2_data = []
items_data = []
# 由于数据不规则,采用numpy也比较繁琐,因此采用循环处理数据
for group1 in data:
temp_group2 = []
temp_items = []
for group2 in group1:
if type(group2) is list:
temp_group2 = sum(group2)
items_data = items_data + group2
else:
temp_group2 = group2
items_data.append(temp_group2)
temp_items.append(temp_group2)
group2_data.append(temp_group2)
group1_data.append(sum(temp_items))
print(items_data, group2_data, group1_data)
# 外层圆环,数据为[20, 30, 32, 37, 20, 15, 29, 10, 10, 5]
plt.pie(items_data, radius=1.4, autopct='%1.1f%%', pctdistance=0.9,
wedgeprops=dict(width=size, edgecolor='w'))
# 第二层圆环,数据为[50, 32, 37, 35, 29, 10, 15]
plt.pie(group2_data, radius=1.4-size, autopct='%1.1f%%', pctdistance=0.8,
wedgeprops=dict(width=size, edgecolor='w'))
# 内层圆环,数据为[82, 72, 54]
plt.pie(group1_data, radius=1.4-2*size, autopct='%1.1f%%', pctdistance=0.6,
wedgeprops=dict(width=size, edgecolor='w'))
plt.title('三层圆环图', loc='left')
plt.show()
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189440.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...