如何用Matplotlib和Python绘制带百分比Y轴的K线与趋势线
基于Matplotlib的双轴金融图表解决方案
核心思路
K线的价格尺度和百分比变化的尺度差异极大,必须用双Y轴布局:左轴对应BNBUSDT的价格(绘制K线),右轴对应资产的百分比变化(绘制趋势线),同时共享X轴保证时间对齐。
完整代码实现
import matplotlib.pyplot as plt import pandas as pd # 假设已准备好以下数据: # df_ohlc: BNBUSDT的OHLC数据,包含datetime, Open, High, Low, Close列 # df_assets: 包含datetime列和三种资产的百分比变化列(按公式计算完成) # 1. 统一时间格式(转为matplotlib可识别的datetime类型) df_ohlc['datetime'] = pd.to_datetime(df_ohlc['datetime']) df_assets['datetime'] = pd.to_datetime(df_assets['datetime']) # 2. 创建双轴画布 fig, ax1 = plt.subplots(figsize=(12, 6)) ax2 = ax1.twinx() # 共享X轴的次坐标轴 # 3. 绘制BNBUSDT K线图 # 定义K线实体颜色 df_ohlc['bar_color'] = ['green' if close >= open else 'red' for open, close in zip(df_ohlc['Open'], df_ohlc['Close'])] # 绘制K线实体 ax1.bar(df_ohlc['datetime'], abs(df_ohlc['Close'] - df_ohlc['Open']), bottom=df_ohlc[['Open', 'Close']].min(axis=1), color=df_ohlc['bar_color'], width=0.02) # 根据时间粒度调整宽度(日K设0.2,小时K设0.02) # 绘制高低点影线 for _, row in df_ohlc.iterrows(): ax1.plot([row['datetime'], row['datetime']], [row['Low'], row['High']], color=row['bar_color'], linewidth=1) # 4. 绘制三种资产的百分比变化趋势线 ax2.plot(df_assets['datetime'], df_assets['asset1_pct'], label='资产1', color='blue', linewidth=1.5) ax2.plot(df_assets['datetime'], df_assets['asset2_pct'], label='资产2', color='orange', linewidth=1.5) ax2.plot(df_assets['datetime'], df_assets['asset3_pct'], label='资产3', color='purple', linewidth=1.5) # 5. 调整图表样式 ax1.set_xlabel('时间') ax1.set_ylabel('BNBUSDT 价格') ax2.set_ylabel('资产百分比变化 (%)') ax1.grid(True, alpha=0.3) ax2.legend(loc='upper left') plt.xticks(rotation=45) plt.tight_layout() # 自动调整布局,避免图形溢出 plt.show()
关键问题修复点
- K线位置/大小异常:通过
width参数精准控制K线实体宽度,用bottom参数确保实体从开盘/收盘价的较低值开始绘制,解决偏移问题。 - 图形溢出截断:用
figsize设定画布尺寸,配合plt.tight_layout()自动调整元素间距,避免坐标轴标签、图例被截断。 - 尺度不匹配干扰:双轴布局彻底分离价格和百分比两个不同量级的数据,避免互相覆盖或挤压。
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

