Matplotlib - 直方圖



直方圖就像一個視覺摘要,它顯示了資料集中不同值出現的頻率。想象一下,你有一組數字,比如人們的年齡。直方圖將這些數字分成組,稱為“區間”,然後使用條形表示每個區間中有多少個數字。條形越高,該組中的數字就越多。

Histogram

Matplotlib 中的直方圖

我們可以使用 hist() 函式在 Matplotlib 中建立直方圖。此函式允許我們自定義直方圖的各個方面,例如區間的數量、顏色和透明度。Matplotlib 中的直方圖用於表示數值資料的分佈,幫助你識別模式。

hist() 函式

Matplotlib 中的 hist() 函式以資料集作為輸入,並將其劃分為區間(區間)。然後,它將落在每個區間內的資料點的頻率(計數)顯示為條形圖。

以下是 Matplotlib 中 hist() 函式的語法:

語法

plt.hist(x, bins=None, range=None, density=False, cumulative=False, color=None, edgecolor=None, ...)

其中,

  • x 是確定直方圖的輸入資料。

  • bins(可選) 是區間的數量或區間邊緣。

  • range(可選) 是區間的下限和上限。預設值為 x 的最小值和最大值

  • 如果 density(可選) 為 True,則直方圖表示機率密度函式。預設為 False。

  • 如果 cumulative(可選) 為 True,則計算累積直方圖。預設為 False。

這些只是一些引數;還有更多可選引數可用於自定義。

建立垂直直方圖

在 Matplotlib 中,建立垂直直方圖涉及繪製資料集頻率分佈的圖形表示,其中條形沿 y 軸垂直排列。每個條形表示沿 x 軸特定區間或區間內資料點的頻率或計數。

示例

在以下示例中,我們透過在 hist() 函式中將“orientation”引數設定為“vertical”來建立垂直直方圖:

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
x = [1, 2, 3, 1, 2, 3, 4, 1, 3, 4, 5]
plt.hist(x, orientation="vertical")
plt.show()

輸出

我們得到如下所示的輸出:

Vertical Histogram

帶密度的自定義直方圖

當我們使用密度建立直方圖時,我們提供了資料的分佈情況的視覺摘要。我們使用此圖形來檢視不同數字出現的可能性,而 density 選項確保直方圖下方的總面積歸一化為 1。

示例

在以下示例中,我們將隨機資料視覺化為具有 30 個區間的直方圖,以綠色顯示並帶有黑色邊緣。我們使用 density=True 引數來表示機率密度:

import matplotlib.pyplot as plt
import numpy as np

# Generate random data
data = np.random.randn(1000)

# Create a histogram with density and custom color
plt.hist(data, bins=30, density=True, color='green', edgecolor='black', alpha=0.7)
plt.xlabel('Values')
plt.ylabel('Probability Density')
plt.title('Customized Histogram with Density')
plt.show()

輸出

執行上述程式碼後,我們將得到以下輸出:

Customized Histogram with Density

累積直方圖

當我們建立累積直方圖時,我們以圖形方式表示直到某個點為止值的總出現次數。它顯示了多少資料點低於或等於某個值。

示例

在這裡,我們使用一個直方圖,其中每個條形代表一個考試分數範圍,而條形的高度告訴我們總共有多少學生獲得了該範圍內的分數。透過在 hist() 函式中設定 cumulative=True 引數,我們確保直方圖顯示分數的累積進展:

import matplotlib.pyplot as plt
import numpy as np

# Generate random exam scores (out of 100)
exam_scores = np.random.randint(0, 100, 150)

# Create a cumulative histogram
plt.hist(exam_scores, bins=20, cumulative=True, color='orange', edgecolor='black', alpha=0.7)
plt.xlabel('Exam Scores')
plt.ylabel('Cumulative Number of Students')
plt.title('Cumulative Histogram of Exam Scores')
plt.show()

輸出

以下是上述程式碼的輸出:

Cumulative Histogram

具有不同顏色和邊緣顏色的直方圖

建立直方圖時,我們可以自定義填充顏色和邊緣顏色,為表示資料分佈新增視覺效果。透過這樣做,我們將直方圖與時尚和獨特的視覺效果融為一體。

示例

現在,我們正在為隨機資料生成一個具有 25 個區間的直方圖,並以紫色顯示並帶有藍色邊緣:

import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(1000)

# Creating a histogram with different color and edge color
plt.hist(data, bins=25, color='purple', edgecolor='blue')
plt.xlabel('Values')
plt.ylabel('Frequency')
plt.title('Histogram with Different Color and Edge Color')
plt.show()

輸出

執行上述程式碼後,我們將得到以下輸出:

Histogram with Different Color and Edge Color

示例

要繪製帶顏色的直方圖,我們還可以從 setp() 方法中的“cm”引數中提取顏色。

import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
data = np.random.random(1000)
n, bins, patches = plt.hist(data, bins=25, density=True, color='red', rwidth=0.75)
col = (n-n.min())/(n.max()-n.min())
cm = plt.cm.get_cmap('RdYlBu')
for c, p in zip(col, patches):
   plt.setp(p, 'facecolor', cm(c))
plt.show()

輸出

執行上述程式碼後,我們將得到以下輸出:

Colormap Histogram

示例

在這裡,我們透過迭代區間數量的範圍併為每個條形設定隨機 facecolor 來為 Matplotlib 直方圖中的不同條形指定不同的顏色:

import numpy as np
import matplotlib.pyplot as plt
import random
import string

# Set the figure size
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# Figure and set of subplots
fig, ax = plt.subplots()

# Random data
data = np.random.rand(100)

# Plot a histogram with random data
N, bins, patches = ax.hist(data, edgecolor='black', linewidth=1)

# Random facecolor for each bar
for i in range(len(N)):
   patches[i].set_facecolor("#" + ''.join(random.choices("ABCDEF" + string.digits, k=6)))

# Display the plot
plt.show()

輸出

執行上述程式碼後,我們將得到以下輸出:

Different Color Bars

具有多個數據集的堆疊直方圖

具有多個數據集的堆疊直方圖是一種視覺表示,它組合了兩個或多個數據集的分佈。條形彼此堆疊,從而可以比較不同資料集如何影響整體分佈。

示例

在下面的示例中,我們使用特定值表示兩個不同的資料集“data1”和“data2”,並以不同的顏色(天藍色和鮭魚色)顯示它們的分佈:

import matplotlib.pyplot as plt
import numpy as np

# Sample data for two datasets
data1 = np.array([2, 4, 5, 7, 9, 10, 11, 13, 14, 15])
data2 = np.array([6, 7, 8, 10, 11, 12, 13, 14, 15, 16])

# Creating a stacked histogram with different colors
plt.hist([data1, data2], bins=10, stacked=True, color=['skyblue', 'salmon'], edgecolor='black')
plt.xlabel('Values')
plt.ylabel('Frequency')
plt.title('Stacked Histogram with Multiple Datasets')
plt.legend(['Dataset 1', 'Dataset 2'])
plt.show()

輸出

執行上述程式碼後,我們將得到以下輸出:

Stacked Histogram with Multiple Datasets
廣告