條形圖是日常畫圖中最常使用的圖形之一
簡單模板
首先看一個簡單的模板,條形圖一般分爲豎向和橫向兩種,如果圖中有負數的話,最好畫一條橫線或者豎線,可以讓圖看起來更加完整和美觀,如下:
plt.figure(figsize=(10,8))
#正常柱形圖
plt.subplot(221)
plt.bar(x,y,color='red')
#正常柱形圖,x=0處加橫線
plt.subplot(222)
plt.bar(x,y,color='red')
plt.axhline(0,color='grey',linewidth=2)
#橫向條形圖
plt.subplot(223)
plt.barh(x,y,color='red')
#橫向條形圖,y=0處加橫線
plt.subplot(224)
plt.barh(x,y,color='red')
plt.axvline(0,color='grey',linewidth=2)
負數區分
當然如果圖表中有負數的話,我們最好是用不同的顏色進行區分
v_bars = plt.bar(x,y,color='lightblue',alpha=0.6)
plt.axhline(0,color='grey',linewidth=2)
for bar,height in zip(v_bars,y):
if height < 0:
bar.set(edgecolor = 'darkred',color = 'green',linewidth = 3,alpha=0.6)
plt.show()
顏色填充
x = np.linspace(0,10,200)
y1 = 2*x +1
y2 = 3*x +1.2
y_mean = 0.5*x*np.cos(2*x) + 2.5*x +1.1
fig,ax = plt.subplots()
#設定填充位置
ax.fill_between(x,y1,y2,color='red')
ax.plot(x,y_mean,color='black')
plt.show()
查看數據差異
比如我們有三組數據,想看下每組數據的均值及方差情況
x1=[2,3,4]
x2=[3,4,6]
x3=[4,6,7]
mean_values=[np.mean(x1),np.mean(x2),np.mean(x3)]
std_values=[np.std(x1),np.std(x2),np.std(x3)]
bar_label = ['x1','x2','x3']
x_pos = list(range(len(bar_label)))
plt.bar(x_pos,mean_values,yerr=std_values,alpha=0.3)
max_y = max(zip(mean_values,std_values))
plt.ylim([0,(max_y[0]+max_y[1])*1.2])
plt.ylabel('std_values')
plt.xticks(x_pos,bar_label)
對比圖
在一組數據中,我們以最小值爲參照,顯示其他組數據的增長變化情況
#構造數據
data = range(200, 225, 5)
#設定一個標籤
bar_labels = ['a', 'b', 'c', 'd', 'e']
fig = plt.figure(figsize=(10,8))
#位置
y_pos = np.arange(len(data))
#基本圖形
bars = plt.barh(y_pos,data,alpha = 0.5,color='g')
#y軸標籤
plt.yticks(y_pos, bar_labels, fontsize=16)
#對比線
plt.vlines(min(data),-1,len(data)+0.5,linestyle = 'dashed')
#數據標籤
for b,d in zip(bars,data):
plt.text(b.get_width()+b.get_width()*0.05,b.get_y()+b.get_height()/2,'{0:.2%}'.format(d/min(data)))
plt.show()
圖形填充
#填充標示
patterns = ('-', '+', 'x', '\\', '*', 'o', 'O', '.')
fig = plt.gca()
mean_value = range(1,len(patterns)+1)
x_pos = list(range(len(mean_value)))
bars = plt.bar(x_pos,mean_value,color='b',alpha=0.3)
for bar,pattern in zip(bars,patterns):
bar.set_hatch(pattern)