关于k Line Chart (k线图)

K Line Chart

  python实现k线图的代码,之前找过matplotlib中文文档但是画k线图的finance方法已经弃用了。所以自己在网上搜寻一下加上改编,很好的实现出k线图,

代码如下:__main__

# conding:utf-8
# 导入聚宽函数库
from jqdatasdk import *
import pandas as pd
import matplotlib.pyplot as plt
from KLineChart.mpl_finance import plt_KLineChart
import os

'''
:param fields 字符串list, 默认是None(表示['open', 'close', 'high', 'low', 'volume', 'money']这几个标准字段),
      支持以下属性 ['open', 'close', 'low', 'high', 'volume', 'money', 'factor', 'high_limit', 'low_limit', 'avg', 'pre_close', 'paused']
:param skip_paused 是否跳过不交易日期
'''
auth('your ID','your password')

fields = ['open', 'close', 'high', 'low', 'volume', 'money']
stock_code = ['600519.XSHG','000001.XSHE','IC9999.CCFX']
data = get_price(stock_code,start_date='2018-1-1',end_date='2018-8-29',frequency='1d',fields=fields,skip_paused=False)
k,m,n = data.shape
# print(k,m,n)
for i in range(n):
    Data = data.iloc[:,:,i]
    plt_KLineChart(Data,stock_code[i],step=20,fontSize=14)
plt.show()

# 数据保存
# os.mkdir('data/中国银行.xlsx')
# data.to_excel(r'./data/中国银行.xlsx')
# sql.to_excel()
# print(data.shape)

 

  

 

这下我们需要导入自定义函数:from mpl_finance import plt_KLineChart

 

"""

A collection of functions for analyzing and plotting
financial data.   User contributions welcome!
"""
from
__future__
import
 (absolute_import, division, print_function,
                        unicode_literals)

import
 numpy as np
import
 matplotlib.pyplot as plt
from
 matplotlib 
import
 colors as mcolors
from
 matplotlib.collections 
import
 LineCollection, PolyCollection
from
 matplotlib.lines 
import
 TICKLEFT, TICKRIGHT, Line2D
from
 matplotlib.patches 
import
 Rectangle
from
 matplotlib.transforms 
import
 Affine2D

from
 six.moves 
import
 xrange, zip


def
 plot_day_summary_oclh(ax, quotes, ticksize=3
,
                          colorup
=
'
k
'
, colordown=
'
r
'
):
    
"""
Plots day summary
        Represent the time, open, close, high, low as a vertical line
        ranging from low to high.  The left tick is the open and the right
        tick is the close.
    Parameters
    ----------
    ax : `Axes`
        an `Axes` instance to plot to
    quotes : sequence of (time, open, close, high, low, ...) sequences
        data to plot.  time must be in float date format - see date2num
    ticksize : int
        open/close tick marker in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
        the color of the lines where close <  open
    Returns
    -------
    lines : list
        list of tuples of the lines added (one tuple per quote)
    
"""
return
 _plot_day_summary(ax, quotes, ticksize=
ticksize,
                             colorup
=colorup, colordown=
colordown,
                             ochl
=
True)


def
 plot_day_summary_ohlc(ax, quotes, ticksize=3
,
                          colorup
=
'
k
'
, colordown=
'
r
'
):
    
"""
Plots day summary
        Represent the time, open, high, low, close as a vertical line
        ranging from low to high.  The left tick is the open and the right
        tick is the close.
    Parameters
    ----------
    ax : `Axes`
        an `Axes` instance to plot to
    quotes : sequence of (time, open, high, low, close, ...) sequences
        data to plot.  time must be in float date format - see date2num
    ticksize : int
        open/close tick marker in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
        the color of the lines where close <  open
    Returns
    -------
    lines : list
        list of tuples of the lines added (one tuple per quote)
    
"""
return
 _plot_day_summary(ax, quotes, ticksize=
ticksize,
                             colorup
=colorup, colordown=
colordown,
                             ochl
=
False)


def
 _plot_day_summary(ax, quotes, ticksize=3
,
                      colorup
=
'
k
'
, colordown=
'
r
'
,
                      ochl
=
True):
    
