在 matplotlib 中自定义灯芯和烛台时出现问题 (mpl_finance)

Problem customizing wicks and candlesticks in matplotlib (mpl_finance)

我希望实现用户的代码:importanceofbeingernest

在下面post:

但是,当我尝试使用 candlestick2_ohlc 实现它时出现以下错误:

    141 
--> 142   for line, patch in zip(lines, patches):
    143       patch.set_edgecolor("k")
    144       patch.set_linewidth(0.72)

TypeError: zip argument #1 must support iteration

这是代码:

fig, ax = plt.subplots()
  candlestick2_ohlc(ax,quotes['Open'],quotes['High'],quotes['Low'],quotes['Close'],width=0.5)

  lines, patches = candlestick2_ohlc(ax,quotes['Open'],quotes['High'],quotes['Low'],quotes['Close'],width=0.5)

  for line, patch in zip(lines, patches):
      patch.set_edgecolor("k")
      patch.set_linewidth(0.72)
      patch.set_antialiased(False)
      line.set_color("k")
      line.set_zorder(0)

  candlestick_ohlc_black(ax,quotes['Open'],quotes['High'],quotes['Low'],quotes['Close'],width=0.5) 

这来自 matplotlib 文档。请注意,通过使用 candlestick2_ohlc 方法,我必须添加开盘价、最高价、最低价、收盘价作为参数,而不是将它们全部叠加。

matplotlib.finance.candlestick2_ohlc(ax, opens, highs, lows, closes, width=4, colorup='k', colordown='r', alpha=0.75)

我也试过这个而不是for line, patch in zip(lines, patches):循环:

for line in lines: 
    line.set_color("k")
    line.set_zorder(0)

  for patch in patches:
    patch.set_edgecolor("k")
    patch.set_linewidth(0.72)
    patch.set_antialiased(False)

并得到以下错误

    141 
--> 142   for line in lines:
    143     line.set_color("k")
    144     line.set_zorder(0)

TypeError: 'LineCollection' object is not iterable

更新,感谢 importanceofbeingernest,我也尝试过:


  lines, patches = candlestick2_ohlc(ax,quotes['Open'],quotes['High'],quotes['Low'],quotes['Close'],width=0.5,colorup='g',colordown='r')

  patches.set_edgecolor("k") # works
  patches.set_linewidth(0.72) #works
  patches.set_antialiased(False) # no idea if works
  lines.set_color("b") # doesn't work
  lines.set_zorder(0) #doesn't work

线条似乎不起作用,但补丁可以。 仍在努力寻找解决方法。

更新 2 显示图表的最小示例代码:

import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
import datetime
import pandas_datareader.data as web
import matplotlib.ticker as ticker
from mpl_finance import candlestick2_ohlc 

def generate_chart_EnterTrade(quotes):
  quotes['Date'] = quotes.index
  # Order the dataframe
  quotes = quotes[['Date','Open', 'High', 'Low', 'Close','Volume']] 

  fig, ax = plt.subplots()
  candlestick2_ohlc(ax,quotes['Open'],quotes['High'],quotes['Low'],quotes['Close'],width=0.33,colorup='g',colordown='r')
  '''
  lines, patches = candlestick2_ohlc(ax,quotes['Open'],quotes['High'],quotes['Low'],quotes['Close'],width=0.5,colorup='g',colordown='r')

  patches.set_edgecolor("k") # works
  patches.set_linewidth(0.72) #works
  patches.set_antialiased(False) # no idea if works
  lines.set_color("b") # doesn't work
  lines.set_zorder(0) #doesn't work
  '''

  def mydate(x,pos):
      try: 
          a = quotes['Date'][int(x)]
          return '{: %d %b}'.format(a)
      except IndexError:
          return ''


  ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate))

  ax.yaxis.tick_right()
  fig.tight_layout()   
  plt.grid(color='#C0C0C0', linestyle='--', linewidth=0.5)
  plt.show()


end = datetime.datetime.now()
start = end - datetime.timedelta(days=100)
data = web.DataReader('AAPL', 'yahoo', start, end)

generate_chart_EnterTrade(data)

输出:

以下适合我

lines, patches = candlestick2_ohlc(ax, ..., alpha=1)
lines.set_color("b")
lines.set_zorder(1)

此图中的结果(放大):