python直方密度图_Python数据可视化:一文读懂直方图和密度图
一图胜千言,使用Python的matplotlib库,可以快速创建高质量的图形。
用matplotlib生成基本图形非常简单,只需要几行代码,但要创建复杂的图表,需要调用更多的命令和反复试验,这要求用户对matplotlib有深入的认识。
我们推出一个新的系列教程:Python数据可视化,针对初级和中级用户,将理论和示例代码相结合,分别使用matplotlib, seaborn, plotly等工具实现可视化。
本文主题是如何用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)
如果喜欢我们的文章,记得点赞和收藏哦,我们每天都会为大家带来Python,数据科学和量化交易的精品内容。
【关于我们】
蜂鸟数据:国内领先的金融数据API提供商。
蜂鸟数据团队由业界顶尖的数据工程师,数据科学家和宽客组成,我们正努力构建一个强大的金融数据库,并提供API接口,目标是令金融数据开源化和平民化。
浏览并测试我们接口吧,目前覆盖股票,外汇,商品期货,数字货币和宏观经济领域,包括实时报价(tick)和历史数据(分钟),提供REST API和Websocket两种接入方式,能够满足金融分析师,量化交易和理财app的需求。需要金融数据?利用蜂鸟API将数据整合到您的应用trochil.github.io
如果您准备好了,请登录蜂鸟官网,注册免费获取API密钥,然后开始探索我们的金融数据库吧。登录蜂鸟官网,注册免费获取API密钥trochil.cn
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