"""
Plots day summary
        Represent the time, open, high, low, close as a vertical line
        ranging from low to high.  The left tick is the open and the right
        tick is the close.
    Parameters
    ----------
    ax : `Axes`
        an `Axes` instance to plot to
    quotes : sequence of quote sequences
        data to plot.  time must be in float date format - see date2num
        (time, open, high, low, close, ...) vs
        (time, open, close, high, low, ...)
        set by `ochl`
    ticksize : int
        open/close tick marker in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
        the color of the lines where close <  open
    ochl: bool
        argument to select between ochl and ohlc ordering of quotes
    Returns
    -------
    lines : list
        list of tuples of the lines added (one tuple per quote)
    
"""
#
 unfortunately this has a different return type than plot_day_summary2_*

    lines =
 []
    
for
 q 
in
 quotes:
        
if
 ochl:
            t, open, close, high, low 
= q[:5
]
        
else
:
            t, open, high, low, close 
= q[:5
]

        
if
 close >=
 open:
            color 
=
 colorup
        
else
:
            color 
=
 colordown

        vline 
= Line2D(xdata=(t, t), ydata=
(low, high),
                       color
=
color,
                       antialiased
=False,  
#
 no need to antialias vert lines
                       )

        oline 
= Line2D(xdata=(t, t), ydata=
(open, open),
                       color
=
color,
                       antialiased
=
False,
                       marker
=
TICKLEFT,
                       markersize
=
ticksize,
                       )

        cline 
= Line2D(xdata=(t, t), ydata=
(close, close),
                       color
=
color,
                       antialiased
=
False,
                       markersize
=
ticksize,
                       marker
=
TICKRIGHT)

        lines.extend((vline, oline, cline))
        ax.add_line(vline)
        ax.add_line(oline)
        ax.add_line(cline)

    ax.autoscale_view()

    
return
 lines


def
 candlestick_ochl(ax, quotes, width=0.2, colorup=
'
k
'
, colordown=
'
r
'
,
                     alpha
=1.0
):
    
"""

    Plot the time, open, close, high, low as a vertical line ranging
    from low to high.  Use a rectangular bar to represent the
    open-close span.  If close >= open, use colorup to color the bar,
    otherwise use colordown
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    quotes : sequence of (time, open, close, high, low, ...) sequences
        As long as the first 5 elements are these values,
        the record can be as long as you want (e.g., it may store volume).
        time must be in float days format - see date2num
    width : float
        fraction of a day for the rectangle width
    colorup : color
        the color of the rectangle where close >= open
    colordown : color
         the color of the rectangle where close <  open
    alpha : float
        the rectangle alpha level
    Returns
    -------
    ret : tuple
        returns (lines, patches) where lines is a list of lines
        added and patches is a list of the rectangle patches added
    
"""
return
 _candlestick(ax, quotes, width=width, colorup=
colorup,
                        colordown
=
colordown,
                        alpha
=alpha, ochl=
True)

def
 plt_KLineChart(data,stockCode,step=20,fontSize=13,figsize=(12,6
)):

    
'''

    :param data: type for DataFrame
    :param stockCode: stock code
    :param step: xticks step
    :param fontSize: font size
    :param figsize: window size
    :return:
    
'''


    prices 
= data[[
'
open
'
, 
'
high
'
, 
'
low
'
, 
'
close
'
]]

    fig 
= plt.figure(figsize=
figsize)
    ax 
= fig.add_axes([0.06, 0.15, 0.9, 0.75])   
#
 margin_left margin_bottom width height

    candlestick_ohlc(ax, prices, width=0.5, colorup=
'
r
'
, colordown=
'
b
'
)

    dataIndex 
= [str(i).split(
'
'
)[0] 
for
 i 
in
 data.iloc[::step, :].index]
    location 
=
 list(range(0,len(data.iloc[:,0]),step))
    plt.xticks(location,dataIndex,rotation
=45
)

    font_size 
