Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖
前言
在開始,我們先引入 matplotlib 和 numpy 庫。
from matplotlib import pyplot as plt import numpy as np
對基本配置進(jìn)行設(shè)置,將中文字體設(shè)置為黑體,不包含中文負(fù)號,分辨率為 100,圖像顯示大小設(shè)置為 (5,3)。
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False? plt.rcParams['figure.dpi'] = 100? plt.rcParams['figure.figsize'] = (5,3)
一、柱狀圖
柱狀圖是一種用矩形柱來表示數(shù)據(jù)分類的圖表。柱狀圖可以垂直繪制,也可以水平繪制。它的高度與其所表示的數(shù)值成正比關(guān)系。柱狀圖顯示了不同類別之間的比較關(guān)系,圖表的水平軸 X 指定被比較的類別,垂直軸 Y 則表示具體的類別值
二、豎直柱狀圖
matplotlib.pyplot.bar(x, height, width: float = 0.8, bottom = None, *, align: str = ‘center', data = None, **kwargs)
其參數(shù)具體如下含義:
- x 表示 x 坐標(biāo),數(shù)據(jù)類型為 float 類型,一般是通過 np.arange() 生成的固定步長列表。
- height 表示柱狀圖的高度,也就是 y 坐標(biāo)值,數(shù)據(jù)類型為 float 類型,一般為一個列表,包含生成柱狀圖的所有 y 值。
- width 表示柱狀圖的寬度,取值在 0~1 之間,默認(rèn)值為 0.8。
- bottom 表示柱狀圖的起始位置,也就是 y 軸的起始坐標(biāo),默認(rèn)值為 None。
- align 表示柱狀圖的中心位置,“center”,“lege” 邊緣,默認(rèn)值為 ’center’。
- color 表示柱狀圖顏色,默認(rèn)為藍(lán)色。
- alpha 表示透明度,取值在 0~1 之間,默認(rèn)值為 1。
- label 表示標(biāo)簽,設(shè)置后需要調(diào)用 plt.legend() 生成。
- edgecolor 表示邊框顏色 (ec)。
- linewidth 表示邊框?qū)挾?,浮點(diǎn)數(shù)或類數(shù)組,默認(rèn)為 None (lw)。
- tick_label 表示柱子的刻度標(biāo)簽,字符串或字符串列表,默認(rèn)值為 None。
- linestyle 表示線條樣式 (ls)。
1. 基本的柱狀圖
- 我們可以簡單畫一個柱狀圖用以觀察,x 軸數(shù)據(jù)通過 range 函數(shù)生成,y 軸數(shù)據(jù)隨便設(shè)定一個數(shù)組即可。
import matplotlib.pyplot as plt x = range(5) ?data = [5, 20, 15, 25, 10] ?plt.title("基本柱狀圖") plt.grid(ls="--", alpha=0.5) plt.bar(x, data)
(1) bottom 參數(shù)。
- bottom 參數(shù)表示的是柱狀圖的起始位置,也就是 y 軸的起始坐標(biāo),默認(rèn)值為 None。
- 我們?nèi)圆捎煤蜕鲜隼酉嗤臄?shù)據(jù),但與之不同的是,我們對 y 軸數(shù)據(jù)的起始點(diǎn)進(jìn)行修改。
- 這里需要注意的是,bottom 參數(shù)設(shè)定的數(shù)組與 y 軸數(shù)據(jù)的參數(shù)是一一對應(yīng)的,而且,兩個數(shù)組的形狀要相同。
import matplotlib.pyplot as plt x = range(5) ?data = [5, 20, 15, 25, 10] ?plt.title("基本柱狀圖") ?plt.grid(ls="--", alpha=0.5) plt.bar(x, data, bottom=[10, 20, 5, 0, 10])
(2) 柱狀圖顏色。
關(guān)于柱狀圖的顏色,我們也采用上述的數(shù)據(jù)進(jìn)行操作,此時,不設(shè)置柱狀圖的 bottom 參數(shù),同時,將柱狀圖的顏色設(shè)置為綠色。
import matplotlib.pyplot as plt x = range(5) data = [5, 20, 15, 25, 10] ?plt.title("設(shè)置柱狀圖顏色") plt.grid(ls="--", alpha=0.5) ?plt.bar(x, data ,facecolor="green") #plt.bar(x, data ,color="green")
那么,在某些特定的情況下,柱狀圖的單一顏色并不利于我們后續(xù)的觀察,因此,我們可以使用 facecolor 函數(shù),分別對每個柱狀圖進(jìn)行顏色的設(shè)置。
import matplotlib.pyplot as plt x = range(5) data = [5, 20, 15, 25, 10] plt.title("color參數(shù)設(shè)置柱狀圖不同顏色") plt.grid(ls="--", alpha=0.5) plt.bar(x, data ,color=['r', 'g', 'b'])
(3) 柱狀圖描邊。
- 描邊的相關(guān)的關(guān)鍵字參數(shù)為:
- edgecolor 或 ec。
- linestyle 或 ls。
- linewidth 或 lw。
- 具體可見如下具體實(shí)例。
import matplotlib.pyplot as plt? data = [5, 20, 15, 25, 10]? plt.title("設(shè)置邊緣線條樣式")? plt.bar(range(len(data)), data, ec='r', ls='--', lw=2)
2. 同位置多柱狀圖
在同一個 x 軸位置繪制多個柱狀圖,主要是通過調(diào)整柱狀圖的寬度和每個柱狀圖 x 軸的起始位置。
例如,我們有 2022 年冬奧會挪威、德國、中國、美國和瑞典的金銀銅牌數(shù)和總獎牌數(shù)。
對此,我們需要繪制如下圖形:
對該柱狀圖進(jìn)行分析,可得:
(1) 本實(shí)例需要對 x 軸進(jìn)行計(jì)算,因此需要將 x 軸轉(zhuǎn)數(shù)值。
(2) 確定同一 x 軸中,每個柱狀圖 x 軸的起始位置。
(3) 需要設(shè)置圖形的寬度。
(4) 圖形 2 的起始位置 = 圖形 1 起始位置 + 圖形的寬度。
(5) 圖形 3 的起始位置 = 圖形 1 起始位置 + 2 倍圖形的寬度。
(6) 需要給每個柱狀圖循環(huán)顯示文本內(nèi)容。
(7) 需要顯示圖例。
具體柱狀圖繪制過程如下:
首先,我們需要導(dǎo)入國家和各個國家的金銀銅獎牌數(shù)。
countries = ['挪威', '德國', '中國', '美國', '瑞典'] gold_medal = [16, 12, 9, 8, 8] silver_medal = [8, 10, 4, 10, 5] bronze_medal = [13, 5, 2, 7, 5]
此時,如果我們直接進(jìn)行繪制的話,會發(fā)現(xiàn)每個國家的獎牌柱狀圖發(fā)生了重疊,并且每個柱狀圖的寬度也過大。
這是因?yàn)樗麄兌寄J(rèn) y 軸的起始坐標(biāo)也就是 bottom 參數(shù)為 0,寬度參數(shù)由于沒有設(shè)置,默認(rèn)是 0.8。
plt.bar(countries, gold_medal,color="gold") plt.bar(countries,silver_medal,color="silver") plt.bar(countries,bronze_medal,color="red")
針對上述在繪圖過程當(dāng)中出現(xiàn)的問題和最后結(jié)果的樣圖,我們需要將每個國家的金銀銅牌柱狀圖分別畫在一起,所以我們需要對 x 軸的國家參數(shù)進(jìn)行坐標(biāo)計(jì)算。
由于字符串不可以直接進(jìn)行算術(shù)運(yùn)算,因此,我們使用 np.arange 將他們轉(zhuǎn)化成數(shù)組,然后在返回字符串國家,并將柱狀圖的寬度 width 設(shè)置為 0.2
x = np.arange(len(countries)) print(x) width = 0.2 #[0 1 2 3 4]
隨后,我們確定每個國家的金銀銅牌柱狀圖的起始位置。
金牌呃起始位置就是每個國家對應(yīng)的 x 數(shù)值,銀牌的起始位置就是每個國家對應(yīng)的 x 數(shù)值再加上金牌柱狀圖的寬度,銅牌的起始位置與銀牌相似,加上兩倍的金牌位置即可(這里我們將每個柱狀圖的寬度均設(shè)置為 0.2)。
gold_x = x? silver_x = x + width ?bronze_x = x + 2 * width
在上述運(yùn)行完成后,分別繪制圖形即可。
plt.bar(gold_x,gold_medal,width=width,color="gold") ?plt.bar(silver_x,silver_medal,width=width,color="silver") ?plt.bar(bronze_x,bronze_medal,width=width, color="saddlebrown")
此時,我們注意到,繪制柱狀圖的橫坐標(biāo)是數(shù)字還沒有返回我們的國家參數(shù)。
對此,我們需要將 x 軸的坐標(biāo)變回來。
plt.xticks(x+width, labels=countries)?
最后,我們顯示出每一個柱狀圖的高度參數(shù)和圖例,就得到了我們需要的圖像。
for i in range(len(countries)): plt.text(gold_x[i],gold_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8) plt.text(silver_x[i],silver_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8) plt.text(bronze_x[i],bronze_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8) plt.legend()
代碼匯總:
#庫導(dǎo)入 from matplotlib import pyplot as plt import numpy as np #參數(shù)設(shè)置 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 100 plt.rcParams['figure.figsize'] = (5,3) #國家和獎牌數(shù)據(jù)導(dǎo)入 countries = ['挪威', '德國', '中國', '美國', '瑞典'] gold_medal = [16, 12, 9, 8, 8] silver_medal = [8, 10, 4, 10, 5] bronze_medal = [13, 5, 2, 7, 5] #將橫坐標(biāo)國家轉(zhuǎn)換為數(shù)值 x = np.arange(len(countries)) width = 0.2 #計(jì)算每一塊的起始坐標(biāo) gold_x = x silver_x = x + width bronze_x = x + 2 * width #繪圖 plt.bar(gold_x,gold_medal,width=width,color="gold",label="金牌") plt.bar(silver_x,silver_medal,width=width,color="silver",label="銀牌") plt.bar(bronze_x,bronze_medal,width=width, color="saddlebrown",label="銅牌") #將橫坐標(biāo)數(shù)值轉(zhuǎn)換為國家 plt.xticks(x + width,labels=countries) #顯示柱狀圖的高度文本 for i in range(len(countries)): plt.text(gold_x[i],gold_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8) plt.text(silver_x[i],silver_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8) plt.text(bronze_x[i],bronze_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8) #顯示圖例 plt.legend(loc="upper right")
其他知識點(diǎn):在 Matplotlib 中旋轉(zhuǎn) X 軸刻度標(biāo)簽文本。
(1) plt.xticks(rotation= ) 旋轉(zhuǎn) Xticks 標(biāo)簽文本。
(2) fig.autofmt_xdate(rotation= ) 旋轉(zhuǎn) Xticks 標(biāo)簽文本。
(3) ax.set_xticklabels(xlabels, rotation= ) 旋轉(zhuǎn) Xticks 標(biāo)簽文本。
(4) plt.setp(ax.get_xticklabels(), rotation=) 旋轉(zhuǎn) Xticks 標(biāo)簽文本。
(5) ax.tick_params(axis=‘x’, labelrotation= ) 旋轉(zhuǎn) Xticks 標(biāo)簽文本。
3. 堆疊柱狀圖
所謂堆疊柱狀圖就是將不同數(shù)組別的柱狀圖堆疊在一起,堆疊后的柱狀圖高度顯示了兩者相加的結(jié)果值。 如圖:
對該圖進(jìn)行分析可得:
(1) 金牌榜的起始高度為:銅牌數(shù)據(jù)+銀牌數(shù)據(jù)。
(2) 銀牌榜的起始高度為:銀牌高度。
(3) 銅牌榜的起始高度為:0。
(4) 起始位置的數(shù)據(jù)相加需要使用 numpy 的相關(guān)知識。
(6) 需要確定柱狀圖的顏色。
(7) 顯示圖例。
具體的繪制辦法,跟上一個同位置多柱狀圖是完全類似的,區(qū)別在于我們需要注意 bottom 的數(shù)值計(jì)算,同時,金銀銅牌的起始坐標(biāo)是完全相同的。
#庫導(dǎo)入 from matplotlib import pyplot as plt import numpy as np #參數(shù)設(shè)置 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 100 plt.rcParams['figure.figsize'] = (5,3) #國家和獎牌數(shù)據(jù)輸入、柱狀圖寬度設(shè)置 countries = ['挪威', '德國', '中國', '美國', '瑞典'] gold_medal = np.array([16, 12, 9, 8, 8]) silver_medal = np.array([8, 10, 4, 10, 5]) bronze_medal = np.array([13, 5, 2, 7, 5]) ?width = 0.3 #繪圖 plt.bar(countries, gold_medal, color='gold', label='金牌', bottom=silver_medal + bronze_medal,width=width) plt.bar(countries, silver_medal, color='silver', label='銀牌', bottom=bronze_medal,width=width) ?plt.bar(countries, bronze_medal, color='#A0522D', label='銅牌',width=width) #設(shè)置y軸標(biāo)簽,圖例和文本值 ?plt.ylabel('獎牌數(shù)') ?plt.legend(loc='upper right') ?for i in range(len(countries)): max_y = bronze_medal[i]+silver_medal[i]+gold_medal[i] plt.text(countries[i], max_y, max_y, va="bottom", ha="center")?
三、水平柱狀圖
1. 基本的柱狀圖
- 通過調(diào)用 Matplotlib 中的 barh() 函數(shù)可以生成水平柱狀圖。
- barh() 函數(shù)的用法與 bar() 函數(shù)的用法基本一樣,只是在調(diào)用 barh() 函數(shù)時使用 y 參數(shù)傳入 y 軸數(shù)據(jù),使用 width 參數(shù)傳入代表?xiàng)l柱寬度的數(shù)據(jù)。
- ha(horizontal alignment)控制文本的 x 位置參數(shù)表示文本邊界框的左邊,中間或右邊。
- va(vertical alignment)控制文本的 y位置參數(shù)表示文本邊界框的底部,中心或頂部。
plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
例如,我們以豎直柱狀圖當(dāng)中的國家金牌數(shù)為例進(jìn)行繪制。
countries = ['挪威', '德國', '中國', '美國', '瑞典'] gold_medal = np.array([16, 12, 9, 8, 8]) plt.barh(countries, width=gold_medal)
2. 同位置多柱狀圖
- 在同一個 y 軸位置繪制多個柱狀圖,主要是通過調(diào)整柱狀圖的寬度和每個柱狀圖 y 軸的起始位置。
- 例如,我們有最近三天當(dāng)中 3 部電影的票房變化的數(shù)據(jù)。
movie = ['新蝙蝠俠', '狙擊手', '奇跡笨小孩'] real_day1 = [4053, 2548, 1543] real_day2 = [7840, 4013, 2421] real_day3 = [8080, 3673, 1342]
對此,我們需要繪制如下圖像。
對該圖進(jìn)行分析可得:
(1) 由于牽扯高度的計(jì)算,因此先將 y 軸轉(zhuǎn)換為數(shù)值型。
(2) 需要設(shè)置同圖形的高度。
(3) 計(jì)算每個圖形高度的起始位置。
(4) 繪制圖形。
(5) 替換 y 軸數(shù)據(jù)。
由于牽扯計(jì)算,因此將數(shù)據(jù)轉(zhuǎn) numpy 數(shù)組,水平的用位置多柱狀圖繪制方法與豎直的完全相同,在此便不過多敘述了。
#庫導(dǎo)入 from matplotlib import pyplot as plt import numpy as np #參數(shù)設(shè)置 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 100 plt.rcParams['figure.figsize'] = (5,3) #數(shù)據(jù)的輸入 movie = ['新蝙蝠俠', '狙擊手', '奇跡笨小孩'] real_day1 = np.array( [4053, 2548, 1543]) ?real_day2 = np.array([7840, 4013, 2421]) ?real_day3 = np.array([8080, 3673, 1342]) ?? #y軸轉(zhuǎn)換為數(shù)值型 num_y = np.arange(len(movie)) ? #設(shè)置同圖形的高度 height = 0.2 ? #計(jì)算每個圖形高度的起始位置 movie1_start_y = num_y movie2_start_y = num_y + height movie3_start_y = num_y + 2 * height ? ? #繪制圖形? plt.barh(movie1_start_y, real_day1, height=height)? plt.barh(movie2_start_y, real_day2, height=height)? plt.barh(movie3_start_y, real_day3, height=height) ? # 計(jì)算寬度值和y軸值,替換y軸數(shù)據(jù) ?plt.yticks(num_y + height, movie)
3. 堆疊柱狀圖
水平的堆疊柱狀圖與豎直的堆疊柱狀圖類似都是將不同數(shù)組別的柱狀圖堆疊在一起,堆疊后的柱狀圖高度顯示了兩者相加的結(jié)果值。 如圖:
對該圖進(jìn)行分析可得:
(1) 確定圖形距離左側(cè)的位置。
(2) 設(shè)置同一寬度。
(3) 繪制圖形設(shè)置 left 參數(shù)。
(4) 標(biāo)注數(shù)據(jù)。
由于過程當(dāng)中牽扯到計(jì)算,因此需要將數(shù)據(jù)轉(zhuǎn) numpy 數(shù)組。其他部分與繪制豎直堆疊柱狀圖的過程類似,在此便不過多進(jìn)行敘述。
#庫導(dǎo)入 from matplotlib import pyplot as plt import numpy as np #參數(shù)設(shè)置 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 100 plt.rcParams['figure.figsize'] = (5,3) #數(shù)據(jù)的輸入 movie = ['新蝙蝠俠', '狙擊手', '奇跡笨小孩'] real_day1 = np.array( [4053, 2548, 1543]) real_day2 = np.array([7840, 4013, 2421]) real_day3 = np.array([8080, 3673, 1342]) ? #確定距離左側(cè)? left_day2 = real_day1? left_day3 = real_day1 + real_day2 ? # 設(shè)置線條高度 height = 0.2 ? # 繪制圖形: plt.barh(movie, real_day1, height=height)? plt.barh(movie, real_day2, left=left_day2, height=height) ? plt.barh(movie, real_day3, left=left_day3, height=height) ? # 設(shè)置數(shù)值文本,計(jì)算寬度值和y軸為值? sum_data = real_day1 + real_day2 +real_day3 for i in range(len(movie)): plt.text(sum_data[i], movie[i], sum_data[i],va="center" , ha="left")
四、直方圖 plt.hist()
- 直方圖(Histogram),又稱質(zhì)量分布圖,它是一種條形圖的一種,由一系列高度不等的縱向線段來表示數(shù)據(jù)分布的情況。 直方圖的橫軸表示數(shù)據(jù)類型,縱軸表示分布情況。
- 柱狀圖和直方圖的區(qū)別:
- 直方圖用于概率分布,它顯示了一組數(shù)值序列在給定的數(shù)值范圍內(nèi)出現(xiàn)的概率。
- 柱狀圖則用于展示各個類別的頻數(shù)。
柱狀圖 | 直方圖 |
---|---|
柱狀圖一般用于描述離散型分類數(shù)據(jù)的對比 | 直方圖一般用于描述連續(xù)型數(shù)據(jù)的分布關(guān)系 |
每根柱子寬度固定,柱子之間會有間距 | 每根柱子寬度可以不一樣,且一般沒有間距 |
橫軸變量可以任意排序 | 橫軸變量有一定順序規(guī)則 |
- 將統(tǒng)計(jì)值的范圍分段,即將整個值的范圍分成一系列間隔,然后計(jì)算每個間隔中有多少值。 直方圖也可以被歸一化以顯示相對頻率。 然后,它顯示了屬于幾個類別中的每個類別的占比,其高度總和等于 1。
- 其語法模板如下:
plt.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)
- 其參數(shù)具體如下含義:
- x:作直方圖所要用的數(shù)據(jù),必須是一維數(shù)組;多維數(shù)組可以先進(jìn)行扁平化再作圖;必選參數(shù)。
- bins:直方圖的柱數(shù),即要分的組數(shù),默認(rèn)為 10。
- weights:與 x 形狀相同的權(quán)重?cái)?shù)組;將 x 中的每個元素乘以對應(yīng)權(quán)重值再計(jì)數(shù);如果 normed 或 density 取值為 True,則會對權(quán)重進(jìn)行歸一化處理。這個參數(shù)可用于繪制已合并的數(shù)據(jù)的直方圖。
- density:布爾,可選。如果為 True,返回元組的第一個元素將會將計(jì)數(shù)標(biāo)準(zhǔn)化以形成一個概率密度,也就是說,直方圖下的面積(或積分)總和為 1。這是通過將計(jì)數(shù)除以數(shù)字的數(shù)量來實(shí)現(xiàn)的觀察乘以箱子的寬度而不是除以總數(shù)數(shù)量的觀察。如果疊加也是真實(shí)的,那么柱狀圖被規(guī)范化為 1(替代 normed)。
- bottom:數(shù)組,標(biāo)量值或 None;每個柱子底部相對于 y=0 的位置。如果是標(biāo)量值,則每個柱子相對于 y=0 向上/向下的偏移量相同。如果是數(shù)組,則根據(jù)數(shù)組元素取值移動對應(yīng)的柱子;即直方圖上下便宜距離。
- histtype:{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’};bar 是傳統(tǒng)的條形直方圖;barstacked 是堆疊的條形直方圖;step 是未填充的條形直方圖,只有外邊框;stepfilled 是有填充的直方圖;當(dāng) histtype 取值為 step 或 stepfilled,rwidth 設(shè)置失效,即不能指定柱子之間的間隔,默認(rèn)連接在一起。
- align:{‘left’, ‘mid’, ‘right’};left 是柱子的中心位于 bins 的左邊緣;mid 是柱子位于 bins 左右邊緣之間;right 是柱子的中心位于 bins 的右邊緣。
- color:具體顏色,數(shù)組(元素為顏色)或 None。
- label:字符串(序列)或 None;有多個數(shù)據(jù)集時,用 label 參數(shù)做標(biāo)注區(qū)分。
- normed: 是否將得到的直方圖向量歸一化,即顯示占比,默認(rèn)為 0,不歸一化;不推薦使用,建議改用 density 參數(shù)。
- edgecolor: 直方圖邊框顏色。
- alpha: 透明度。
- 例如,我們可以使用 np.random.randint 隨機(jī)生成 300 個在區(qū)間 [140,180](不包含 180)隨機(jī)數(shù)據(jù)。
x_value = np.random.randint(140,180,300) plt.hist(x_value, bins=10, edgecolor='white') plt.title("數(shù)據(jù)統(tǒng)計(jì)") plt.xlabel("身高") plt.ylabel("比率")
1. 返回值
- n:數(shù)組或數(shù)組列表,返回直方圖的值。
- bins:數(shù)組,返回各個 bin 的區(qū)間范圍。
- patches:列表的列表或列表,返回每個 bin 里面包含的數(shù)據(jù),是一個 list。
- 以上個例子進(jìn)行試驗(yàn),分別對 num,bins 和 patches 的返回值進(jìn)行觀察。
num #array([25., 28., 34., 39., 29., 25., 37., 34., 26., 23.]) bins_limit #array([140. , 143.9, 147.8, 151.7, 155.6, 159.5, 163.4, 167.3, 171.2, # 175.1, 179. ]) for i in patches: print(i) print(i.get_x()) print(i.get_y()) print(i.get_height()) print(i.get_width())
patches[0].get_width() #3.9000000000000057
- 知識點(diǎn)補(bǔ)充:
xy:xy 位置(x 取值 bins_limits 是分組時的分隔值,y 取值都是 0 開始)。
width:寬度為各個 bin 的區(qū)間范圍(bins_limits 是分組時的分隔值)。
height:高度也就是密度值(n 是分組區(qū)間對應(yīng)的頻率)。
angle:角度。
以最開始的直方圖為例,進(jìn)行上述參數(shù)的觀察。
2. 添加折線直方圖
- 在直方圖中,我們也可以加一個折線圖,輔助我們查看數(shù)據(jù)變化情況。
- 首先通過 pyplot.subplots() 創(chuàng)建 Axes 對象。
- 通過 Axes 對象調(diào)用 hist() 方法繪制直方圖,返回折線圖所需要的下 x,y 數(shù)據(jù)。
- 然后 Axes 對象調(diào)用 plot() 繪制折線圖。
- 我們對前面的代碼進(jìn)行修改即可。
#創(chuàng)建一個畫布 fig, ax = plt.subplots() ? # 繪制直方圖 num,bins_limit,patches = ax.hist(x_value, bins=10, edgecolor='white') ? # 注意num返回的個數(shù)是10,bins_limit返回的個數(shù)為11,需要截取 print(bins_limit[:-1]) # 曲線圖 ax.plot(bins_limit[:10], num, '--',marker="o") plt.xticks(bins_limit,rotation=45)
3. 不等距分組
面的直方圖都是等距的,但有時我們需要得到不等距的直方圖,這個時候只需要確定分組上下限,并指定 histtype=“bar” 就可以。
fig, ax = plt.subplots() x = np.random.normal(100,20,100) bins = [50, 60, 70, 90, 100,110, 140, 150] ax.hist(x, bins, color="g",rwidth=0.5) ax.set_title('不等距分組') plt.show()
4. 多類型直方圖
- 我們在使用直方圖查查看數(shù)據(jù)的頻率時,有時候會查看多種類型數(shù)據(jù)出現(xiàn)的頻率。
- 這時候我們可以以列表的形式傳入多種數(shù)據(jù)給 hist() 方法的 x 數(shù)據(jù)。
- 我們指定 10 個分組個數(shù),每組有 ABC 三類,分別生成 10000,5000,2000 個值,實(shí)際繪圖代碼與單類型直方圖差異不大,只是增加了一個圖例項(xiàng),在 ax.hist 函數(shù)中先指定圖例 label 名稱。
n_bins=10 ?fig,ax=plt.subplots(figsize=(8,5)) ?x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]] ?ax.hist(x_multi, n_bins, histtype='bar',label=list("ABC")) ?ax.set_title('多類型直方圖') ?ax.legend()
5. 堆疊直方圖
我們有時候會對吧同樣數(shù)據(jù)范圍情況下,對比兩組不同對象群體收集的數(shù)據(jù)差異。
對此,我們準(zhǔn)備兩組數(shù)據(jù):
x_value = np.random.randint(140,180,200) x2_value = np.random.randint(140,180,200)
直方圖屬性 data:以列表的形式傳入兩組數(shù)據(jù)。
設(shè)置直方圖 stacked:為 True,允許數(shù)據(jù)覆蓋。
plt.hist([x_value,x2_value],bins=10, stacked=True) #([array([16., 23., 27., 22., 13., 22., 18., 21., 18., 20.]), # array([39., 46., 44., 35., 33., 47., 41., 42., 33., 40.])], # array([140. , 143.9, 147.8, 151.7, 155.6, 159.5, 163.4, 167.3, 171.2, # 175.1, 179. ]),
五、餅狀圖 pie()
- 餅狀圖用來顯示一個數(shù)據(jù)系列,具體來說,餅狀圖顯示一個數(shù)據(jù)系列中各項(xiàng)目的占項(xiàng)目總和的百分比。
- Matplotlib 提供了一個 pie() 函數(shù),該函數(shù)可以生成數(shù)組中數(shù)據(jù)的餅狀圖。您可使用 x/sum(x) 來計(jì)算各個扇形區(qū)域占餅圖總和的百分比。
- pie() 函數(shù)的語法模板如下:
pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None)
- pie() 函數(shù)的參數(shù)說明如下:
- x:數(shù)組序列,數(shù)組元素對應(yīng)扇形區(qū)域的數(shù)量大小。
- labels:列表字符串序列,為每個扇形區(qū)域備注一個標(biāo)簽名字。
- colors:為每個扇形區(qū)域設(shè)置顏色,默認(rèn)按照顏色周期自動設(shè)置。
- autopct:格式化字符串 “fmt%pct”,使用百分比的格式設(shè)置每個扇形區(qū)的標(biāo)簽,并將其放置在扇形區(qū)內(nèi)。
- pctdistance:設(shè)置百分比標(biāo)簽與圓心的距離。
- labeldistance:設(shè)置各扇形標(biāo)簽(圖例)與圓心的距離。
- explode:指定餅圖某些部分的突出顯示,即呈現(xiàn)爆炸式。
- shadow:是否添加餅圖的陰影效果。
例如,我們將大小設(shè)置為 (5,5),定義餅的標(biāo)簽,每個標(biāo)簽所占的數(shù)量,繪制餅圖。
plt.rcParams['figure.figsize'] = (5,5) labels = ['娛樂','育兒','飲食','房貸','交通','其它'] ?x = [200,500,1200,7000,200,900] ?plt.pie(x,labels=labels) #[Text(1.09783,0.0690696,'娛樂'), # Text(1.05632,0.30689,'育兒'), # Text(0.753002,0.801865,'飲食'), # Text(-1.06544,-0.273559,'房貸'), # Text(0.889919,-0.646564,'交通'), # Text(1.05632,-0.30689,'其它')])
1. 百分比顯示 percentage
- autopct:格式化字符串。
- 我們定義餅的標(biāo)簽,每個標(biāo)簽所占的數(shù)量,%.2f%% 顯示百分比,保留 2 位小數(shù)。
labels = ['娛樂','育兒','飲食','房貸','交通','其它'] ?x = [200,500,1200,7000,200,900] ?plt.title("餅圖示例-8月份家庭支出") ?plt.pie(x,labels=labels,autopct='%.2f%%') #[Text(1.09783,0.0690696,'娛樂'), # Text(1.05632,0.30689,'育兒'), # Text(0.753002,0.801865,'飲食'), # Text(-1.06544,-0.273559,'房貸'), # Text(0.889919,-0.646564,'交通'), # Text(1.05632,-0.30689,'其它')], # [Text(0.598816,0.0376743,'2.00%'), # Text(0.576176,0.167395,'5.00%'), # Text(0.410728,0.437381,'12.00%'), # Text(-0.58115,-0.149214,'70.00%'), # Text(0.48541,-0.352671,'2.00%'), # Text(0.576176,-0.167395,'9.00%')])
2. 餅狀圖的分離
- explode:指定餅圖某些部分的突出顯示。
- 我們定義餅的標(biāo)簽,每個標(biāo)簽所占的數(shù)量,%.2f%% 顯示百分比,保留 2 位小數(shù)。
labels = ['娛樂','育兒','飲食','房貸','交通','其它'] x = [200,500,1200,7000,200,900] ?explode = (0.03,0.05,0.06,0.04,0.08,0.21) ?plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode)
3. 設(shè)置餅狀圖百分比和文本距離中心位置
- pctdistance:設(shè)置百分比標(biāo)簽與圓心的距離。
- labeldistance:設(shè)置各扇形標(biāo)簽(圖例)與圓心的距離。
labels = ['娛樂','育兒','飲食','房貸','交通','其它'] ?x = [200,500,1200,7000,200,900] ?explode = (0.03,0.05,0.06,0.04,0.08,0.1) ?plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode, labeldistance=1.35, pctdistance=1.2)
4. 圖例
labels = ['娛樂','育兒','飲食','房貸','交通','其它'] ?x = [200,500,1200,7000,200,900] ?explode = (0.03,0.05,0.06,0.04,0.08,0.1) ?plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode, labeldistance=1.35, pctdistance=1.2) plt.legend()
可以通過設(shè)置 x,y 的刻度一樣,使其餅圖為正圓 plt.axis(‘equal’)。
總結(jié)
到此這篇關(guān)于Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖的文章就介紹到這了,更多相關(guān)Matplotlib柱狀圖、直方圖和餅狀圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)寫數(shù)字文件名的遞增保存文件方法
今天小編就為大家分享一篇python實(shí)現(xiàn)寫數(shù)字文件名的遞增保存文件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10基于Python中單例模式的幾種實(shí)現(xiàn)方式及優(yōu)化詳解
下面小編就為大家分享一篇基于Python中單例模式的幾種實(shí)現(xiàn)方式及優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Python趣味挑戰(zhàn)之turtle庫繪畫飄落的銀杏樹
銀杏還是和恐龍同時代的植物,被稱為活化石,適應(yīng)能力強(qiáng),生長期漫長,壽命可達(dá)千年.因此,銀杏是長壽的代表和象征,接下來用Python的turtle庫來繪畫銀杏樹唯美的一幕,需要的朋友可以參考下2021-05-05Python3 執(zhí)行Linux Bash命令的方法
今天小編就為大家分享一篇Python3 執(zhí)行Linux Bash命令的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07