日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python绘制概率密度曲线_[python常用图件绘制#04]核密度曲线图(峰值点显示)

發布時間:2024/10/8 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python绘制概率密度曲线_[python常用图件绘制#04]核密度曲线图(峰值点显示) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、關于核密度估計帶寬的一些說明

進行核密度估計Kernel Density Estimation(KDE)時,帶寬bw的選取尤為重要,不同的帶寬會對結果造成很大的影響。利用seaborn庫中kdeplot()繪制kde曲線時,可以選擇scott和silverman兩種自適應帶寬方法。

1-1

1-2

二、例圖

2-1

樣本數據的統計信息及其KDE曲線信息2-2

三、代碼3-1

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

import seaborn as sns

import statsmodels.nonparametric.api as smnp

def kde_test(data, kernel, bw, gridsize, cut):

"""

:param data:有限樣本數據

:param kernel:核函數

:param bw:帶寬

:param gridsize:繪制擬合曲線中的離散點數;可理解為精度,會改變kde曲線的圓滑程度

:param cut: 源代碼說明——Draw the estimate to cut * bw from the extreme data points.

:return: kde估計曲線的x、y坐標

"""

fft = kernel == "gau"

kde = smnp.KDEUnivariate(data)

kde.fit(kernel, bw, fft, gridsize=gridsize, cut=cut)

return kde.support, kde.density

class Kdefitplot:

def __init__(self, data, kernel='gau', bw="scott", legends=None, labels=None, fsize=(10, 6.18), show_point=False, show_info=True):

"""

:param data:以列表格式存儲的數據

:param kernel:密度估計選用的核函數,可選{'gau'|'cos'|'biw'|'epa'|'tri'|‘triw’},默認為'gau'

:param bw:密度估計選用的自適應帶寬方法,可選{'scott'|'silverman'|scalar|pair of scalars},默認為"scott"

:param legends: 圖例名,默認為 "概率密度", "kde曲線", "最大值點"

:param labels:坐標軸標題名,默認為 "數據x", "概率密度"

:param show_info:是否顯示擬合結果信息,默認為True

:param show_point:在kde曲線上顯示目標點(最大值點),默認為False

"""

self.data = data

self.kernel = kernel

self.bw = bw

if legends is None:

legends = ["概率密度", "kde曲線", "最大值點"]

if labels is None:

labels = ["樣本數據", "概率密度"]

self.legends = legends

self.labels = labels

self.fsize = fsize

self.show_info = show_info

self.show_point = show_point

self.gridsize = 100

self.cut = 3

def change_legend(self, new_legends):

# 更改圖例

self.legends = new_legends

def change_label(self, new_labels):

# 更改坐標軸標題

self.labels = new_labels

def draw_plot(self):

# 利用seaborn庫對字體大小進行統一設置,為fgsize[1]的0.12倍,即畫布縱向大小為1000時,font_scale=1.2

sns.set_style("darkgrid")

sns.set_context("talk", font_scale=self.fsize[1] * 0.15)

plt.rcParams['font.sans-serif'] = ['SimHei']

matplotlib.rcParams['axes.unicode_minus'] = False

plt.figure(figsize=self.fsize)

# 繪制頻率直方圖

sns.distplot(self.data, label=self.legends[0], rug=True, kde=True, kde_kws={"color": "g", "lw": 0})

# 以gau為核函數,scott為帶寬估計方法

sns.kdeplot(self.data,

kernel=self.kernel,

bw=self.bw,

label=self.legends[1],

color="r",

linewidth=self.fsize[0]*0.2

)

# 計算kde曲線的x、y值

kdefit_x, kdefit_y = kde_test(self.data,

self.kernel,

self.bw,

gridsize=self.gridsize,

cut=self.cut)

# point為kde曲線最大值點

point = np.where(kdefit_y == np.max(kdefit_y))

# 在kde曲線上顯示目標點,格式為黑色實心圓

if self.show_point:

plt.plot(kdefit_x[point], kdefit_y[point], "o", color='k', linewidth=self.fsize[0]*0.4, label=self.legends[2])

# 打印統計信息

if self.show_info:

# 顯示核密度估計信息:kernel為核函數、bw為自適應帶寬方法、point為kde曲線最大值點

# 基本統計信息:Size為樣本數據點個數、Average為平均值、Q25/Q50/Q75分別為25%/50%/75%分位數

q25, q50, q75 = [round(q, 4) for q in np.percentile(self.data, [25, 50, 75])]

base_info = f"Size:{len(self.data)}\nAver:{np.mean(self.data)}\nQ25:{q25}; Q50:{q50}; Q75:{q75}\n\n"

kde_info = f"kernel:{self.kernel}\nbw:{self.bw}\nMax point appear in {kdefit_x[point]}\n"

print(base_info + kde_info)

# 設置x、y坐標軸標題

plt.xlabel(self.labels[0])

plt.ylabel(self.labels[1])

plt.legend()

plt.tight_layout()

if __name__ == "__main__":

iqs_1 = 100 + 15 * np.random.randn(500) ?# 待繪制直方圖的數據

iqs_2 = 200 + 75 * np.random.randn(500)

kdeplot1 = Kdefitplot(iqs_1 + iqs_2, show_point=True)

kdeplot1.draw_plot()

plt.show()

總結

以上是生活随笔為你收集整理的python绘制概率密度曲线_[python常用图件绘制#04]核密度曲线图(峰值点显示)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。