Python 使用matplotlib绘制不带周末间隙的时间序列的烛台

Python 使用matplotlib绘制不带周末间隙的时间序列的烛台,python,matplotlib,plot,candlestick-chart,Python,Matplotlib,Plot,Candlestick Chart,从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

从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”]
转换为float,然后再转换为
datetime
后,我单独绘制烛台,它将使用正确的x轴绘制系列,但即使没有为这些日期定义系列,周末也会有间隙


有办法同时绘制两个系列吗?我计划添加更多的系列,如移动平均线、OLS、Bollinger等。

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

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()

您可以通过这种方式消除周末间隙,并使人们可以读取日期。注意,这个脚本是用Python3编写的,可能与Python2有些不同

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()

据我所知,您希望绘制无间隙的烛台图,并使xlables成为实际日期,而不是整数。为此,在数据数组中,将日期替换为从0开始的整数。这样,周末的间隙就会消失。然后,要将整数替换为日期,请创建包含日期的列表,并设置xticklabels。你可以用“setxticklabels”的方法来做。我要试试这个。谢谢,我试过了,如果我使用整数列表,我可以画直线和烛台,没有间隙。但是当我使用带有列表的ax1.setxticklabels来更改名称时,记号是完全静态的,如果我放大,它们就不会移动。仅显示列表中的前10个元素,其余元素从不显示。您可以根据需要自定义xticks列表。当然,设置日期列表的前10个元素xticklabel是不可取的。为了避免这种情况,您应该从列表中选择10个索引,将列表分成10个相等的部分。我建议您使用numpy linspace函数完成此任务。谢谢。我已经尝试过这种方法,但由于周六和周日没有金融时间序列的数据,所以在绘制时存在差距。我的数据是这样加载的:data=web.DataReader(str(ent.get()),'yahoo',start,end)。sort_index()可以使用循环读取列表中的所有日期对于范围(0,len(list))中的j:``dates.append(matplotlib.dates.date2num([list[j]`