python用mpl_finance中的candlestick_ohlc画分时图

本文介绍如何使用matplotlib和mpl_finance库解决分钟级数据绘制K线图的问题,包括自定义X轴显示格式,实现清晰展示分时行情。
部署运行你感兴趣的模型镜像

matplotlib.finance独立出来成为mpl_finance,而mpl_finance中的candlestick_ochl和candlestick_ohlc一般用来画股票的K线图。我需要分析分时图,也就是一分钟的行情,这个时候就不能直接用candlestick_ochl函数,因为candlestick_ochl中x轴最小的单位是日期,不是分钟。

经过对mpl_finance的源代码进行分析,问题在于matplotlib的date2num将日期转换为浮点数,浮点数的整数部分表示日期,小数部分代表小时和分钟。比如下面4个时间段是连续的分钟。

时间date2num之后乘以1440
2018/09/17-21:34736954.89861061215054
2018/09/17-21:35736954.89931061215055
2018/09/17-21:36736954.90001061215056
2018/09/17-21:37736954.90071061215057

可以看出date2num函数计算之后,4个时间的整数部分都是736954,导致在X轴上这4个时间段都重叠在一起,无法区分了。要达到的效果是每一个分钟也能成为一个整数,这样就可以显示出来了。那么一天是24小时,每小时60分钟,那么一天就是1440分钟,将date2num计算的浮点数乘以1440就可以将每一分钟转为整数,那么就可以在x轴上。

最后还需要对x轴格式化,因为自己对x轴进行了处理(乘以1440),采用默认的格式化是乱码。需要自定义x轴的格式化函数。

完整例子如下:

import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import matplotlib.dates as dates
import mpl_finance as mpf
from matplotlib.ticker import Formatter
import numpy as np


dfcvs = DataFrame([
    ["2018/09/17-21:34", 3646, 3650,3644,3650],
    ["2018/09/17-21:35", 3650, 3650,3648,3648],
    ["2018/09/17-21:36", 3650, 3650,3648,3650],
    ["2018/09/17-21:37", 3652, 3654,3648,3652]
])

dfcvs.columns = ['时间','开盘','最高','最低','收盘']
dfcvs['时间']=pd.to_datetime(dfcvs['时间'],format="%Y/%m/%d-%H:%M")

#matplotlib的date2num将日期转换为浮点数,整数部分区分日期,小数区分小时和分钟
#因为小数太小了,需要将小时和分钟变成整数,需要乘以24(小时)×60(分钟)=1440,这样小时和分钟也能成为整数
#这样就可以一分钟就占一个位置

 

dfcvs['时间']=dfcvs['时间'].apply(lambda x:dates.date2num(x)*1440)
data_mat=dfcvs.as_matrix()
    
fig,ax=plt.subplots(figsize=(1200/72,480/72))
 
fig.subplots_adjust(bottom=0.1)   
mpf.candlestick_ohlc(ax,data_mat,colordown='#53c156', colorup='#ff1717',width=0.2,alpha=1)

#将x轴的浮点数格式化成日期小时分钟
#默认的x轴格式化是日期被dates.date2num之后的浮点数,因为在上面乘以了1440,所以默认是错误的
#只能自己将浮点数格式化为日期时间分钟
#参考https://matplotlib.org/examples/pylab_examples/date_index_formatter.html
class MyFormatter(Formatter):
            def __init__(self, dates, fmt='%Y%m%d %H:%M'):
                self.dates = dates
                self.fmt = fmt
    
            def __call__(self, x, pos=0):
                'Return the label for time x at position pos'
                ind = int(np.round(x))
                #ind就是x轴的刻度数值,不是日期的下标

                return dates.num2date( ind/1440).strftime(self.fmt)
        
formatter = MyFormatter(data_mat[:,0])
ax.xaxis.set_major_formatter(formatter)

for label in ax.get_xticklabels():
            label.set_rotation(90)
            label.set_horizontalalignment('right')
           
plt.show()

 

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决在Matplotlib中分开显示K线图和成交量图的问题。用户希望将这两个图表分别放在ax1和ax2中。根据用户提供的引用内容,特别是引用1和引用3,用户可能需要使用subplots来创建两个子图,并在每个子图上绘制不同的内容。 首先,我需要回忆Matplotlib中如何创建多个子图。通常使用plt.subplots()函数,并指定行数和列数。例如,plt.subplots(2, 1)会创建两个垂直排列的子图。这样ax1是上面的子图,ax2是下面的。接下来,用户需要绘制K线图在ax1,成交量在ax2。不过,K线图通常使用candlestick2_ochl函数,但现在可能已经被移到mpl_finance模块,或者需要单独安装。另外,用户可能需要处理日期格式,确保x轴正确显示。 然后,成交量图通常用柱状图表示,可以使用bar函数。需要注意的是,两个子图的x轴应该对齐,特别是日期部分。为了避免重复的日期标签,可以设置ax1的x轴标签不可见,只在ax2显示。另外,可能需要调整子图之间的间距,使用subplots_adjust来优化布局。 用户提供的引用3提到了双Y轴曲线图,但这里的情况是两个不同的图表类型(K线图和柱状图),因此更适合使用两个独立的子图。需要确保两个子图的x轴数据一致,这样缩放时两者会同步。同时,要正确导入所需的库,例如从mpl_finance导入candlestick_ochl,或者使用其他方法生成K线图。 另外,用户可能需要处理数据格式的问题。K线图需要开盘价、最高价、最低价、收盘价等数据,而成交量是单独的数据列。需要将数据正确分割,并传递给对应的绘图函数。此外,日期可能需要转换为Matplotlib的日期格式,使用dates.date2num函数处理。 最后,代码的结构应该是:导入必要的库,创建子图,处理数据,绘制K线图在ax1,成交量在ax2,调整布局并显示图表。需要测试代码是否存在常见的错误,比如模块导入问题、数据维度不匹配等。同时,可能需要添加注释,帮助用户理解每个步骤的作用,比如设置共享x轴,调整间距等。</think>在Matplotlib中绘制分体式K线图和成交量图,可通过创建双子图坐标系实现。以下是分步实现方案: ```python import matplotlib.pyplot as plt from matplotlib import dates as mdates from mpl_finance import candlestick_ochl # 若报错可尝试使用candlestick_ohlc import numpy as np # 1. 创建布和子图 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True) # 2. 准备样本数据(需替换为真实数据) dates = np.arange(0, 10) # 日期序列 opens = np.random.randint(20, 30, 10) highs = opens + np.random.rand(10)*5 lows = opens - np.random.rand(10)*5 closes = (opens + highs + lows)/3 volumes = np.random.randint(100, 1000, 10) # 3. 绘制K线图(需转换日期格式) candlestick_ochl(ax1, zip(mdates.date2num(dates), opens, closes, highs, lows), width=0.6, colorup='r', colordown='g') # 4. 绘制成交量图 ax2.bar(dates, volumes, width=0.6, color='blue') # 5. 设置坐标轴格式 ax1.set_ylabel('Price') ax2.set_ylabel('Volume') ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 6. 调整布局 plt.subplots_adjust(hspace=0.3) # 调整子图间距 plt.xticks(rotation=45) plt.show() ``` 关键配置说明: 1. **共享x轴**:通过`sharex=True`参数确保两图x轴同步缩放 2. **日期处理**:使用`date2num`转换日期为matplotlib内部格式[^1] 3. **颜色设置**: - `colorup`/`colordown`控制K线涨跌颜色 - 成交量柱状图使用统一颜色 4. **布局优化**:`subplots_adjust`调整子图间距,`rotation`旋转日期标签防止重叠[^2]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值