最后运行的时候,报错说缺少一个必要参数“y”,这个报错问题该怎么解决
fit函数需要传入的是二维矩阵数据,X_train,Y_train数据类型不对吧
在进行数据分析时,有时候我们需要在同一个坐标图中比较两种数据在时间序列上的关系。
由于两种数据的单位和数据并不统一,也是不同的类型的数据,因此我们不能用一个Y轴来共同衡量两类不同的数据,这时候我们就需要绘制双Y轴图。
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
# 设置全局字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
datas = pd.read_excel(r'C:\Users\lin-a\Desktop\data\600001SH.xlsx')
# 将日期转换为时间戳,并设置为行索引
datas.index=pd.to_datetime(datas['日期'])
# 获取二月份的数据
feb_datas = datas['2015-02']
# 绘制图形
fig = plt.figure(figsize=(20,8),dpi=80)
ax = fig.add_subplot(111)
x = feb_datas.index.tolist()
# 将时间转换为字符串
x2 = [time.strftime('%Y-%m-%d') for time in x]
lin1 = ax.plot(x2,feb_datas['收盘价(元)'].values.tolist(),label='收盘价',color='red')
ax.legend(loc='upper left')
ax.set_ylabel("收盘价(元)")
ax.set_xlabel("日期")
plt.show()
以上的代码中:有add_subplot(),这个与plot()有什么异同呢?
plot是绘图,subplot是子图,整体不偏离这个框架。
fig.add_subplot(111)
此处,fig= plt.figure()是一个对象。
其中参数111,指的是将图像分成1行1列,此子图占据从左到右从上到下的1位置。
plt.subplot(234)
将画布分成2行3列,取从左到右,从上到下第4个位置。
两者本质是一样的,不同在于add_subplot是面向对象,subplot是面向函数
我们的目的是研究二月份某公司的每日收盘价以及对应的成交量,所以为方便分析,需要在一个双Y轴坐标图中同时绘制出收盘价和成交量的时间序列图。
双y轴绘制的关键函数是twinx(),twinx()函数表示共享X轴,共享表示的是X轴使用同一刻度线。
每日收盘价的折线图,我们已经绘制出来了,现在要使用twinx()绘制另外一条成交量折线图:
%matplotlib inline
from matplotlib import pyplot as plt
import pandas as pd
# 设置全局字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 导入数据
data = pd.read_excel(r'C:\Users\lin-a\Desktop\data\600001SH.xlsx')
# 查看数据的基本特征
print(data.shape)
# 将日期设置为数据的索引,便于使用日期选择数据
data.index = data['日期']
# 获取2月的数据
feb_data = data['2015-02']
# 获取x,y轴的数据
y = feb_data['收盘价(元)'].values.tolist()
y2 = feb_data['成交量(股)'].values.tolist()
x = feb_data.index.strftime('%Y-%m-%d').tolist()
# 设置画布大小
fig = plt.figure(figsize=(20,8),dpi=80)
# 设置ax对象
ax = fig.add_subplot(111)
ax2 = ax.twinx()
# 设置标题
plt.title('收盘价与成交量双曲线图')
# 设置第一条——收盘价曲线
line1 = ax.plot(x,y,label='收盘价',color='red')
ax.set_xlabel('日期')
ax.set_ylabel('收盘价(元)')
#设置图例
ax.legend(loc='upper left')
# 设置第二条——成交量曲线
line2 = ax2.plot(x,y2,label='成交量')
ax2.set_ylabel('成交量(股)')
# 设置图例
ax2.legend(loc='upper left')
# 绘制网格
ax.grid(linestyle='--',alpha=0.5)
plt.show()
(105, 13)
因为是共享X轴,所以只用ax.set_xlabel()就可以设置X轴的标题。
由于Y轴不共享,所以每一个坐标系的Y轴标题都要使用set_xlabel()方法设置一次。
代码中,我们设置了两次图例的显示,所以出现了两个图例重叠的现象,所以我们需要合并图例。合并图例的方法就是仅使用一个轴的legend()函数。
%matplotlib inline
from matplotlib import pyplot as plt
import pandas as pd
# 设置全局字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 导入数据
data = pd.read_excel(r'C:\Users\lin-a\Desktop\data\600001SH.xlsx')
# 查看数据的基本特征
print(data.shape)
# 将日期设置为数据的索引,便于使用日期选择数据
data.index = data['日期']
# 获取2月的数据
feb_data = data['2015-02']
# 获取x,y轴的数据
y = feb_data['收盘价(元)'].values.tolist()
y2 = feb_data['成交量(股)'].values.tolist()
x = feb_data.index.strftime('%Y-%m-%d').tolist()
# 设置画布大小
fig = plt.figure(figsize=(20,8),dpi=80)
# 设置ax对象
ax = fig.add_subplot(111)
ax2 = ax.twinx()
# 设置标题
plt.title('收盘价与成交量双曲线图')
# 设置第一条——收盘价曲线
line1 = ax.plot(x,y,label='收盘价',color='red')
ax.set_xlabel('日期')
ax.set_ylabel('收盘价(元)')
#设置图例
# ax.legend()
# 设置第二条——成交量曲线
line2 = ax2.plot(x,y2,label='成交量')
ax2.set_ylabel('成交量(股)')
# 设置图例
# ax2.legend()
# 合并图例
lns = line1+line2
labs = [l.get_label() for l in lns]
ax.legend(lns,labs,loc='upper left')
# 绘制网格
ax.grid(linestyle='--',alpha=0.5)
plt.show()
(105, 13)
以上新增的代码为:
# 合并图例
lns = line1+line2
labs = [l.get_label() for l in lns]
ax.legend(lns,labs,loc='upper left')
line1和line2分别是两个绘图方法plot()的返回值,即折线对象。需要注意的是,lin1和lin2的类型是list。
legend()方法可以指定图例中有哪些值,第一个参数lns表示将图中的多个线以列表的形势传进去,第二个参数labs表示将图例的名字以列表的形势传进去。