= {
'
size
'
: fontSize}
    plt.ylabel(
'
prices
'
,font_size)
    plt.title(
'
stock:%s
'
%
(stockCode),font_size)
    plt.rcParams[
'
font.sans-serif
'
] = [
'
SimHei
'
]  
#
 设置字体为SimHei显示中文

    plt.rcParams[
'
axes.unicode_minus
'
] = False  
#
 设置正常显示符号
def
 candlestick_ohlc(ax, quotes, width=0.2, colorup=
'
k
'
, colordown=
'
r
'
,
                     alpha
=1.0
):
    
"""

    Plot the time, open, high, low, close as a vertical line ranging
    from low to high.  Use a rectangular bar to represent the
    open-close span.  If close >= open, use colorup to color the bar,
    otherwise use colordown
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    quotes : sequence of (time, open, high, low, close, ...) sequences
        As long as the first 5 elements are these values,
        the record can be as long as you want (e.g., it may store volume).
        time must be in float days format - see date2num
    width : float
        fraction of a day for the rectangle width
    colorup : color
        the color of the rectangle where close >= open
    colordown : color
         the color of the rectangle where close <  open
    alpha : float
        the rectangle alpha level
    Returns
    -------
    ret : tuple
        returns (lines, patches) where lines is a list of lines
        added and patches is a list of the rectangle patches added
    
"""
return
 _candlestick(ax, quotes, width=width, colorup=
colorup,
                        colordown
=
colordown,
                        alpha
=alpha, ochl=
False)


def
 _candlestick(ax, quotes, width=0.2, colorup=
'
k
'
, colordown=
'
r
'
,
                 alpha
=1.0, ochl=
True):
    
"""

    Plot the time, open, high, low, close as a vertical line ranging
    from low to high.  Use a rectangular bar to represent the
    open-close span.  If close >= open, use colorup to color the bar,
    otherwise use colordown
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    quotes : sequence of quote sequences
        data to plot.  time must be in float date format - see date2num
        (time, open, high, low, close, ...) vs
        (time, open, close, high, low, ...)
        set by `ochl`
    width : float
        fraction of a day for the rectangle width
    colorup : color
        the color of the rectangle where close >= open
    colordown : color
         the color of the rectangle where close <  open
    alpha : float
        the rectangle alpha level
    ochl: bool
        argument to select between ochl and ohlc ordering of quotes
    Returns
    -------
    ret : tuple
        returns (lines, patches) where lines is a list of lines
        added and patches is a list of the rectangle patches added
    
"""


    OFFSET 
= width / 2.0


    lines 
=
 []
    patches 
=
 []
    quotes 
=
 np.column_stack([list(range(len(quotes))), quotes])
    
for
 q 
in
 quotes:
        
if
 ochl:
            t, open, close, high, low 
= q[:5
]
        
else
:
            t, open, high, low, close 
= q[:5
]

        
if
 close >=
 open:
            color 
=
 colorup
            lower 
=
 open
            height 
= close -
 open
        
else
:
            color 
=
 colordown
            lower 
=
 close
            height 
= open -
 close

        vline 
=
 Line2D(
            xdata
=(t, t), ydata=
(low, high),
            color
=
color,
            linewidth
=0.5
,
            antialiased
=
True,
        )

        rect 
=
 Rectangle(
            xy
=(t -
 OFFSET, lower),
            width
=
width,
            height
=
height,
            facecolor
=
color,
            edgecolor
=
color,
        )
        rect.set_alpha(alpha)

        lines.append(vline)
        patches.append(rect)
        ax.add_line(vline)
        ax.add_patch(rect)
    ax.autoscale_view()

    
return
 lines, patches


def
 _check_input(opens, closes, highs, lows, miss=-1
):
    
"""
Checks that *opens*, *highs*, *lows* and *closes* have the same length.
    NOTE: this code assumes if any value open, high, low, close is
    missing (*-1*) they all are missing
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    opens : sequence
        sequence of opening values
    highs : sequence
        sequence of high values
    lows : sequence
        sequence of low values
    closes : sequence
        sequence of closing values
    miss : int
        identifier of the missing data
    Raises
    ------
    ValueError
        if the input sequences don't have the same length
    
"""
def
 _missing(sequence, miss=-1
):
        
