使用matplotlib在烛台图表中叠加数据

2024-09-28 19:02:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的第一个需求是在烛台图表上叠加一条曲线。 要绘制这个烛台图,mplfinance看起来非常漂亮。不幸的是,我找不到办法在烛台上叠加额外的曲线

考虑下面的例子,若你们中的任何人都知道如何将“噪波”列覆盖在从“分钟”数据帧绘制的烛台上,那个就太棒了

import pandas as pd
import mplfinance as mpf

minutely = pd.DataFrame({'Date':[pd.Timestamp('2021-01-07 00:00:00'),
                                 pd.Timestamp('2021-01-07 00:01:00'),
                                 pd.Timestamp('2021-01-07 00:02:00'),
                                 pd.Timestamp('2021-01-07 00:03:00'),
                                 pd.Timestamp('2021-01-07 00:04:00')],
                          'Open':[36769.36, 36880.00, 36851.42,36922.19,37083.18],
                          'High':[36880.00, 36880.00, 36950.00, 37089.69, 37094.70],
                          'Low': [36760.00,  36817.64, 36810.03, 36922.13, 36565.49],
                          'Close':[36880.00, 36851.97, 36922.14, 37075.80, 36691.3]})

noise = pd.DataFrame({'Date':[pd.Timestamp('2021-01-07 00:00:00'),
                                 pd.Timestamp('2021-01-07 00:01:00'),
                                 pd.Timestamp('2021-01-07 00:02:00'),
                                 pd.Timestamp('2021-01-07 00:03:00'),
                                 pd.Timestamp('2021-01-07 00:04:00')],
                          'Noise':[36779.36, 36870.00, 36881.42,36902.19,37103.18]})

# Draw candlesticks
minutely = minutely.set_index('Date')
noise = noise.set_index('Date')
mpf.plot(minutely, type='candle')

不停在这里,我想使用'old'candlestick_ohlcv函数绘制烛台图,然后使用本机matplotlib功能覆盖数据。 这给出了下面的代码,但是当显示烛台时,x刻度看起来毫无意义

我应该只有5支蜡烛,x刻度从2020/01/07 00:00到2020/01/07 00:04

我可以看到图表显示了从2020/01/06 16:48到2020/01/07:12的x比例

我不明白,蜡烛是没有意义的

import pandas as pd
import matplotlib.pyplot as plt 
from mplfinance.original_flavor import candlestick_ohlc
import matplotlib.dates as mpdates 

minutely = pd.DataFrame({'Date':[pd.Timestamp('2021-01-07 00:00:00'),
                                 pd.Timestamp('2021-01-07 00:01:00'),
                                 pd.Timestamp('2021-01-07 00:02:00'),
                                 pd.Timestamp('2021-01-07 00:03:00'),
                                 pd.Timestamp('2021-01-07 00:04:00')],
                          'Open':[36769.36, 36880.00, 36851.42,36922.19,37083.18],
                          'High':[36880.00, 36880.00, 36950.00, 37089.69, 37094.70],
                          'Low': [36760.00,  36817.64, 36810.03, 36922.13, 36565.49],
                          'Close':[36880.00, 36851.97, 36922.14, 37075.80, 36691.3]})

noise = pd.DataFrame({'Date':[pd.Timestamp('2021-01-07 00:00:00'),
                                 pd.Timestamp('2021-01-07 00:01:00'),
                                 pd.Timestamp('2021-01-07 00:02:00'),
                                 pd.Timestamp('2021-01-07 00:03:00'),
                                 pd.Timestamp('2021-01-07 00:04:00')],
                          'Noise':[36779.36, 36870.00, 36881.42,36902.19,37103.18]})

minutely['Date'] = minutely['Date'].map(mpdates.date2num)

plt.style.use('dark_background')
fig, ax = plt.subplots() 
candlestick_ohlc(ax, minutely.values, width = 0.6,  
                 colorup = 'green', colordown = 'red',  
                 alpha = 0.8) 
# Setting labels  
ax.set_xlabel('Date') 
ax.set_ylabel('Price')
# Formatting Date
date_format = mpdates.DateFormatter('%d-%m-%Y %H:%M') 
ax.xaxis.set_major_formatter(date_format) 
fig.autofmt_xdate() 
fig.tight_layout() 
# show the plot 
plt.show()

请问,有人知道如何将这些外部数据叠加到烛台数据上吗? 提前感谢您的帮助, 最好的


Tags: 数据importdataframedateas绘制pltax
2条回答

您可以通过在上面的第一个代码示例中只添加一行代码来实现这一点:

在调用mpf.plot()之前,添加以下行:

