對比學(xué)習(xí),用Excel和Python繪制「棒棒糖圖」
回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書
大家好,我是云朵君!
今天給大家?guī)硪黄容^有意思的可視化圖——棒棒糖圖詳細(xì)繪圖教程。對比Excel與Pyhton,手把手教你繪制高大上的棒棒糖圖。
Excel繪制棒棒糖圖
首先是數(shù)據(jù)準(zhǔn)備,首先將原始數(shù)據(jù)復(fù)制一列,得到兩列一樣的數(shù)據(jù)。
選擇數(shù)據(jù),插入組合圖,分別設(shè)置柱狀圖和散點(diǎn)圖的組合圖表,確認(rèn)后既可以得到初步的棒棒糖圖。

可根據(jù)需要設(shè)置相應(yīng)的樣式:

其中設(shè)置x軸的位置相對較復(fù)雜些。
首先選中y軸,右擊再點(diǎn)擊設(shè)置坐標(biāo)軸格式,接下來分別設(shè)置橫坐標(biāo)軸位置及橫坐標(biāo)軸標(biāo)簽。設(shè)置x坐標(biāo)軸值為0.8,或者你需要的軸。設(shè)置x坐標(biāo)軸標(biāo)簽在圖的底部。
結(jié)果得到如下樣式。

當(dāng)然,可以設(shè)置條形和散點(diǎn)的樣式,如顏色形狀等。也可以單獨(dú)選中某條柱狀圖和散點(diǎn)標(biāo)志的樣式,以突出某個(gè)或某些值。

Python繪制棒棒糖圖
Bar+Scatter組合法
第一種方法,和Excel思路一樣,運(yùn)用條形圖(plt.bar)和散點(diǎn)圖(plt.scatter)組合繪制。如果想要不同的樣式,可以分別設(shè)置條形圖和散點(diǎn)圖的樣式,來改變整體樣式。
n = len(values)
colors1 = ["red"]+((n-1)*["olive"])
colors2 = ["red"]+((n-1)*["blue"])
plt.rcParams['figure.figsize'] = (23.5, 10)
plt.bar(values.index, values.values,
color=colors1, # 設(shè)置線條顏色
width=0.05) # 設(shè)置線條寬度
plt.scatter(values.index, values.values,
color=colors2,# 設(shè)置標(biāo)記點(diǎn)寬度
s=50) # 設(shè)置標(biāo)記點(diǎn)大小
plt.show()

設(shè)置樣式
這一步主要實(shí)現(xiàn)將X軸向上移動(dòng)。
將所有y值加上一個(gè)固定值v(負(fù)數(shù)): y = y+v并且設(shè)置y軸的下限為該固定值v : plt.ylim(v, 0.6)
繪制一條橫線
通過繪制折線的方法繪制一條基線,并固定 y=0plt.plot(values.index, [0]*n)或直接用直線函數(shù)繪制基線,同樣設(shè)置 y=0plt.axhline(y=0, xmin=0, xmax=1)上面兩種方法均可以繪制直線圖,第二種方法的缺點(diǎn)是在設(shè)置直線兩個(gè)端點(diǎn)時(shí),不太好把控,因?yàn)閤min和xmax設(shè)置的值在0~1之間的比例值。而第二種方法可以直接設(shè)置折線兩端點(diǎn)值。
plt.style.use('ggplot')
# plt.style.use('dark_background') # 設(shè)置黑色背景
plt.rcParams['figure.figsize'] = (23.5, 10)
plt.rcParams['axes.unicode_minus'] = False
v = -0.8
plt.bar(values.index, values.values+v,
color=colors1,width=0.05)
plt.scatter(values.index, values.values+v,
color=colors2,s=60)
# plt.plot(values.index,[0]*n,color='darkblue')
plt.axhline(y=0,xmin=0.045, xmax=0.955,
color='darkblue' ,
linestyle='--')
plt.ylim(v,0.6)
plt.show()

Stem 函數(shù)法
在python中,我們利用matplotlib.pyplot.stem可以直接繪制棒棒糖圖(莖葉圖)。這個(gè)函數(shù)只需要一行代碼就能繪制棒棒糖圖。下面來看看該神奇的plt.stem()的主要參數(shù)。
stem(x,y, linefmt=None, markerfmt=None, basefmt=None)
x : array-like, optional
數(shù)據(jù)x軸y : array-like
數(shù)據(jù)y軸linefmt : str, optional
可以使用顏色和線型來設(shè)置垂直線的顏色和類型,如'r-',代表紅色的實(shí)線。markerfmt : str, optional
設(shè)置頂點(diǎn)的類型和顏色,默認(rèn)值:'C0o',C(大寫字母C)是默認(rèn)的,后面數(shù)字應(yīng)該是0-9,改變顏色,最后的.或者o(小寫字母o)分別可以設(shè)置頂點(diǎn)為小實(shí)點(diǎn)或者大實(shí)點(diǎn)。basefmt : str, default: 'C3-' ('C2-' in classic mode)
定義基線屬性的格式字符串。就是y=0的那條線
從參數(shù)來看,使用其參數(shù)設(shè)置顏色,只能選用該函數(shù)設(shè)定好了的顏色圈內(nèi)的0-9號顏色。如果想要設(shè)置其他顏色,可以利用plt.setp來設(shè)置線條樣式。
n = len(values2)
colors1 = ["red"]+((n-1)*["olive"])
(markers, stemlines, baseline) = plt.stem(values2, markerfmt="C0o")
plt.setp(stemlines,
linestyle="-",
color=colors1,
linewidth=0.5 ) # 指定每行的屬性
plt.setp(baseline,
linestyle="--",
color="darkblue",
linewidth=2 )
plt.show()

通過設(shè)置參數(shù)bottom=0.8來調(diào)整基線位置,并設(shè)置背景樣式。
plt.style.use('dark_background')
plt.grid(0)
(markers, stemlines, baseline) = plt.stem(values2,
bottom=0.8,
markerfmt="C3o")
plt.setp(stemlines, linestyle="-",
color="y", linewidth=2 )
plt.show()

最后看下當(dāng)數(shù)據(jù)量超多的時(shí)候,繪制棒棒糖圖的效果。



OK,今天的分享就到這里啦!
沒看夠?點(diǎn)贊在看走起來~后續(xù)更精彩~
------------------- End -------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請?jiān)诤笈_回復(fù)【入群】
萬水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
