首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matplotlib -财务卷覆盖

Matplotlib -财务卷覆盖
EN

Stack Overflow用户
提问于 2012-10-30 03:54:17
回答 3查看 21.3K关注 0票数 15

我正在制作一张包含两个数据集的烛台图:开盘、高位、低位、收盘和成交量。我正在尝试覆盖图表底部的卷,如下所示:

我调用的是volume_overlay3,但它填充了整个绘图区,而不是条形图。我做错了什么?

我的另一个选择是使用.bar(),它没有向上和向下的颜色,但如果我能正确地缩放,它就可以工作:

代码语言:javascript
复制
fig = plt.figure()
ax = fig.add_subplot(1,1,1)

candlestick(ax, candlesticks)

ax2 = ax.twinx()

volume_overlay3(ax2, quotes)

ax2.xaxis_date()

ax2.set_xlim(candlesticks[0][0], candlesticks[-1][0])

ax.yaxis.set_label_position("right")
ax.yaxis.tick_right()

ax2.yaxis.set_label_position("left")
ax2.yaxis.tick_left()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-04 12:51:04

volume_overlay3对我不起作用。所以我尝试了你的想法,把柱状图添加到烛台图中。

为体积创建双轴后,重新定位该轴(使其变短),并修改烛台y-data的范围以避免冲突。

代码语言:javascript
复制
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
# from matplotlib.finance import candlestick
# from matplotlib.finance import volume_overlay3
# finance module is no longer part of matplotlib
# see: https://github.com/matplotlib/mpl_finance
from mpl_finance import candlestick_ochl as candlestick
from mpl_finance import volume_overlay3
from matplotlib.dates import num2date
from matplotlib.dates import date2num
import matplotlib.mlab as mlab
import datetime

datafile = 'data.csv'
r = mlab.csv2rec(datafile, delimiter=';')

# the dates in my example file-set are very sparse (and annoying) change the dates to be sequential
for i in range(len(r)-1):
    r['date'][i+1] = r['date'][i] + datetime.timedelta(days=1)

candlesticks = zip(date2num(r['date']),r['open'],r['close'],r['max'],r['min'],r['volume'])

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.set_ylabel('Quote ($)', size=20)
candlestick(ax, candlesticks,width=1,colorup='g', colordown='r')

# shift y-limits of the candlestick plot so that there is space at the bottom for the volume bar chart
pad = 0.25
yl = ax.get_ylim()
ax.set_ylim(yl[0]-(yl[1]-yl[0])*pad,yl[1])

# create the second axis for the volume bar-plot
ax2 = ax.twinx()


# set the position of ax2 so that it is short (y2=0.32) but otherwise the same size as ax
ax2.set_position(matplotlib.transforms.Bbox([[0.125,0.1],[0.9,0.32]]))

# get data from candlesticks for a bar plot
dates = [x[0] for x in candlesticks]
dates = np.asarray(dates)
volume = [x[5] for x in candlesticks]
volume = np.asarray(volume)

# make bar plots and color differently depending on up/down for the day
pos = r['open']-r['close']<0
neg = r['open']-r['close']>0
ax2.bar(dates[pos],volume[pos],color='green',width=1,align='center')
ax2.bar(dates[neg],volume[neg],color='red',width=1,align='center')

#scale the x-axis tight
ax2.set_xlim(min(dates),max(dates))
# the y-ticks for the bar were too dense, keep only every third one
yticks = ax2.get_yticks()
ax2.set_yticks(yticks[::3])

ax2.yaxis.set_label_position("right")
ax2.set_ylabel('Volume', size=20)

# format the x-ticks with a human-readable date. 
xt = ax.get_xticks()
new_xticks = [datetime.date.isoformat(num2date(d)) for d in xt]
ax.set_xticklabels(new_xticks,rotation=45, horizontalalignment='right')

plt.ion()
plt.show()

data.csv在这里:http://pastebin.com/5dwzUM6e

票数 38
EN

Stack Overflow用户

发布于 2013-06-23 00:03:19

请参阅答案here。显然是一个bug,它会被修复的。

现在,您需要将从volume_overlay3调用返回的集合分配给一个变量,然后将该变量添加到图表中。

代码语言:javascript
复制
vc = volume_overlay3(ax2, quotes)
ax2.add_collection(vc)
票数 1
EN

Stack Overflow用户

发布于 2012-11-02 11:01:03

如果您想要将图形堆叠在另一个图形的顶部(即,在同一轴上绘制它们),请使用:

代码语言:javascript
复制
plt.hold(True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13128647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档