"""
Returns the index in *sequence* of the missing data, identified by
        *miss*
        Parameters
        ----------
        sequence :
            sequence to evaluate
        miss :
            identifier of the missing data
        Returns
        -------
        where_miss: numpy.ndarray
            indices of the missing data
        
"""
return
 np.where(np.array(sequence) ==
 miss)[0]

    same_length 
= len(opens) == len(highs) == len(lows) ==
 len(closes)
    _missopens 
=
 _missing(opens)
    same_missing 
= ((_missopens == _missing(highs)).all() 
and

                    (_missopens 
== _missing(lows)).all() 
and

                    (_missopens 
==
 _missing(closes)).all())

    
if
not
 (same_length 
and
 same_missing):
        msg 
= (
"
*opens*, *highs*, *lows* and *closes* must have the same
"
"
 length. NOTE: this code assumes if any value open, high,
"
"
 low, close is missing (*-1*) they all must be missing.
"
)
        
raise
 ValueError(msg)


def
 plot_day_summary2_ochl(ax, opens, closes, highs, lows, ticksize=4
,
                           colorup
=
'
k
'
, colordown=
'
r
'
):
    
"""
Represent the time, open, close, high, low,  as a vertical line
    ranging from low to high.  The left tick is the open and the right
    tick is the close.
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    opens : sequence
        sequence of opening values
    closes : sequence
        sequence of closing values
    highs : sequence
        sequence of high values
    lows : sequence
        sequence of low values
    ticksize : int
        size of open and close ticks in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
         the color of the lines where close <  open
    Returns
    -------
    ret : list
        a list of lines added to the axes
    
"""
return
 plot_day_summary2_ohlc(ax, opens, highs, lows, closes, ticksize,
                                  colorup, colordown)


def
 plot_day_summary2_ohlc(ax, opens, highs, lows, closes, ticksize=4
,
                           colorup
=
'
k
'
, colordown=
'
r
'
):
    
"""
Represent the time, open, high, low, close as a vertical line
    ranging from low to high.  The left tick is the open and the right
    tick is the close.
    *opens*, *highs*, *lows* and *closes* must have the same length.
    NOTE: this code assumes if any value open, high, low, close is
    missing (*-1*) they all are missing
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    opens : sequence
        sequence of opening values
    highs : sequence
        sequence of high values
    lows : sequence
        sequence of low values
    closes : sequence
        sequence of closing values
    ticksize : int
        size of open and close ticks in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
         the color of the lines where close <  open
    Returns
    -------
    ret : list
        a list of lines added to the axes
    
"""


    _check_input(opens, highs, lows, closes)

    rangeSegments 
= [((i, low), (i, high)) 
for
 i, low, high 
in

                     zip(xrange(len(lows)), lows, highs) 
if
 low != -1
]

    
#
 the ticks will be from ticksize to 0 in points at the origin and
#
 we'll translate these to the i, close location

    openSegments = [((-
ticksize, 0), (0, 0))]

    
#
 the ticks will be from 0 to ticksize in points at the origin and
#
 we'll translate these to the i, close location

    closeSegments =
 [((0, 0), (ticksize, 0))]

    offsetsOpen 
= [(i, open) 
for
 i, open 
in

                   zip(xrange(len(opens)), opens) 
if
 open != -1
]

    offsetsClose 
= [(i, close) 
for
 i, close 
in

                    zip(xrange(len(closes)), closes) 
if
 close != -1
]

    scale 
= ax.figure.dpi * (1.0 / 72.0
)

    tickTransform 
= Affine2D().scale(scale, 0.0
)

    colorup 
=
 mcolors.to_rgba(colorup)
    colordown 
=
 mcolors.to_rgba(colordown)
    colord 
=
 {True: colorup, False: colordown}
    colors 
= [colord[open < close] 
for
 open, close 
in

              zip(opens, closes) 
if
 open != -1 
and
 close != -1
]

    useAA 
= 0,  
#
 use tuple here

    lw = 1,  
#
 and here

    rangeCollection =
 LineCollection(rangeSegments,
                                     colors
=
colors,
                                     linewidths
=
lw,
                                     antialiaseds
=
useAA,
                                     )

    openCollection 
