前言
用matplotlib生成基本圖形非常簡單,只需要幾行代碼,但要創建復雜的圖表,需要呼叫更多的命令和反復試驗,這要求用戶對matplotlib有深入的認識,
我們推出一個新的系列教程:Python資料可視化,針對初級和中級用戶,將理論和示例代碼相結合,分別使用matplotlib, seaborn, plotly等工具實作可視化,
PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視頻、PDF檔案等
本文主題是如何用Matplotlib創建直方圖和密度圖,
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
1. 頻數表
直方圖(histogram)是探索數值型變數分布的方法,例如單峰還是雙峰分布,是否接近鐘型分布,左偏還是右偏等,
在創建直方圖之前,首先要了解一個概念:頻數表,
什么是頻數表(frequency table)?
給定一個數值變數,將變數的極差(最大值與最小值的差)均勻地分割為多個等距分段,然后統計落入每個分段的數值個數,
讓我們看一個具體的例子,
# 生成數值變數,假設服從標準正態分布
np.random.seed(123)
x = np.random.randn(100)
# 定義分段的數量
bins = 10
# 將變數均勻地分割為多個等距分段
breaks = np.linspace(np.min(x), np.max(x), bins)
# 統計落入每個分段的數值個數
counts = {}
for i in range(len(breaks) - 1):
left, right = breaks[i], breaks[i+1]
label = f"({left:.2f}, {right:.2f}]"
count = 0
for val in x:
if val > left and val <= right:
count += 1
counts.update({label: count})
counts
{'(-2.80, -2.22]': 1,
'(-2.22, -1.65]': 3,
'(-1.65, -1.07]': 14,
'(-1.07, -0.49]': 17,
'(-0.49, 0.09]': 18,
'(0.09, 0.66]': 12,
'(0.66, 1.24]': 19,
'(1.24, 1.82]': 10,
'(1.82, 2.39]': 5}
首先我們生成了100個標準正態變數,然后劃分為10個等距的分段,然后統計了落入每個分段的數值個數,
例如落入'(-2.8, -2.22]'分段的個數有1個,而落入'(-0.49, 0.09]'分段的個數有18個,結果符合預期,
有更簡單的方法實作頻數表,呼叫pd.cut()函式,
pd.cut(pd.Series(x), bins=breaks, precision=2).value_counts()
(0.66, 1.24] 19
(-0.49, 0.085] 18
(-1.07, -0.49] 17
(-1.65, -1.07] 14
(0.085, 0.66] 12
(1.24, 1.82] 10
(1.82, 2.39] 5
(-2.22, -1.65] 3
(-2.8, -2.22] 1
dtype: int64
2. 直方圖
直方圖是頻數表的可視化表達,x軸是等距,y軸是頻數統計,通常用于探索數值變數的分布,
呼叫matplotlib.pyplot的hist()可以實作直方圖,
fig, ax = plt.subplots(figsize=(10, 7))
ax.hist(x, bins=10, rwidth=0.85)
ax.set_title("Simple Histogram")
如果資料集有多個數值變數,可以在同一幅圖中對比它們的分布,
當在同一幅圖中創建多個直方圖時,需要調整一下柱子的樣式,才能得到較好的視覺效果,
np.random.seed(123)
x1 = np.random.normal(0, 1, size=1000)
x2 = np.random.normal(-2, 3, size=1000)
x3 = np.random.normal(3, 2.5, size=1000)
# 當在同一幅圖表中創建多個直方圖,最好使用'stepfilled',并調整透明度
kwargs = {
"bins": 40,
"histtype": "stepfilled",
"alpha": 0.5
}
fig, ax = plt.subplots(figsize=(10, 7))
ax.hist(x1, label="x1", **kwargs)
ax.hist(x2, label="x2", **kwargs)
ax.hist(x3, label="x3", **kwargs)
ax.set_title("Histogram for multiple variables")
ax.legend()
3. 密度圖
密度圖是與直方圖密切相關的概念,它用一條連續的曲線表示變數的分布,可以理解為直方圖的”平滑版本“,
統計學經典理論假設樣本資料來源于總體,而總體資料會服從某個分布(如正態分布,二項式分布等),密度圖采用”核密度統計量“來估計代表總體的隨機變數的概率密度函式,
密度估計的課題比較復雜,這里不做深入,為了實作密度圖,需要先創建一個資料框(pd.DataFrame),然后呼叫df.plot.density(),
np.random.seed(123)
x1 = np.random.normal(-10, 5, 1000)
x2 = np.random.normal(5, 10, 1000)
df = pd.DataFrame({"x1": x1, "x2": x2})
fig, ax = plt.subplots(figsize=(10, 7))
df.plot(kind="density", ax=ax, linewidth=3, title="Density Plot")
df.plot(kind="hist", ax=ax, density=True, legend=False)
<matplotlib.axes._subplots.AxesSubplot at 0x7fa977d155b0>
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
作者:蜂鳥資料Trochil
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/36412.html
標籤:Python
上一篇:111二叉樹的最小深度
