仅用Matplotlib创建K线图:小实体蜡烛vlines显示异常求助
使用Matplotlib绘制K线图时小实体蜡烛vlines显示异常的问题
我仅用Matplotlib创建K线图时,遇到小实体蜡烛位置vlines显示异常的问题,希望有经验者提供解决方案。
我的实现代码如下:
fig, axs = plt.subplots(1) fig.set_size_inches(12.0, 6.0) axs.vlines(df.index, df['Start_g'], df['End_g'], color='green', linestyle='-', lw=10) axs.vlines(df.index, df['Start_r'], df['End_r'], color='red', linestyle='-', lw=10) axs.vlines(df.index, df['Low_g'], df['High_g'], color='green', linestyle='-', lw=1) axs.vlines(df.index, df['Low_r'], df['High_r'], color='red', linestyle='-', lw=1) plt.show()
当前输出效果:小实体蜡烛的vlines显示异常,线条出现错位、模糊的情况。
尝试设置dpi为200(fig.set_dpi(200))后,小实体蜡烛的显示有所改善,但出现蜡烛相互重叠的问题。
解决方案
问题根源在于用vlines绘制K线实体时,线宽(lw)是固定像素值,当x轴刻度间距较小时,过宽的线条会相互重叠;而小实体蜡烛的Start和End值接近,vlines的绘制逻辑容易出现显示错位。推荐改用以下两种更可靠的方式:
1. 结合bar绘制实体,vlines绘制上下影线
这种方式更贴合K线的结构,实体用柱状图绘制,避免线宽带来的重叠问题:
import matplotlib.pyplot as plt import pandas as pd # 先区分涨跌,计算实体的上下边界 df['color'] = ['green' if close >= open else 'red' for open, close in zip(df['Open'], df['Close'])] df['body_top'] = df[['Open', 'Close']].max(axis=1) df['body_bottom'] = df[['Open', 'Close']].min(axis=1) fig, ax = plt.subplots(figsize=(12, 6)) # 绘制K线实体 ax.bar(df.index, df['body_top'] - df['body_bottom'], bottom=df['body_bottom'], color=df['color'], width=0.6) # width可根据x轴数据密度调整 # 绘制上下影线 ax.vlines(df.index, df['Low'], df['High'], color=df['color'], lw=1) plt.show()
2. 使用专业金融绘图库mplfinance
如果允许使用第三方库,mplfinance是专门用于绘制金融K线的工具,能完美解决这类显示问题:
import mplfinance as mpf # 传入包含Open/Close/High/Low的DataFrame,直接绘制蜡烛图 mpf.plot(df, type='candle', figratio=(12,6), style='yahoo')
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