=
 LineCollection(openSegments,
                                    colors
=
colors,
                                    antialiaseds
=
useAA,
                                    linewidths
=
lw,
                                    offsets
=
offsetsOpen,
                                    transOffset
=
ax.transData,
                                    )
    openCollection.set_transform(tickTransform)

    closeCollection 
=
 LineCollection(closeSegments,
                                     colors
=
colors,
                                     antialiaseds
=
useAA,
                                     linewidths
=
lw,
                                     offsets
=
offsetsClose,
                                     transOffset
=
ax.transData,
                                     )
    closeCollection.set_transform(tickTransform)

    minpy, maxx 
=
 (0, len(rangeSegments))
    miny 
= min([low 
for
 low 
in
 lows 
if
 low != -1
])
    maxy 
= max([high 
for
 high 
in
 highs 
if
 high != -1
])
    corners 
=
 (minpy, miny), (maxx, maxy)
    ax.update_datalim(corners)
    ax.autoscale_view()

    
#
 add these last
    ax.add_collection(rangeCollection)
    ax.add_collection(openCollection)
    ax.add_collection(closeCollection)
    
return
 rangeCollection, openCollection, closeCollection


def
 candlestick2_ochl(ax, opens, closes, highs, lows, width=4
,
                      colorup
=
'
k
'
, colordown=
'
r
'
,
                      alpha
=0.75
):
    
"""
Represent the open, close as a bar line and high low range as a
    vertical line.
    Preserves the original argument order.
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    opens : sequence
        sequence of opening values
    closes : sequence
        sequence of closing values
    highs : sequence
        sequence of high values
    lows : sequence
        sequence of low values
    width : int
        size of open and close ticks in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
        the color of the lines where close <  open
    alpha : float
        bar transparency
    Returns
    -------
    ret : tuple
        (lineCollection, barCollection)
    
"""
return
 candlestick2_ohlc(ax, opens, highs, lows, closes, width=
width,
                             colorup
=colorup, colordown=
colordown,
                             alpha
=
alpha)


def
 candlestick2_ohlc(ax, opens, highs, lows, closes, width=4
,
                      colorup
=
'
k
'
, colordown=
'
r
'
,
                      alpha
=0.75
):
    
"""
Represent the open, close as a bar line and high low range as a
    vertical line.
    NOTE: this code assumes if any value open, low, high, close is
    missing they all are missing
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    opens : sequence
        sequence of opening values
    highs : sequence
        sequence of high values
    lows : sequence
        sequence of low values
    closes : sequence
        sequence of closing values
    width : int
        size of open and close ticks in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
        the color of the lines where close <  open
    alpha : float
        bar transparency
    Returns
    -------
    ret : tuple
        (lineCollection, barCollection)
    
"""


    _check_input(opens, highs, lows, closes)

    delta 
= width / 2
.
    barVerts 
= [((i -
 delta, open),
                 (i 
-
 delta, close),
                 (i 
+
 delta, close),
                 (i 
+
 delta, open))
                
for
 i, open, close 
in
 zip(xrange(len(opens)), opens, closes)
                
if
 open != -1 
and
 close != -1
]

    rangeSegments 
=
 [((i, low), (i, high))
                     
for
 i, low, high 
in
 zip(xrange(len(lows)), lows, highs)
                     
if
 low != -1
]

    colorup 
=
 mcolors.to_rgba(colorup, alpha)
    colordown 
=
 mcolors.to_rgba(colordown, alpha)
    colord 
=
 {True: colorup, False: colordown}
    colors 
= [colord[open <
 close]
              
for
 open, close 
in
 zip(opens, closes)
              
if
 open != -1 
and
 close != -1
]

    useAA 
= 0,  
#
 use tuple here

    lw = 0.5,  
#
 and here

    rangeCollection =
 LineCollection(rangeSegments,
                                     colors
=
colors,
                                     linewidths
=
lw,
                                     antialiaseds
=
useAA,
                                     )

    barCollection 
=
 PolyCollection(barVerts,
                                   facecolors
=
colors,
                                   edgecolors
=
colors,
                                   antialiaseds
=
useAA,
                                   linewidths
=
lw,
                                   )

    minx, maxx 
