You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:12:02