使用Matplotlib的条形图绘制一个颜色花哨的漏斗图

259 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

前段时间作matplotlib作业要求画一个漏斗图,知乎上也有相关的代码,但是画出来的图在色彩上比较单调,因此就自己简单调整了一下代码,作为以后的参考吧。

(之后才发现barh()的color参数是可以填列表的,来为每个横条定制颜色,不过透明度alpha不行,所以想想这样一个横条一个横条的画好像还有点用额😶?……)

代码

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.offsetbox import (TextArea, DrawingArea, OffsetImage,
                                  AnnotationBbox)

#解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

width = 0.55
x0 = np.array([100, 53, 22, 17, 6]) #数据
labels=['菜鸟','普通玩家','老玩家','大佬','萌新'] #标签
N = x0.size #获取数据长度
max_value = x0.max()
x = x0*np.eye(N)
blank= np.array((x0.max()-x0)/2) # 占位

y = np.arange(N-1,-1,-1) # 倒转y轴 [4,3,2,1,0]

#figure
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)


#绘制条幅,
zeros = np.zeros(N)
alpha_step = (1-0.3)/(N-1)
for i in range(N-1):
    ax.barh(y,x[i],width,tick_label=labels,color='cornflowerblue',alpha=0.3+alpha_step*i,left=blank)
ax.barh(y,x[N-1],width,tick_label=labels,color='crimson',alpha=0.3+alpha_step*(N-1),left=blank) #绘制最后一层的条幅

#绘制边线
rightblank = np.array([i+j for i,j in zip(blank,x0)])
ax.plot(blank,y,'crimson',alpha=0.7)
ax.plot(rightblank,y,'crimson',alpha=0.7)

#绘制转换率标签
transform = ['%.2f%%'%((x0[i+1]/x0[i])*100) for i in range(N-1)]
l = [(max_value/2,i) for i in range(N-2,-1,-1)] # 
for a,b in zip(transform,l):
    offsetbox = TextArea(a, minimumdescent=False)
    ab = AnnotationBbox(offsetbox, b,
                        xybox=(0, 40),
                        boxcoords="offset points",
                        arrowprops=dict(arrowstyle="->"))
    ax.add_artist(ab)
ax.set_xticks([0,max_value])
ax.set_yticks(y)

效果

在这里插入图片描述