python - 如何在 Matplotlib/Matplotlib 财务图表上添加补丁?
问题描述
我使用以下内容创建了烛台图:
fig, axlist = mpf.plot(df, type='candle', returnfig=True)
现在我正在尝试添加一个矩形,该矩形从 x 轴的某个点到 x 轴在 y 位置的另一个点。现在,x 轴上的数据是日期,而 y 轴上的数据是价格。
我尝试了以下方法:
ax1 = axlist[0]
new_patch = Rectangle(xy=(0, 9300), width=0.8, height=0.3, angle=0, color='orange')
ax1.add_patch(new_patch)
ax1.autoscale_view()
哪个有效,问题是我不想使用数字来选择 X 的位置。在Rectangle(xy=(0, 9300)
使用 0 时,我想使用日期,比如Rectangle(xy=('2020-06-17 10:30', 9300)
,但这会给我一个错误:x 必须是一个int
。
这是我用来绘制图表的数据框示例:
Date Open High Low Close Volume
Date
2020-06-17 19:10:00 2020-06-17 19:10:00 9402.02 9411.03 9400.00 9403.59 215.630925
2020-06-17 19:15:00 2020-06-17 19:15:00 9403.59 9412.54 9403.01 9410.57 108.958008
2020-06-17 19:20:00 2020-06-17 19:20:00 9410.16 9413.66 9409.06 9411.88 107.795579
总结一下:我需要在我的图表上绘制一个补丁,我可以使用一个数字将此补丁放在 x 轴上,但我想使用一个日期。有什么办法吗?
编辑:我尝试了这里建议的解决方案,但没有奏效:
date = datetime.datetime(2020, 6, 19, 10, 30)
testDate = mdates.date2num(date)
print(testDate)
new_patch = Rectangle(xy=(testDate, 9370), width=1, height=0.3, angle=0, color='orange')
ax1.add_patch(new_patch)
ax1.autoscale_view()
解决方案
不同的库,不同的实现
mplfinance
如果数据框使用 DatetimeIndex,则只能生成绘图;这就是为什么有必要pd.to_datetime
事先使用。当您将此图拟合到matplotlib
图形中以对其应用补丁时,matplotlib
无法将 x 值作为日期处理,因为它们没有被呈现给它。
它所做的是用从 0 开始的整数值列表替换它们。这就是为什么当您将补丁的 x 值分配给testDate
737595.4375 时,一旦您自动缩放 x 轴,一切都会被压扁。
解决方案
解决此问题的一种方法是将数据框Date
列存储在索引数组中,然后检索匹配日期的索引:
unique_index = pd.Index(df["Date"])
start_x = unique_index.get_loc('2020-06-17 19:10:00')
如果您想在数据框中缺少的日期绘制补丁,您必须找到直接在起点之前的索引并添加到 0 和 1 之间的任何数字。
推荐阅读
- dji-sdk - DJI Windows SDK 中的障碍物检测传感器如何工作?
- javascript - 我自己的函数中的 Node.js 请求模块存在问题
- vue.js - 动作在组件 vue.js 中没有定义为方法
- laravel - Laravel 试图获取非对象的属性 - 使用 API 从不同的表中显示数据
- regex - 在 Go 中的 README.md 中的注释标签之间插入链接
- server - 如何为家庭 SMTP 服务器设置反向 DNS?
- python - 为什么一个代码(matmul)比另一个(Python)快
- python - 将 JSON 文件导入 Python 字典格式时遇到问题
- excel - VBA 相对引用
- python - 重新格式化数据框,以便在没有 nan 的情况下使用系列中的所有其他值