如何使用Python按n秒间隔拆分垂直分箱直方图并同图展示
需求说明
- 现有2列CSV数据:第一列为秒级时间戳,第二列为取值范围在-1~1的对应数值,示例数据如下:
0,0.04408189999999999 1000,0.017673066666666678 2000,0.05512853333333334 3000,0.04731979999999998 4000,0.007375333333333322 5000,-0.0173186 6000,-0.030183500000000016 7000,-0.09746066666666667 8000,-0.11819146666666666 9000,-0.1189849333333333 10000,-0.10441406666666667 11000,-0.09025903333333336 12000,-0.14047866666666667 13000,-0.09634883333333336 14000,-0.09841593333333337 15000,-0.10307009999999997 16000,-0.08617349999999996 17000,-0.09265753333333335 18000,-0.11357536666666662 19000,-0.0669533666666667 20000,-0.05702283333333334 21000,-0.018528333333333317 22000,-0.0845192666666667 23000,-0.11929543333333334 24000,-0.12107416666666668
- 原有代码仅可生成全时间段数值的频率直方图,现有需求为生成不同时间节点(t=100s、t=200s、t=300s…)的频率直方图,且所有直方图整合在同一张画布中,呈现分层分布效果。
实现方案
你可以通过matplotlib手动绘制分层直方图,也可以使用joypy库快速生成山脊图(即预期效果),以下是两种实现方式:
方式1:纯matplotlib实现(无需额外安装第三方库)
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 1. 读取数据 df = pd.read_csv('你的数据文件路径.csv', names=['time', 'value']) # 2. 按时间窗口分组,可自行调整窗口大小 time_window = 100 df['time_group'] = (df['time'] // time_window) * time_window groups = sorted(df['time_group'].unique()) n_groups = len(groups) # 3. 配置绘图参数 bins = [-1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] offset = 0.5 # 每组直方图的垂直偏移量,可调整疏密 fig, ax = plt.subplots(figsize=(10, 8)) # 4. 逐层绘制直方图 for i, group in enumerate(groups): group_values = df[df['time_group'] == group]['value'] # 计算频次 counts, _ = np.histogram(group_values, bins=bins, density=True) # 水平直方图的y轴为bins中点,加上偏移量实现分层 y = (np.array(bins[:-1]) + np.array(bins[1:])) / 2 ax.barh(y + i*offset, counts, height=0.08, color='#1f77b4', edgecolor='white', alpha=0.8) # 标注时间组 ax.text(max(counts)*1.1, i*offset, f't={group}s', va='center', fontsize=8) # 5. 调整坐标轴样式 ax.set_yticks([i*offset for i in range(n_groups)]) ax.set_yticklabels([f't={g}s' for g in groups]) ax.set_xlabel('频率', fontsize=10) ax.set_ylabel('数值', fontsize=10) ax.grid(False) plt.tight_layout() plt.show()
方式2:使用joypy库快速生成山脊图
首先安装依赖:pip install joypy
import pandas as pd import joypy import matplotlib.pyplot as plt # 1. 读取数据并分组 df = pd.read_csv('你的数据文件路径.csv', names=['time', 'value']) time_window = 100 df['时间节点'] = (df['time'] // time_window).apply(lambda x: f't={x*time_window}s') # 2. 绘制山脊图 bins = [-1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] fig, axes = joypy.joyplot(df, by='时间节点', column='value', bins=bins, figsize=(10,8), color='#1f77b4', edgecolor='white', grid=False, overlap=0.5) plt.xlabel('数值', fontsize=10) plt.show()
参数调整说明
- 如果你需要调整时间窗口大小,修改
time_window变量即可,比如要按1000s分组就设为1000 - 直方图的疏密可通过调整offset(方式1)或overlap(方式2)参数修改
- 颜色、柱子高度、字体大小等样式参数可根据需求自行调整
内容的提问来源于stack exchange,提问作者LuvCode
相关产品推荐
相关产品推荐

