【问题标题】:Plotting candlestick with matplotlib for time series w/o weekend gaps用 matplotlib 为时间序列绘制烛台,没有周末间隔
【发布时间】:2017-10-28 16:59:24
【问题描述】:

从 yahoo-finance 导入数据后尝试绘制烛台系列。我正在使用 python 2.7

我已经绘制了一个系列,我想添加与烛台相同的一个,但我不知道该怎么做:

import matplotlib.pyplot as plt
from matplotlib.finance import candlestick2_ohlc

#Reset the index to remove Date column from index
df_ohlc = data.reset_index()
#Naming columns
df_ohlc.columns = ["Date","Open","High",'Low',"Close", "Adj Close", "Volume"]
#Normal plot
ax1 = plt.subplot()
ax1.plot(df_ohlc["Date"], df_ohlc["Close"], label = "Price", color="blue", linewidth=2.0)
#Candle plot
candlestick2_ohlc(ax1,df_ohlc['Open'],df_ohlc['High'],df_ohlc['Low'],df_ohlc['Close'],width=0.6)

如果我单独绘制烛台,它看起来不错,但 x 轴是整数列表。

如果我在将df_ohlc["Date"] 转换为浮动然后重新转换为datetime 之后单独绘制烛台,它会用正确的 x 轴绘制系列,但即使未为这些日期定义系列,周末也会有间隙。

有没有办法同时绘制两个系列?我计划添加更多系列,如移动平均线、OLS、布林线等...

【问题讨论】:

  • 据我了解,您希望绘制没有间隙的烛台图并制作 xlables 实际日期而不是整数。为了做到这一点,在你的数据数组中用从 0 开始的整数替换日期。这样,周末的间隔就会消失。然后用日期替换整数创建包含日期的列表并设置 xticklabels。你可以使用 'set_xticklabels' 方法来做。
  • 我要试试这个。谢谢
  • 所以我尝试了,如果我使用整数列表,我可以无间隙地绘制线和烛台。但是当我使用带有列表的 ax1.set_xticklabels 来更改名称时,刻度是完全静态的,如果我放大,它们就不会移动。仅显示列表中的前 10 个元素,其余的从不显示。
  • 您可以根据需要自定义 xticks 列表。当然,设置日期列表 xticklabels 的前 10 个元素是不可取的。为了避免这种情况,您应该从列表中选择十个索引,将您的列表分成 10 个相等的部分。我建议您为此任务使用 numpy linspace 函数。

标签: python matplotlib plot candlestick-chart


【解决方案1】:

您可以通过这种方式消除周末间隔并制作人类可读的日期 xticklabels。请注意,此脚本是用 python 3 编写的,与 python 2 可能存在一些差异。

import quandl
import numpy as np
from mpl_finance import candlestick_ohlc
import matplotlib.pyplot as plt

# getting data and modifying it to remove gaps at weekends
r = quandl.get('WIKI/AAPL', start_date='2016-01-01', end_date='2017-11-10')
date_list = np.array(r.index.to_pydatetime())
plot_array = np.zeros([len(r), 5])
plot_array[:, 0] = np.arange(plot_array.shape[0])
plot_array[:, 1:] = r.iloc[:, :4]

# plotting candlestick chart
fig, ax = plt.subplots()
num_of_bars = 100  # the number of candlesticks to be plotted
candlestick_ohlc(ax, plot_array[-num_of_bars:], colorup='g', colordown='r')
ax.margins(x=0.0, y=0.1)
ax.yaxis.tick_right()
x_tick_labels = []
ax.set_xlim(right=plot_array[-1, 0]+10)
ax.grid(True, color='k', ls='--', alpha=0.2)
# setting xticklabels actual dates instead of numbers
indices = np.linspace(plot_array[-num_of_bars, 0], plot_array[-1, 0], 8, dtype=int)
for i in indices:
    date_dt = date_list[i]
    date_str = date_dt.strftime('%b-%d')
    x_tick_labels.append(date_str)
ax.set(xticks=indices, xticklabels=x_tick_labels)

plt.show()

【讨论】:

    【解决方案2】:

    我确实需要有关您的代码和数据框的更多信息,但您可以使用此示例制作烛台

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.ticker as mticker
    from matplotlib.finance import candlestick_ohlc
    import matplotlib.dates as mdates
    import datetime as dt
    
    #Reset the index to remove Date column from index
    df_ohlc = df.reset_index()
    #Naming columns
    df_ohlc.columns = ["Date","Open","High",'Low',"Close", "Adj Close", "Volume"]
    #Converting dates column to float values
    df_ohlc['Date'] = df_ohlc['Date'].map(mdates.date2num)
    
    #Making plot
    fig = plt.figure()
    fig.autofmt_xdate()
    ax1 = plt.subplot2grid((6,1), (0,0), rowspan=6, colspan=1)
    
    #Converts raw mdate numbers to dates
    ax1.xaxis_date()
    plt.xlabel("Date")
    print(df_ohlc)
    
    #Making candlestick plot
    candlestick_ohlc(ax1,df_ohlc.values,width=1, colorup='g', colordown='k',alpha=0.75)
    plt.ylabel("Price")
    plt.legend()
    
    plt.show()
    

    【讨论】:

    • 谢谢。我已经尝试过这种方法,并且在绘制时存在差距,因为在金融时间序列上没有周六和周日的数据。我的数据以这种方式加载: data = web.DataReader(str(ent.get()), 'yahoo', start, end).sort_index()
    • 您可以使用循环读取列表中的所有日期。 ` for j in range(0, len(list)):` `dates.append(matplotlib.dates.date2num([list[j]`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多