Python用 matplotlib 繪制柱狀圖

復習回顧:

Python 為數據展示提供瞭大量優秀的功能包,其中 matplotlib 模塊可以方便繪制制作折線圖、柱狀圖、散點圖等高質量的數據包。
關於 matplotlib 模塊,我們前期已經對matplotlib進行基本框架、以及常用方法的學習

 matplotlib 模塊基礎知識:對matplotlib模塊進行初步認識,對常用的方法進行學習
matplotlib 模塊底層原理:matplotlib 模塊包含腳本層、美工層及後端層三層細節瞭解
matplotlib 模塊折線圖繪制:總結折線圖相關屬性和方法

在 matplotlib 模塊提供的圖表中,除瞭折線圖使用最多外,柱狀圖也是我們日常數據分析的圖表。

接下來我們開始學習繪制柱狀圖相關屬性和方法

1. 柱狀圖概述

1.1什麼是柱狀圖

  • 柱狀圖又稱為條形圖,是一種以長方形的長度為變量數據進行統計的圖表
  • 柱狀圖用來比較兩個或以上類型
  • 柱狀圖隻有一個以長方形的長度為變量
  • 柱狀圖可以橫向排列或者多維方式展示

1.2柱狀圖使用場景

  • 柱狀圖適用在較小數據集的分析
  • 適用二維數據集,隻比較一個維度數據差異項
  • 直觀展示各個體之間數據的差異
  • 表現離散型的時間序列

1.3柱狀圖繪制步驟

  • 導入matplotlib.pyplot模塊
  • 準備數據,可以使用numpy/pandas整理數據
  • 調用pyplot.bar()繪制柱狀圖

1.3案例展示

本次,我們分析過去5年內的產品年銷量展示

案例所用到的數據如下:

import random

x_data = ["20{}年".format(i) for i in range(16,21)]
y_data = [random.randint(100,300) for i in range(6)]

繪制柱狀圖

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"]=['SimHei']
plt.rcParams["axes.unicode_minus"]=False

for i in range(len(x_data)):
    plt.bar(x_data[i],y_data[i])

plt.title("銷量分析")
plt.xlabel("年份")
plt.ylabel("銷量")

plt.show()

2. 柱狀圖屬性

2.1柱狀體顏色填充

  • facecolor(fc)關鍵字
  • color 關鍵字
  • 顏色簡稱:
屬性值 說明 屬性值 說明
“b”/”bule” 藍色 “m”/”magenta” 品紅
“g” /”green” 綠色 “y”/”yellow” 黃色
“r”/”red” 紅色 “k”/”black” 黑色
“c”/”cyan” 青色 “w”/”white”
rgb:
  • 格式形式:(r,g,b)
  • 取值范圍:0~1

2.2狀描邊設置

柱狀體邊框顏色

  • edgecolor 或者 ec

柱狀體邊框樣式

  • linestyle 或者 ls
  • 線條樣式:
屬性值 說明
“-” 、”solid” 默認實線顯示
“–“、”dashed” 虛線
“-.” “dashdot” 點劃線
“:”、”dotted” 虛線
“None” “”””

2.3狀體邊框寬度

  • linewidth 或者 lw
  • 柱狀圖填充樣式

hatch: 設置填充樣式
屬性取值:{‘/’, ”, ‘|’, ‘-‘, ‘+’, ‘x’, ‘o’, ‘O’, ‘.’, ‘*’} |

2.4刻度標簽

  • tickle label:默認使用數字標簽

我們對 第一節柱狀圖添加邊框樣式為”–“,添加指定rgb顏色,填充圓圈

for i in range(len(x_data)):
   plt.bar(x_data[i],y_data[i],color=(0.2*i,0.2*i,0.2*i),linestyle="--",hatch="o")

3. 堆疊柱狀圖

  • 在柱狀圖中,我們會在同時對比兩組數據在同一類中的表現形式,因此需要繪制堆疊柱狀圖
  • bottom : 條形底座的y坐標,默認值為0

在第一節案例中,添加一組y軸數據所有數據如下:

x_data = ["20{}年".format(i) for i in range(16,21)]
 y_data = list(random.randint(100,300) for i in range(5))
 y2_data = list(random.randint(100,300) for i in range(5))

