能否用Matplotlib基于Pandas OHLC DataFrame生成热力图?
用OHLC DataFrame创建可后续填充的热力图框架
没问题,咱们可以一步步实现你的需求:先搭建带时间X轴和价格Y轴的空热力图,之后再根据坐标填充数值。核心思路是把连续的时间和价格离散成热力图的网格刻度,先初始化全0矩阵,后续再更新对应位置的值。
步骤1:数据预处理
首先处理你的OHLC数据,先把日期列转为时间类型,然后确定我们要用到的时间范围和价格范围,再把它们离散成热力图的网格刻度:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 加载你的样本数据(这里直接用你提供的样本) data = [ ["2020-06-19 10:40:00", 9310.57, 9316.87, 9310.52, 9314.71, 109.573868], ["2020-06-19 10:45:00", 9314.71, 9324.21, 9306.56, 9320.25, 129.816444], ["2020-06-19 10:50:00", 9320.25, 9323.86, 9314.26, 9317.37, 112.909240], ["2020-06-19 10:55:00", 9317.31, 9319.02, 9310.05, 9314.79, 157.487928], ["2020-06-19 11:00:00", 9314.80, 9342.17, 9314.80, 9334.07, 301.985491], ["2020-06-19 11:05:00", 9334.07, 9355.90, 9334.06, 9343.76, 624.541439], ["2020-06-19 11:10:00", 9343.77, 9353.36, 9336.38, 9345.71, 153.591210], ["2020-06-19 11:15:00", 9346.72, 9438.30, 9346.72, 9398.82, 1459.348233], ["2020-06-19 11:20:00", 9398.83, 9406.86, 9385.25, 9394.99, 307.343729], ["2020-06-19 11:25:00", 9395.00, 9397.81, 9377.06, 9386.17, 215.678055], ["2020-06-19 11:30:00", 9386.18, 9396.84, 9351.88, 9365.08, 324.145505], ["2020-06-19 11:35:00", 9367.15, 9379.82, 9358.21, 9371.96, 188.802239], ["2020-06-19 11:40:00", 9371.97, 9380.00, 9368.22, 9371.03, 95.100650], ["2020-06-19 11:45:00", 9370.24, 9378.87, 9358.00, 9358.86, 111.930889], ["2020-06-19 11:50:00", 9359.32, 9367.78, 9342.52, 9351.47, 273.599862], ["2020-06-19 11:55:00", 9351.47, 9365.68, 9351.47, 9363.57, 77.122527], ["2020-06-19 12:00:00", 9363.82, 9373.21, 9355.77, 9361.27, 166.722086], ["2020-06-19 12:05:00", 9361.28, 9381.41, 9361.27, 9371.41, 98.490743], ["2020-06-19 12:10:00", 9371.41, 9378.96, 9363.94, 9373.19, 100.483367], ["2020-06-19 12:15:00", 9373.14, 9376.86, 9361.27, 9362.64, 73.689763], ["2020-06-19 12:20:00", 9362.63, 9376.27, 9358.01, 9371.64, 92.106250], ["2020-06-19 12:25:00", 9371.64, 9371.64, 9362.10, 9366.00, 61.709334], ["2020-06-19 12:30:00", 9366.00, 9377.15, 9365.99, 9376.50, 74.942303], ["2020-06-19 12:35:00", 9376.50, 9381.93, 9367.90, 9370.82, 138.875451], ["2020-06-19 12:40:00", 9370.48, 9375.52, 9363.57, 9369.87, 131.790387], ["2020-06-19 12:45:00", 9369.88, 9385.96, 9361.52, 9381.88, 138.910113], ["2020-06-19 12:50:00", 9380.52, 9394.99, 9380.46, 9384.19, 269.314943], ["2020-06-19 12:55:00", 9383.80, 9392.88, 9378.42, 9391.73, 109.402498], ["2020-06-19 13:00:00", 9391.69, 9400.00, 9389.98, 9397.36, 198.995964], ["2020-06-19 13:05:01", 9397.40, 9403.00, 9397.40, 9397.60, 58.666886] ] df = pd.DataFrame(data, columns=["Date", "Open", "High", "Low", "Close", "Volume"]) df["Date"] = pd.to_datetime(df["Date"]) # 1. 处理X轴:时间刻度,用每个K线的时间作为热力图的X坐标 time_labels = df["Date"].dt.strftime("%H:%M") # 格式化时间为小时分钟,方便显示 x_ticks = np.arange(len(time_labels)) # 2. 处理Y轴:价格刻度,我们可以把价格区间分成若干个bin(比如按整数价格分,或者自定义步长) price_min = df["Low"].min() price_max = df["High"].max() price_bin_step = 5 # 每5个价格单位为一个Y网格 price_bins = np.arange(np.floor(price_min), np.ceil(price_max) + price_bin_step, price_bin_step) y_ticks = np.arange(len(price_bins)-1) # 每个bin对应一个Y坐标 price_labels = [f"{int(b)}-{int(b+price_bin_step)}" for b in price_bins[:-1]]
步骤2:创建空热力图框架
初始化一个全0的热力矩阵,然后画出空图,设置好XY轴的刻度和标签:
# 初始化空的热力矩阵:行数是价格bin的数量,列数是时间K线的数量 heatmap_data = np.zeros((len(y_ticks), len(x_ticks))) # 创建画布和轴 fig, ax = plt.subplots(figsize=(12, 8)) im = ax.imshow(heatmap_data, cmap="viridis", aspect="auto", origin="lower") # 设置XY轴刻度和标签 ax.set_xticks(x_ticks) ax.set_yticks(y_ticks) ax.set_xticklabels(time_labels) ax.set_yticklabels(price_labels) # 旋转X轴标签,避免重叠 plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor") # 添加标题和颜色条 ax.set_title("OHLC热力图(初始为空)") fig.colorbar(im, ax=ax, label="数值(待填充)") fig.tight_layout() plt.show()
运行这段代码就能得到一个带正确XY轴的空热力图,所有值都是0,呈现为单一颜色。
步骤3:根据XY坐标填充数值
现在你可以根据每个K线的时间位置和价格区间,填充对应的热力值。比如我们可以用成交量Volume作为填充值,把每个K线覆盖的价格bin对应的位置填充成交量:
# 遍历每个K线,填充对应的热力值 for idx, row in df.iterrows(): # 找到当前K线对应的X坐标(就是它的索引) x_idx = idx # 找到当前K线的Low和High覆盖的价格bin的Y坐标范围 low_bin_idx = np.digitize(row["Low"], price_bins) - 1 high_bin_idx = np.digitize(row["High"], price_bins) - 1 # 填充对应的网格:比如把成交量赋值给这些位置 heatmap_data[low_bin_idx:high_bin_idx+1, x_idx] = row["Volume"] # 更新热力图并重新绘制 im.set_data(heatmap_data) im.set_clim(vmin=heatmap_data.min(), vmax=heatmap_data.max()) # 更新颜色范围 ax.set_title("OHLC热力图(已填充成交量)") fig.colorbar(im, ax=ax, label="成交量") plt.show()
这样就能得到填充了数值的热力图,你也可以替换成其他指标(比如价格波动幅度、成交量加权价格等)来填充。
关键说明
- 价格bin的步长可以根据你的数据调整:如果价格波动小,可以把
price_bin_step设为1或2;如果波动大,设为10或更大。 - 热力图的
origin="lower"很重要,确保最低价格对应Y轴底部,符合常规的价格图表习惯。 - 后续如果要动态更新数值,只需要修改
heatmap_data矩阵,然后调用im.set_data(heatmap_data)和plt.draw()即可,不需要重新创建整个图表。
内容的提问来源于stack exchange,提问作者Jack022
相关产品推荐
相关产品推荐