ap = mpf.make_addplot(noise)

然后更改对mpf.plot()的调用以包含addplot关键字,因此:

ap = mpf.make_addplot(noise)
mpf.plot(minutely, type='candle', addplot=ap)

enter image description here

如果需要,还可以修改日期时间格式:

ap = mpf.make_addplot(noise)
mpf.plot(minutely, type='candle', addplot=ap, datetime_format='%b %d, %H:%M')

enter image description here

我强烈建议您通读这两个教程。它们相对较短,可能只需15至30分钟即可仔细阅读:


另外,作为一般规则,我不鼓励访问mplfinance的Figure和Axes对象:因此,您的代码会简单得多。对图形和轴的访问只能用于需要mplfinance尚不支持的高级功能的绘图。如果您通读这些教程,我相信您会发现,金融绘图的大多数操作都可以简单地完成,而无需直接操纵图形和轴

通过使用returnfig=True参数获取matplotlib图形和轴对象,可以在烛台图表顶部覆盖一个绘图。返回两个轴:主轴和次轴。在以下基于您提供的示例的示例中,将使用主轴创建噪波线图

请注意mpf.plot返回一个图形,其中默认情况下x轴刻度由从零开始的整数单位组成(如熊猫条形图)。这是因为plotting函数用于可视化交易时间的数据,而不是包含许多非交易时间间隔的连续datetime变量。可以通过设置show_nontrading=True来更改此行为。在下面的示例中,我为两个备选方案提供了一个解决方案,使用pandas plotting函数来绘制直线,因为与matplotlib相比,它使用起来稍微方便一些:

import pandas as pd                                        # v 1.1.3
import matplotlib.pyplot as plt                            # v 3.3.2
import matplotlib.dates as mpdates
import mplfinance as mpf                                   # v 0.12.7a4
from mplfinance.original_flavor import candlestick_ohlc

# Create sample data
dti = pd.date_range('2021-01-07', periods=5, freq='min')

minutely = pd.DataFrame({'Open':[36769.36, 36880.00, 36851.42,36922.19,37083.18],
                         'High':[36880.00, 36880.00, 36950.00, 37089.69, 37094.70],
                         'Low': [36760.00,  36817.64, 36810.03, 36922.13, 36565.49],
                         'Close':[36880.00, 36851.97, 36922.14, 37075.80, 36691.3]},
                        index=dti)

noise = pd.DataFrame({'Noise':[36779.36, 36870.00, 36881.42,36902.19,37103.18]},
                     index=dti)

# Create candlestick chart overlaid with a pandas line plot
fig, (ax1, ax2) = mpf.plot(minutely, type='candle', returnfig=True, figsize=(6,4))
noise.plot(ax=ax1, use_index=False);

# # Create same figure including non-trading hours, in this case the datetime
# # variable is used for the x-axis scale
# fig, (ax1, ax2) = mpf.plot(minutely, type='candle', show_nontrading=True,
#                            returnfig=True, figsize=(6,4))
# noise.plot(ax=ax1, x_compat=True);

mpf_candlestick


关于问题的第二部分,旧的candlestick_ohlcv函数的docstring表示width是以一天的分数表示的(对应于matplotlib日期单位)。示例数据仅跨越几分钟,但您设置了width=0.6(超过半天),这会产生非常宽的烛台,使绘图无法读取。设置width=0.0003似乎效果不错。另一件需要调整的事情是x记号,因为它们似乎被放置在一些随机的位置。以下是使用与上述相同数据的示例:

# Edit minutely dataframe for use with candlestick_ohlc function
minutely['Date'] = mpdates.date2num(minutely.index)
minutely = minutely[['Date', 'Open', 'High', 'Low', 'Close']]

# Create candlestick chart overlaid with a pandas line plot
plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(6,4))
candlestick_ohlc(ax, minutely.values, width=0.0003,
                 colorup='green', colordown='red', alpha=0.8)
noise.plot(ax=ax, x_compat=True)

# Set labels
ax.set_xlabel('Date')
ax.set_ylabel('Price')

# Create ticks that match the locations of the candlesticks and format labels
ax.set_xticks(minutely['Date'])
date_format = mpdates.DateFormatter('%H:%M\n%d-%m-%Y ') 
ax.xaxis.set_major_formatter(date_format)
fig.autofmt_xdate(rotation=0, ha='center')

mpf_candlestick_old



参考文献:this answer by Daniel Goldfarb(当前的mplfinance package维护者)pandas plotting function^{}参数,用于将pandas绘图日期单位转换为matplotlib日期单位

相关问题 更多 >