欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖

 更新時間:2023年12月11日 16:39:53   作者:虛心求知的熊  
這篇文章主要給大家介紹了關(guān)于Python利用Matplotlib繪制柱狀圖(豎直柱狀圖和水平柱狀圖)、直方圖和餅狀圖的相關(guān)資料,Python使用matplotlib畫圖是非常方便的,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在開始,我們先引入 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ù)字文件名的遞增保存文件方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)寫數(shù)字文件名的遞增保存文件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python運(yùn)算符號詳細(xì)介紹

    python運(yùn)算符號詳細(xì)介紹

    大家好,本篇文章主要講的是python運(yùn)算符號詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 基于Python中單例模式的幾種實(shí)現(xiàn)方式及優(yōu)化詳解

    基于Python中單例模式的幾種實(shí)現(xiàn)方式及優(yōu)化詳解

    下面小編就為大家分享一篇基于Python中單例模式的幾種實(shí)現(xiàn)方式及優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Python趣味挑戰(zhàn)之turtle庫繪畫飄落的銀杏樹

    Python趣味挑戰(zhàn)之turtle庫繪畫飄落的銀杏樹

    銀杏還是和恐龍同時代的植物,被稱為活化石,適應(yīng)能力強(qiáng),生長期漫長,壽命可達(dá)千年.因此,銀杏是長壽的代表和象征,接下來用Python的turtle庫來繪畫銀杏樹唯美的一幕,需要的朋友可以參考下
    2021-05-05
  • Python3如何在服務(wù)器打印資產(chǎn)信息

    Python3如何在服務(wù)器打印資產(chǎn)信息

    這篇文章主要介紹了Python3如何在服務(wù)器打印資產(chǎn)信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 以Flask為例講解Python的框架的使用方法

    以Flask為例講解Python的框架的使用方法

    這篇文章主要介紹了Python的框架的使用方法,文中以Flask框架的安裝為例進(jìn)行講解,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • PyInstaller?完美打包?Python?腳本

    PyInstaller?完美打包?Python?腳本

    PyInstaller?是一個用于將?Python?腳本打包成可執(zhí)行文件的工具,支持?Windows、Linux?和?macOS?等多個平臺。它可以將?Python?腳本及其依賴項(xiàng)打包成一個獨(dú)立的可執(zhí)行文件,方便用戶在沒有?Python?環(huán)境的機(jī)器上運(yùn)行程序。
    2023-06-06
  • Python3 執(zhí)行Linux Bash命令的方法

    Python3 執(zhí)行Linux Bash命令的方法

    今天小編就為大家分享一篇Python3 執(zhí)行Linux Bash命令的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python中psutil模塊使用匯總

    Python中psutil模塊使用匯總

    psutil模塊是一個跨平臺庫,用于檢索Python中運(yùn)行進(jìn)程和系統(tǒng)利用率(CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)、傳感器)的信息。它主要用于系統(tǒng)監(jiān)視、分析和限制進(jìn)程資源以及管理正在運(yùn)行的進(jìn)程,本文給大家介紹Python中psutil模塊使用匯總,感興趣的朋友一起看看吧
    2021-12-12
  • centos7之Python3.74安裝教程

    centos7之Python3.74安裝教程

    這篇文章主要介紹了centos7之Python3.74安裝教程,本文給大家介紹的非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-08-08

最新評論