數(shù)據(jù)可視化|用堆疊條形圖進(jìn)行對比分析

? ?? 作者:林驥
? ? ?來源:林驥
01
你好,我是林驥。
堆疊條形圖,用于展示不同類別之間占比數(shù)據(jù),常常能起到很好的對比效果。
比如說,對某產(chǎn)品的不同功能進(jìn)行用戶調(diào)查,讓 100 個(gè)用戶分別按 1 ~ 5 分進(jìn)行評分,經(jīng)過統(tǒng)計(jì),得到每個(gè)功能對應(yīng)評分的人數(shù)占比如下:

對這組數(shù)據(jù)進(jìn)行對比分析,我們可以把它做成一張堆疊條形圖,效果如下:

細(xì)心的讀者可能會(huì)發(fā)現(xiàn),這張圖中有一些刻意的設(shè)計(jì),例如 1 分和 2 分的條形顏色一樣,4 分和 5 分 的條形顏色也一樣,因?yàn)檫@里想要讓「好評」與「差評」之間的對比更加強(qiáng)烈,讓觀眾一眼就能看出,用戶對功能 A 的滿意度最高,對功能 B 很不滿意。
與普通的條形圖相比,這張圖還有其他一些細(xì)節(jié)的改進(jìn),在此不再一一贅述,建議讀者自己去領(lǐng)會(huì)。
數(shù)據(jù)可視化所做的工作,就是把數(shù)據(jù)背后的「故事」放進(jìn)圖表中展現(xiàn)出來,起到高效傳遞信息的作用。
一個(gè)成功的數(shù)據(jù)可視化作品,不在于有多復(fù)雜的圖形,也不在于有多華麗的外表,而在于其背后生動(dòng)的故事。
02
下面是具體的實(shí)現(xiàn)方法。
首先,導(dǎo)入所需的庫,并設(shè)置中文字體和定義顏色等。
#?導(dǎo)入所需的庫
import?numpy?as?np
import?pandas?as?pd
import?matplotlib?as?mpl
import?matplotlib.pyplot?as?plt
from?datetime?import?timedelta
#?正常顯示中文標(biāo)簽
mpl.rcParams['font.sans-serif']?=?['SimHei']
#?自動(dòng)適應(yīng)布局
mpl.rcParams.update({'figure.autolayout':?True})
#?正常顯示負(fù)號
mpl.rcParams['axes.unicode_minus']?=?False
#?定義顏色,主色:藍(lán)色,輔助色:灰色,互補(bǔ)色:橙色
c?=?{'藍(lán)色':'#00589F',?'深藍(lán)色':'#003867',?'淺藍(lán)色':'#5D9BCF',
?????'灰色':'#999999',?'深灰色':'#666666',?'淺灰色':'#CCCCCC',
?????'橙色':'#F68F00',?'深橙色':'#A05D00',?'淺橙色':'#FBC171'}
其次,從 Excel 文件中讀取隨機(jī)模擬的數(shù)據(jù),并定義畫圖用的數(shù)據(jù)。
#?數(shù)據(jù)源路徑
filepath='./data/用戶評分占比2.xlsx'
#?讀取?Excel文件
df?=?pd.read_excel(filepath,?index_col='功能')
#?定義畫圖用的數(shù)據(jù)
category_names?=?df.columns
labels?=?df.index
data?=?df.values
data_cum?=?data.cumsum(axis=1)
接下來,開始用「面向?qū)ο蟆沟姆椒ㄟM(jìn)行畫圖。
#?使用「面向?qū)ο蟆沟姆椒ó媹D,定義圖片的大小
fig,?ax=plt.subplots(figsize=(9,?5))
#?設(shè)置標(biāo)題
ax.set_title('\n用戶對功能?A?最為滿意\n\n',?fontsize=26,?loc='left',?color=c['深灰色'])
#?倒轉(zhuǎn)?Y?軸,讓第一個(gè)功能排在最上面
ax.invert_yaxis()
#?隱藏?X?軸
ax.xaxis.set_visible(False)
#?設(shè)置?X?軸的范圍
ax.set_xlim(0,?np.sum(data,?axis=1).max())
#?定義顏色
category_colors?=?[c['橙色'],?c['橙色'],?c['灰色'],?c['藍(lán)色'],?c['藍(lán)色']]
#?畫堆疊水平條形圖
for?i,?(colname,?color)?in?enumerate(zip(category_names,?category_colors)):
????widths?=?data[:,?i]
????starts?=?data_cum[:,?i]?-?widths
????ax.barh(labels,?widths,?left=starts,?height=0.68,?label=colname,?color=color,?edgecolor='w')
????xcenters?=?starts?+?widths?/?2
????#?設(shè)置數(shù)據(jù)標(biāo)簽及其文字顏色
????text_color?=?'w'
????for?y,?(x,?d)?in?enumerate(zip(xcenters,?widths)):
????????ax.text(x,?y,?'{:.0%}'.format(d),?ha='center',?va='center',?color=text_color,?fontsize=16)
????????
#?顯示圖例
l?=?ax.legend(ncol=len(category_names),?bbox_to_anchor=(-0.03,?0.95),loc='lower?left',?
??????????????fontsize=16,?frameon=False,?handlelength=0.6)
#設(shè)置圖例中文本的顏色
for?i,?text?in?zip(np.arange(len(l.get_texts())),?l.get_texts()):
????if?i?2:
????????text.set_color(c['橙色'])
????elif?i?3:
????????text.set_color(c['灰色'])
????else:
????????text.set_color(c['藍(lán)色'])
#?隱藏邊框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)
#?隱藏?Y?軸的刻度線
ax.tick_params(axis='y',?which='major',?length=0)
#?設(shè)置坐標(biāo)標(biāo)簽字體大小和顏色
ax.tick_params(labelsize=16,?colors=c['深灰色'])
plt.show()
你可以前往 https://github.com/linjiwx/mp 下載畫圖用的數(shù)據(jù)和完整代碼。
03
常見的數(shù)據(jù)可視化元素包括:坐標(biāo)位置、長度或高度、角度、面積、顏色變化等,不同元素表達(dá)數(shù)據(jù)的精確度也是不一樣的。
比如說,人們對坐標(biāo)位置的變化比較敏感,但是很難從顏色變化中分辨出數(shù)據(jù)差異的大小。

精心制作一個(gè)合適的圖表,至少有以下 3 個(gè)好處:
(1)傳遞有效信息,提高溝通的精準(zhǔn)度。
(2)獲得專業(yè)信任,提高數(shù)據(jù)的可信度。
(3)塑造職業(yè)形象,提升職場的競爭力。
◆?◆?◆ ?◆?◆
長按二維碼關(guān)注我們
數(shù)據(jù)森麟公眾號的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關(guān)于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關(guān)內(nèi)容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進(jìn)群前一定要關(guān)注公眾號奧,關(guān)注后讓管理員幫忙拉進(jìn)群,期待大家的加入。
管理員二維碼:
