Python 在matplotlib中绘制日期时间轴上的矩形?
我正在尝试使用matplotlib手动创建烛台图,使用Python 在matplotlib中绘制日期时间轴上的矩形?,python,datetime,matplotlib,finance,rectangles,Python,Datetime,Matplotlib,Finance,Rectangles,我正在尝试使用matplotlib手动创建烛台图,使用errorbar查看每日高价和低价,使用Rectangle()查看调整后的收盘价和开盘价。似乎具备了实现这一目标的所有先决条件 我试图非常忠实地使用上面的内容,但是在datetime 64[ns]的x轴上绘制某些东西的问题给了我无数的错误,因此我还尝试合并在datetime上绘制 这是我到目前为止的代码,对于混乱表示歉意: import pandas as pd import datetime as dt import matplotlib.
errorbar
查看每日高价和低价,使用Rectangle()
查看调整后的收盘价和开盘价。似乎具备了实现这一目标的所有先决条件
我试图非常忠实地使用上面的内容,但是在datetime 64[ns]
的x轴上绘制某些东西的问题给了我无数的错误,因此我还尝试合并在datetime上绘制
这是我到目前为止的代码,对于混乱表示歉意:
import pandas as pd
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.collections import PatchCollection
from matplotlib.patches import Rectangle
def makeCandles(xdata,high,low,adj_close,adj_open,fc='r',ec='None',alpha=0.5):
## Converting datetimes to numerical format matplotlib can understand.
dates = mdates.date2num(xdata)
## Creating default objects
fig,ax = plt.subplots(1)
## Creating errorbar peaks based on high and low prices
avg = (high + low) / 2
err = [high - avg,low - avg]
ax.errorbar(dates,err,fmt='None',ecolor='k')
## Create list for all the error patches
errorboxes = []
## Loop over data points; create "body" of candlestick
## based on adjusted open and close prices
errors=np.vstack((adj_close,adj_open))
errors=errors.T
for xc,yc,ye in zip(dates,avg,errors):
rect = Rectangle((xc,yc-ye[0]),1,ye.sum())
errorboxes.append(rect)
## Create patch collection with specified colour/alpha
pc = PatchCollection(errorboxes,facecolor=fc,alpha=alpha,edgecolor=ec)
## Add collection to axes
ax.add_collection(pc)
plt.show()
我的数据看起来像
这就是我试图运行的,首先从quandl获得一个价格表
import quandl as qd
api = '1uRGReHyAEgwYbzkPyG3'
qd.ApiConfig.api_key = api
data = qd.get_table('WIKI/PRICES', qopts = { 'columns': ['ticker', 'date', 'high','low','adj_open','adj_close'] }, \
ticker = ['AMZN', 'XOM'], date = { 'gte': '2014-01-01', 'lte': '2016-12-31' })
data.reset_index(inplace=True,drop=True)
makeCandles(data['date'],data['high'],data['low'],data['adj_open'],data['adj_close'])
代码运行时没有错误,但输出一个空图。所以我想要的是关于如何在日期时间内绘制这些矩形的建议。对于矩形的宽度,我简单地放一个统一的“1”bec。我不知道有什么简单的方法可以指定矩形的日期时间宽度
编辑
这是我当前获得的绘图,已将我的xdata
转换为matplotlib mdates:
在我通过mdates转换xdata
之前,到处都是xdata
作为我的x轴,这是我经常遇到的错误之一:
要获得所需的绘图,需要考虑以下几点。首先,您要检索到stocks
AMZN
和XOM
,同时显示这两个选项会使您想要的图表看起来很有趣,因为数据相距很远。第二,几年来每天绘制的烛台图表将变得非常拥挤。最后,您需要在x轴上设置顺序日期的格式
如评论中所述,您可以使用预先构建的matplotlibcandlestick2_ohlc
功能(尽管已弃用),可通过mpl_finance
进行访问,如回答中所示进行安装。我选择只使用带有内置错误条的matplotlib条形图
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import quandl as qd
from matplotlib.dates import DateFormatter, WeekdayLocator, \
DayLocator, MONDAY
# get data
api = '1uRGReHyAEgwYbzkPyG3'
qd.ApiConfig.api_key = api
data = qd.get_table('WIKI/PRICES', qopts={'columns': ['ticker', 'date', 'high', 'low', 'open', 'close']},
ticker=['AMZN', 'XOM'], date={'gte': '2014-01-01', 'lte': '2014-03-10'})
data.reset_index(inplace=True, drop=True)
fig, ax = plt.subplots(figsize = (10, 5))
data['date'] = mdates.date2num(data['date'].dt.to_pydatetime()) #convert dates to ordinal
tickers = list(set(data['ticker'])) # unique list of stock names
for stock_ind in tickers:
df = data[data['ticker'] == 'AMZN'] # select one, can do more in a for loop, but it will look funny
inc = df.close > df.open
dec = df.open > df.close
ax.bar(df['date'][inc],
df['open'][inc]-df['close'][inc],
color='palegreen',
bottom=df['close'][inc],
# this yerr is confusing when independent error bars are drawn => (https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.errorbar)
yerr = [df['open'][inc]-df['high'][inc], -df['open'][inc]+df['low'][inc]],
error_kw=dict(ecolor='gray', lw=1))
ax.bar(df['date'][dec],
df['close'][dec]-df['open'][dec],
color='salmon', bottom=df['open'][dec],
yerr = [df['close'][dec]-df['high'][dec], -df['close'][dec]+df['low'][dec]],
error_kw=dict(ecolor='gray', lw=1))
ax.set_title(stock_ind)
#some tweaking, setting the dates
mondays = WeekdayLocator(MONDAY) # major ticks on the mondays
alldays = DayLocator() # minor ticks on the days
weekFormatter = DateFormatter('%b %d') # e.g., Jan 12
dayFormatter = DateFormatter('%d') # e.g., 12
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(weekFormatter)
ax.set_ylabel('monies ($)')
plt.show()
您能分享结果图吗?如果您向我们展示您当前的结果和您正在尝试完成的示例,那么回答这个问题会容易得多。当然,你在别的地方见过这种视觉表现。无论如何,如果您需要快速绘图,您可以使用
matplotlib.finance
中的candlestick2_ohlc
。@karlphillip我编辑了两张图片。作为一个清晰的图形示例,我想看到的是:我的问题包含了我现在使用的所有代码,我为那个愚蠢的错误道歉。老实说,我并不期待我的问题得到答案,尽管在我接近它时它没有使用Rectangle
,但不管怎样,你已经完全让我满意了。非常感谢。根据你的回答,我希望你能为我解释最后的两个想法:1)从ax.xaxis.set_major\u locator(星期一)
-->ax.xaxis.set_major\u formatter(weekFormatter)
我不明白它的用途,因为它前面的代码似乎为x轴指定了所有内容,2)使用df['date'][inc]
,例如,对于条形图的x值,因为它们只是布尔值,究竟是如何工作的?很高兴听到!1) ax.xaxis.set\u major\u locator(周一)
将确保主刻度在周一,如mondays=WeekdayLocator(周一)
所定义,其中ax.xaxis.set\u major\u formatter(weekFormatter)
将格式化日期%b%d
放在该位置。2) [inc]
和[dec]
确实是一组布尔值,它们确保当当天股价下跌时,它将被打印成红色或绿色。布尔列表将绘制df['date'][inc]
从而只绘制绿色条。希望有帮助!