=
 0, len(rangeSegments)
    miny 
= min([low 
for
 low 
in
 lows 
if
 low != -1
])
    maxy 
= max([high 
for
 high 
in
 highs 
if
 high != -1
])

    corners 
=
 (minx, miny), (maxx, maxy)
    ax.update_datalim(corners)
    ax.autoscale_view()

    
#
 add these last
    ax.add_collection(rangeCollection)
    ax.add_collection(barCollection)
    
return
 rangeCollection, barCollection


def
 volume_overlay(ax, opens, closes, volumes,
                   colorup
=
'
k
'
, colordown=
'
r
'
,
                   width
=4, alpha=1.0
):
    
"""
Add a volume overlay to the current axes.  The opens and closes
    are used to determine the color of the bar.  -1 is missing.  If a
    value is missing on one it must be missing on all
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    opens : sequence
        a sequence of opens
    closes : sequence
        a sequence of closes
    volumes : sequence
        a sequence of volumes
    width : int
        the bar width in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
        the color of the lines where close <  open
    alpha : float
        bar transparency
    Returns
    -------
    ret : `barCollection`
        The `barrCollection` added to the axes
    
"""


    colorup 
=
 mcolors.to_rgba(colorup, alpha)
    colordown 
=
 mcolors.to_rgba(colordown, alpha)
    colord 
=
 {True: colorup, False: colordown}
    colors 
= [colord[open <
 close]
              
for
 open, close 
in
 zip(opens, closes)
              
if
 open != -1 
and
 close != -1
]

    delta 
= width / 2
.
    bars 
= [((i - delta, 0), (i - delta, v), (i + delta, v), (i +
 delta, 0))
            
for
 i, v 
in
 enumerate(volumes)
            
if
 v != -1
]

    barCollection 
=
 PolyCollection(bars,
                                   facecolors
=
colors,
                                   edgecolors
=((0, 0, 0, 1
),),
                                   antialiaseds
=
(0,),
                                   linewidths
=(0.5
,),
                                   )

    ax.add_collection(barCollection)
    corners 
=
 (0, 0), (len(bars), max(volumes))
    ax.update_datalim(corners)
    ax.autoscale_view()

    
#
 add these last
return
 barCollection


def
 volume_overlay2(ax, closes, volumes,
                    colorup
=
'
k
'
, colordown=
'
r
'
,
                    width
=4, alpha=1.0
):
    
"""

    Add a volume overlay to the current axes.  The closes are used to
    determine the color of the bar.  -1 is missing.  If a value is
    missing on one it must be missing on all
    nb: first point is not displayed - it is used only for choosing the
    right color
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    closes : sequence
        a sequence of closes
    volumes : sequence
        a sequence of volumes
    width : int
        the bar width in points
    colorup : color
        the color of the lines where close >= open
    colordown : color
        the color of the lines where close <  open
    alpha : float
        bar transparency
    Returns
    -------
    ret : `barCollection`
        The `barrCollection` added to the axes
    
"""
return
 volume_overlay(ax, closes[:-1], closes[1:], volumes[1
:],
                          colorup, colordown, width, alpha)


def
 volume_overlay3(ax, quotes,
                    colorup
=
'
k
'
, colordown=
'
r
'
,
                    width
=4, alpha=1.0
):
    
"""
Add a volume overlay to the current axes.  quotes is a list of (d,
    open, high, low, close, volume) and close-open is used to
    determine the color of the bar
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    quotes : sequence of (time, open, high, low, close, ...) sequences
        data to plot.  time must be in float date format - see date2num
    width : int
        the bar width in points
    colorup : color
        the color of the lines where close1 >= close0
    colordown : color
        the color of the lines where close1 <  close0
    alpha : float
         bar transparency
    Returns
    -------
    ret : `barCollection`
        The `barrCollection` added to the axes
    
"""


    colorup 
=
 mcolors.to_rgba(colorup, alpha)
    colordown 
=
 mcolors.to_rgba(colordown, alpha)
    colord 
=
 {True: colorup, False: colordown}

    dates, opens, highs, lows, closes, volumes 