再添加一次pyplot.bar方法,添加bottom屬性

 plt.bar(x_data,y_data,lw=0.5,fc="r",label="Phone")
 plt.bar(x_data,y2_data,lw=0.5,fc="b",label="Android",bottom=y_data)


4. 並列柱狀圖

在繪制並列的柱狀圖中,要控制好每個柱狀體的位置和大小可以使用width屬性

  • width: 設置每組柱狀體的寬度
  • x軸:x軸的寬度每組直接也要設置好

例如繼續改造上面案例,我們為bar1和bar2添加瞭width屬性後,單獨設置x軸並排的寬度為0.3

x_width = range(0,len(x_data))
x2_width = [i+0.3 for i in x_width]


plt.bar(x_width,y_data,lw=0.5,fc="r",width=0.3,label="Phone")
plt.bar(x2_width,y2_data,lw=0.5,fc="b",width=0.3,label="Android")

plt.xticks(range(0,5),x_data)

5. 水平柱狀圖

柱狀圖中,有時候需要讓柱狀圖水平放置,比較差異,我們這時候需要使用到barh方法

  • pyplot.barh(y,width):繪制水平柱狀圖
  • 結合上述案例,改用barh方法
x_data = ["20{}年".format(i) for i in range(16,21)]
  y_data = list(random.randint(100,300) for i in range(5))
  y2_data = list(random.randint(100,300) for i in range(5))

  x_width = range(0,len(x_data))
  x2_width = [i+0.3 for i in x_width]

  plt.barh(x_width,y_data,lw=0.5,fc="r",height=0.3,label="Phone")
  plt.barh(x2_width,y2_data,lw=0.5,fc="b",height=0.3,label="Android")
  plt.yticks(range(0,5),x_data)

  plt.legend()

  plt.title("銷量分析")
  plt.ylabel("年份")
  plt.xlabel("銷量")

  plt.show()

6. 添加折線柱狀圖

我們在查看柱狀圖時,有時候會需要輔助折線來查看

  • 使用pyplot.plot()方法匯總折線圖
  • 同時使用pyplot.text()顯示坐標值
  • 當堆疊圖時,需要計算好折線相對位置
plt.plot(x_data,y_data,color="pink",linestyle="--")

plt.plot(x_data, y2_data+200, color="skyblue", linestyle="-.")

# 柱狀圖
plt.bar(x_data,y_data,lw=0.5,fc="r",width=0.3,label="Phone",alpha=0.5)
plt.bar(x_data,y2_data, lw=0.5, fc="b", width=0.3, label="Android",alpha=0.5,bottom=y_data)

for i,j in zip(x_data,y_data):

   plt.text(i,j+0.05,"%d"%j,ha="center",va="bottom")

for i2,j2 in zip(x_data,y2_data):

   plt.text(i2,j2+180,"%d"%j2,ha="center",va="bottom")

7. 正負柱狀圖

我們需要使用Axes對象來設置坐標軸的位置

  • 首先使用pyplot.gca()方法創建axes對象
  • 然後使用matplotlib.spines模塊調用set_position設置坐標軸位置
  • set_position 設置軸位置點
  • spines[]選項有”left"|"bottom"|"width"|"height"
  • set_position 值格式為(位置類型,數量);位置類型;”outward”|”axes”|”data”|;數量:中心->(“軸”,0.5),零->(“數據”,0.0)
y_data = np.random.randint(100, 300,5)
y2_data = np.random.randint(100, 300,5)

ax = plt.gca()
ax.spines["bottom"].set_position(('data', 0))

plt.bar(x_data,+y_data,lw=0.5,fc="r",width=0.3,label="Phone")
plt.bar(x_data,-y2_data, lw=0.5, fc="b", width=0.3, label="Android")

for i,j in zip(x_data,y_data):

    plt.text(i,j,"%d"%j,ha="center",va="top")

for i2,j2 in zip(x_data,y2_data):

    plt.text(i2,-j2,"%d"%j2,ha="center",va="bottom")

總結:
本文我們atplotlib模塊中詳細學習繪制各種柱狀圖標相關屬性和方法,在遇到需要直觀展示離散數據點的差異時,我們可以使用bar()或者barh()繪制美觀的圖表。

到此這篇關於Python用 matplotlib 繪制柱狀圖的文章就介紹到這瞭,更多相關matplotlib 繪制柱狀圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: