Matplotlib 绘制圆环图的两种方法!

人生苦短,快学Python!今天给大家介绍Python可视化之环形图的绘制。
环形图,也被称为圆环图。它在功能上与饼图相同,只是中间有一个空白,并且能够同时支持多个统计数据。与标准饼图相比,环形图提供了一个更好的数据强度,因为空白中心可以用来显示额外的、相关的数据。

使用场景:适合展示分类的占比情况,不适合展示分类过多(超过9条数据)或者差别不明显的场景。
在本文中,我们将介绍两种使用 Matplotlib 绘制环形图的方法。一种是使用饼图和参数 wedgeprops 的简单方法;另一种是使用极坐标轴和水平条形图的方法[1]。
方法一:饼图
Matplotlib 中没有绘制环形图的方法[2],但是我们可以使用参数 wedgeprops 快速转换饼图为环形图。
下面,先绘制一个简单的让小号用一个简单的饼图。
import?matplotlib.pyplot?as?plt
plt.pie([87,13],?startangle=90,?colors=['#5DADE2',?'#515A5A'])
plt.show()

接下来,我们我们可以添加参数 wedgeprops ,并定义边缘的宽度。
fig,?ax?=?plt.subplots(figsize=(6,?6))
?
ax.pie([87,13],?
???????wedgeprops={'width':0.3},?
???????startangle=90,?
???????colors=['#5DADE2',?'#515A5A'])

是不是非常简单,其实我们还可以添加一些文字,使得我们的数据可视化更有表现力。
fig,?ax?=?plt.subplots(figsize=(6,?6))
wedgeprops?=?{'width':0.3,?'edgecolor':'black',?'linewidth':3}
ax.pie([87,13],?wedgeprops=wedgeprops,?startangle=90,?colors=['#5DADE2',?'#515A5A'])
plt.title('环形图',?fontsize=24,?loc='center')
plt.text(0,?0,?"87%",?ha='center',?va='center',?fontsize=42)
plt.text(-1.2,?-1.2,?"来源:?Thiago?Carvalho",?ha='left',?va='center',?fontsize=12)

为了支持中文,我们需要增加这两行Python代码。
plt.rcParams['font.sans-serif']?=?['SimHei']??#?用来正常显示中文标签
plt.rcParams['axes.unicode_minus']?=?False??#?用来正常显示负号
当我们要显示简单的比例时,环形图特别有用。
然而在我眼中,圆环图最适合用来展示进度条!而要制作类似进度条一样的圆环图,可以可以进一步简化图表。
fig,?ax?=?plt.subplots(figsize=(6,?6))
data?=?[87,?13]
wedgeprops?=?{'width':?0.3,?'edgecolor':?'black',?'lw':?3}
patches,?_?=?ax.pie(data,?wedgeprops=wedgeprops,?startangle=90,?colors=['#5DADE2',?'white'])
patches[1].set_zorder(0)
patches[1].set_edgecolor('white')
plt.title('类似进度条的环形图',?fontsize=24,?loc='center')
plt.text(0,?0,?f"{data[0]}%",?ha='center',?va='center',?fontsiAze=42)
plt.text(-1.2,?-1.3,?"来源:?Thiago?Carvalho",?ha='left',?va='top',?fontsize=12)

方法二:条形图
相对于前一个方法,该方案较为复杂,但也提供了更多的自定义选项。
我们先从绘制基础图形开始。
fig,?ax?=?plt.subplots(figsize=(6,?6),?subplot_kw={'projection':'polar'})
data?=?87?
startangle?=?90
x?=?(data?*?pi?*2)/?100
left?=?(startangle?*?pi?*2)/?360?#?转换起始角度
ax.barh(1,?x,?left=left,?height=1,?color='#5DADE2')
plt.ylim(-3,?3)

如果想制作成前面一样的进度条,还需要进行更多的操作。
fig,?ax?=?plt.subplots(figsize=(6,?6),?subplot_kw={'projection':'polar'})
data?=?87
startangle?=?90
x?=?(data?*?pi?*2)/?100
left?=?(startangle?*?pi?*2)/?360?#控制起始位置
plt.xticks([])
plt.yticks([])
ax.spines.clear()
ax.barh(1,?x,?left=left,?height=1,?color='#5DADE2')?
plt.ylim(-3,?3)
plt.text(0,?-3,?"87%",?ha='center',?va='center',?fontsize=42)

使用这种方法的话,我们拥有更多的自定义选择。比如可以添加多个进度条、定义它们之间的距离等等。
篇幅限制,只显示部分代码吗,完整代码下载见文末。
#?在末尾标出线条和点来使它们变圆
for?i,?x?in?enumerate(xs):
????ax.barh(ys[i],?x,?left=left,?height=1,?color=colors[i])
????ax.scatter(x+left,?ys[i],?s=350,?color=colors[i],?zorder=2)
????ax.scatter(left,?ys[i],?s=350,?color=colors[i],?zorder=2)
plt.ylim(-4,?4)
legend_elements?=?[Line2D([0],?[0],?marker='o',?color='w',?label='Group?A',?markerfacecolor='#4393E5',?markersize=10),
???????????????????Line2D([0],?[0],?marker='o',?color='w',?label='Group?B',
??????????????????????????markerfacecolor='#43BAE5',?markersize=10),
???????????????????Line2D([0],?[0],?marker='o',?color='w',?label='Group?C',?markerfacecolor='#7AE6EA',?markersize=10)]
ax.legend(handles=legend_elements,?loc='center',?frameon=False)
plt.xticks([])
plt.yticks([])
ax.spines.clear()

好了,以上就是今天介绍的两种使用 Matplotlib 绘制环形图的方法。
另外,我还看过另外一个骚操作,也就是在饼图的中心绘制一个白色圆圈,使之变成一个环形图。

如果大家觉得本文还不错,记得给个一键三连!
参考资料
Towardsdatascience: https://towardsdatascience.com/
[2]Matplotlib: https://github.com/matplotlib/matplotlib

分享
点收藏
点点赞
点在看
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 总书记引领中国经济巨轮行稳致远 7904248
- 2 外交部回应美批准对华出售H200芯片 7807921
- 3 日本气象厅:一周内或发生9级地震 7712697
- 4 明年经济工作怎么干?关注这些重点 7618775
- 5 受贿超11亿!白天辉被执行死刑 7521852
- 6 “丧葬风”头巾实为日本品牌设计 7424400
- 7 男子彩票中748万遭店主扣押实体票 7333373
- 8 中国女博士生和女儿遭外籍丈夫杀害 7234707
- 9 香港大火致160人遇难 仍有6人失联 7139347
- 10 “中国游”“中国购”体验感拉满 7042951











AI100