= list(zip(*
quotes))
    colors 
= [colord[close1 >=
 close0]
              
for
 close0, close1 
in
 zip(closes[:-1], closes[1
:])
              
if
 close0 != -1 
and
 close1 != -1
]
    colors.insert(0, colord[closes[0] 
>=
 opens[0]])

    right 
= width / 2.0

    left 
= -width / 2.0


    bars 
=
 [((left, 0), (left, volume), (right, volume), (right, 0))
            
for
 d, open, high, low, close, volume 
in
 quotes]

    sx 
= ax.figure.dpi * (1.0 / 72.0)  
#
 scale for points

    sy = ax.bbox.height /
 ax.viewLim.height

    barTransform 
=
 Affine2D().scale(sx, sy)

    dates 
= [d 
for
 d, open, high, low, close, volume 
in
 quotes]
    offsetsBars 
= [(d, 0) 
for
 d 
in
 dates]

    useAA 
= 0,  
#
 use tuple here

    lw = 0.5,  
#
 and here

    barCollection =
 PolyCollection(bars,
                                   facecolors
=
colors,
                                   edgecolors
=((0, 0, 0, 1
),),
                                   antialiaseds
=
useAA,
                                   linewidths
=
lw,
                                   offsets
=
offsetsBars,
                                   transOffset
=
ax.transData,
                                   )
    barCollection.set_transform(barTransform)

    minpy, maxx 
=
 (min(dates), max(dates))
    miny 
=
 0
    maxy 
= max([volume 
for
 d, open, high, low, close, volume 
in
 quotes])
    corners 
=
 (minpy, miny), (maxx, maxy)
    ax.update_datalim(corners)
    
#
 print 'datalim', ax.dataLim.bounds
#
 print 'viewlim', ax.viewLim.bounds

    ax.add_collection(barCollection)
    ax.autoscale_view()

    
return
 barCollection


def
 index_bar(ax, vals,
              facecolor
=
'
b
'
, edgecolor=
'
l
'
,
              width
=4, alpha=1.0
, ):
    
"""
Add a bar collection graph with height vals (-1 is missing).
    Parameters
    ----------
    ax : `Axes`
        an Axes instance to plot to
    vals : sequence
        a sequence of values
    facecolor : color
        the color of the bar face
    edgecolor : color
        the color of the bar edges
    width : int
        the bar width in points
    alpha : float
       bar transparency
    Returns
    -------
    ret : `barCollection`
        The `barrCollection` added to the axes
    
"""


    facecolors 
=
 (mcolors.to_rgba(facecolor, alpha),)
    edgecolors 
=
 (mcolors.to_rgba(edgecolor, alpha),)

    right 
= width / 2.0

    left 
= -width / 2.0


    bars 
=
 [((left, 0), (left, v), (right, v), (right, 0))
            
for
 v 
in
 vals 
if
 v != -1
]

    sx 
= ax.figure.dpi * (1.0 / 72.0)  
#
 scale for points

    sy = ax.bbox.height /
 ax.viewLim.height

    barTransform 
=
 Affine2D().scale(sx, sy)

    offsetsBars 
= [(i, 0) 
for
 i, v 
in
 enumerate(vals) 
if
 v != -1
]

    barCollection 
=
 PolyCollection(bars,
                                   facecolors
=
facecolors,
                                   edgecolors
=
edgecolors,
                                   antialiaseds
=
(0,),
                                   linewidths
=(0.5
,),
                                   offsets
=
offsetsBars,
                                   transOffset
=
ax.transData,
                                   )
    barCollection.set_transform(barTransform)

    minpy, maxx 
=
 (0, len(offsetsBars))
    miny 
=
 0
    maxy 
= max([v 
for
 v 
in
 vals 
if
 v != -1
])
    corners 
=
 (minpy, miny), (maxx, maxy)
    ax.update_datalim(corners)
    ax.autoscale_view()

    
#
 add these last
    ax.add_collection(barCollection)
    
return
 barCollection

  

posted @ 2018-08-29 18:05  洺剑残虹  阅读(3029)  评论(0编辑  收藏  举报