我们都知道饼图能直观的显示每个指标的占比,但是当我们仅有两个指标的时候,再绘制饼图进行可视化就不够好看。
另外一种情况而言:如果完成度是100%,今日的完成情况是59%,但是我想通过可视化来体现完成和未完成的占比以及当下的进程,再用饼图来展示视觉冲击就不够了,本文通过引入仪表盘图的简单绘制方法来解决上述情况的可视化问题。
普通饼图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # windows系统
plt.rcParams['axes.unicode_minus']=False #正常显示符号
data=pd.DataFrame({'进度':[80,60]},index=['已完成','未完成']).reset_index()
data
index | 进度 | |
---|---|---|
0 | 已完成 | 80 |
1 | 未完成 | 60 |
plt.pie(data['进度'],autopct='%1.1f%%',labels=['','']) #不显示每个饼的标签
plt.legend(data['index'])
仪表盘图
首先我们原对数据表进行操作
new_row=pd.DataFrame({'index':'汇总','进度':data['进度'].sum()},index=[2])
data=pd.concat([data,new_row],ignore_index=True)
data['rate']=round(data['进度']/data['进度'].sum(),2)
data
相当于我们把语文数学的占比都缩小了二分之一。
如果我们再次绘制饼图,则新添加进来的“汇总”则占比为50%,位于饼图的下方
接下来我们继续进行改进,绘制圆环图进而变成仪表盘图。
def pct(pct): #只显示已完成的数据占比
new_pct = pct * 2
if ((pct < data['rate'][1]*100+1) | (pct>= 50)):
return ''
else :
return f'{new_pct:.1f}%'
fig, ax = plt.subplots()
wedges, texts, autotexts = ax.pie(data['进度'],colors=['lightblue','lightgray','white'],explode=[0.05,0.05,0],autopct=pct,wedgeprops={'width': 0.3})
for autotext in autotexts:
autotext.set_fontsize('x-large') #设置大号字体
autotext.set_color('red') #设置红色字体
x, y = autotext.get_position()
autotext.set_position((x*0.05, y*0.2)) #设置标签位置
plt.gca().invert_xaxis() #翻转饼图,我们默认左边显示的为想要展示的数据
title=plt.title('完成进度仪表图',color='red')
title.set_bbox({'facecolor': '0.8', 'pad': 8})
淡蓝色的部分为已完成的进度占比,灰色则是未完成进度占比。值得注意的是,由于我们添加了汇总值,所以autopct显示的是缩小一半的数值,所以我们需要进行扩大两倍的操作,并只显示“已完成”的数值占比(见代码)