我使用的是matplotlib 3.7.0版、mplfinance 0.12.9b7版和Python 3.10。
我试图对图的区域进行着色,尽管我的逻辑似乎正确,但着色区域未显示在图上。
这是我的代码:
import yfinance as yf
import mplfinance as mpf
import pandas as pd
# Download the stock data
df = yf.download('TSLA', start='2022-01-01', end='2022-03-31')
# Define the date ranges for shading
red_range = ['2022-01-15', '2022-02-15']
blue_range = ['2022-03-01', '2022-03-15']
# Create a function to shade the chart regions
def shade_region(ax, region_dates, color):
region_dates.sort()
start_date = region_dates[0]
end_date = region_dates[1]
# plot vertical lines
ax.axvline(pd.to_datetime(start_date), color=color, linestyle='--')
ax.axvline(pd.to_datetime(end_date), color=color, linestyle='--')
# create fill
xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()
ax.fill_between(pd.date_range(start=start_date, end=end_date), ymin, ymax, alpha=0.2, color=color)
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
# Plot the candlestick chart with volume
fig, axlist = mpf.plot(df, type='candle', volume=True, style='charles',
title='TSLA Stock Price', ylabel='Price ($)', ylabel_lower='Shares\nTraded',
figratio=(2,1), figsize=(10,5), tight_layout=True, returnfig=True)
# Get the current axis object
ax = axlist[0]
# Shade the regions on the chart
shade_region(ax, red_range, 'red')
shade_region(ax, blue_range, 'blue')
# Show the plot
mpf.show()
为什么选定区域未着色,如何解决此问题?
1条答案
按热度按时间y3bcpkx11#
问题是,当
show_nontrading=False
(未指定时为默认值)时,X轴 * 不是 * 预期的日期,因此您指定的垂直线和fill_between**实际上会偏离图表。最简单的解决方案是设置
show_nontrading=True
。对于这个问题,还有另外两种解决方案,如果您愿意的话,允许您离开
show_nontrading=False
。vlines
kwarg,fill_between
kwarg.下面是一个修改代码的示例:
returnfig=True
。这是不推荐的解决方案**但它确实有效。首先,了解以下几点很重要:当
show_nontrading
* 未 * 指定时,它默认为**False
,,这意味着尽管您看到x轴上显示的日期时间,实际值是 Dataframe 的行号. Click here for a more detailed explanation。因此,在代码中,不指定日期,而是指定日期出现的行号。
指定行号的最简单方法是使用函数
date_to_iloc(df.index.to_series(),date)
**,定义如下:该函数将转换为系列的数据框索引作为输入。因此,对代码进行以下更改将允许该函数使用此方法工作:
其他一切保持不变,您将获得: