Python Matplotlib绘制多子图详解
来源:脚本之家    时间:2022-02-21 12:10:01

通过获取子图的label和线型来合并图例

注意添加label

#导入数据(读者可忽略)
pre_lp=total_res#组合模型
true=diff1[-pre_day:]#真实值
pre_ph=results_data["yhat"]#prophet
pre_lstm=reslut#lstm
pre_ari=data_ari["data_pre"]#arima
#设置中文字体
rcParams["font.sans-serif"] = "kaiti"

# 生成一个时间序列 (读者可根据情况进行修改或删除)
time =pd.to_datetime(np.arange(0,21), unit="D",
                    origin=pd.Timestamp("2021-10-19"))
#创建画布
fig=plt.figure(figsize=(20,16))#figsize为画布大小
# 1 
ax1=fig.add_subplot(221)
ax1.plot(time,pre_lp,color="#1bb9f6",marker="^",linestyle="-",label="1")
# ax1.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax1.set_title("1",fontsize=15)#设置标题
ax1.set_xlabel("日期/天",fontsize=15)#设置横坐标名称
ax1.set_ylabel("感染人数/人",fontsize=15)#设置纵坐标名称
ax1.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))#设置横坐标刻度(读者可忽略)
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)#设置横坐标刻度(读者可忽略)

# 2 
ax2=fig.add_subplot(222)
ax2.plot(time,pre_ph,color="#739b06",marker="o",linestyle="-",label="2")
# ax2.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax2.set_title("2",fontsize=15)
ax2.set_xlabel("日期/天",fontsize=15)
ax2.set_ylabel("感染人数/人",fontsize=15)
ax2.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)
# 3 
ax3=fig.add_subplot(223)
ax3.plot(time,pre_lstm,color="#38d9a9",marker="*",linestyle="-",label="3")
# ax3.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax3.set_title("3",fontsize=15)
ax3.set_xlabel("日期/天",fontsize=15)
ax3.set_ylabel("感染人数/人",fontsize=15)
ax3.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)

# 4 
ax4=fig.add_subplot(224)
ax4.plot(time,pre_ari,color="#e666ff",marker="x",linestyle="-",label="4")
ax4.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax4.set_title("4",fontsize=15)
ax4.set_xlabel("日期/天",fontsize=15)
ax4.set_ylabel("感染人数/人",fontsize=15)
ax4.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)

#初始化labels和线型数组
lines=[]
labels=[]
#通过循环获取线型和labels
for ax in fig.axes:
    axLine, axLabel = ax.get_legend_handles_labels()
    lines.extend(axLine)
    labels.extend(axLabel)
#设置图例和调整图例位置
fig.legend(lines, labels,loc="lower center",
           ncol=5,framealpha=False,fontsize=25)

结果如下图

这个时候我们再把原先代码里面的通过循环获取label和线型注释掉,代码如下

#导入数据(读者可忽略)
pre_lp=total_res#组合模型
true=diff1[-pre_day:]#真实值
pre_ph=results_data["yhat"]#prophet
pre_lstm=reslut#lstm
pre_ari=data_ari["data_pre"]#arima
#设置中文字体
rcParams["font.sans-serif"] = "kaiti"

# 生成一个时间序列 (读者可根据情况进行修改或删除)
time =pd.to_datetime(np.arange(0,21), unit="D",
                    origin=pd.Timestamp("2021-10-19"))
#创建画布
fig=plt.figure(figsize=(20,16))#figsize为画布大小
# 1 
ax1=fig.add_subplot(221)
ax1.plot(time,pre_lp,color="#1bb9f6",marker="^",linestyle="-",label="1")
ax1.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax1.set_title("1",fontsize=15)#设置标题
ax1.set_xlabel("日期/天",fontsize=15)#设置横坐标名称
ax1.set_ylabel("感染人数/人",fontsize=15)#设置纵坐标名称
ax1.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))#设置横坐标刻度(读者可忽略)
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)#设置横坐标刻度(读者可忽略)

# 2 
ax2=fig.add_subplot(222)
ax2.plot(time,pre_ph,color="#739b06",marker="o",linestyle="-",label="2")
ax2.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax2.set_title("2",fontsize=15)
ax2.set_xlabel("日期/天",fontsize=15)
ax2.set_ylabel("感染人数/人",fontsize=15)
ax2.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)
# 3 
ax3=fig.add_subplot(223)
ax3.plot(time,pre_lstm,color="#38d9a9",marker="*",linestyle="-",label="3")
ax3.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax3.set_title("3",fontsize=15)
ax3.set_xlabel("日期/天",fontsize=15)
ax3.set_ylabel("感染人数/人",fontsize=15)
ax3.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)

# 4 
ax4=fig.add_subplot(224)
ax4.plot(time,pre_ari,color="#e666ff",marker="x",linestyle="-",label="4")
ax4.plot(time,true,color="#fd5749",marker="s",linestyle="-",label="true")
ax4.set_title("4",fontsize=15)
ax4.set_xlabel("日期/天",fontsize=15)
ax4.set_ylabel("感染人数/人",fontsize=15)
ax4.xaxis.set_major_formatter(mdate.DateFormatter("%m-%d"))
plt.xticks(pd.date_range(time[0],time[-1],freq="D"),rotation=45)

#初始化labels和线型数组
# lines=[]
# labels=[]
#通过循环获取线型和labels
# for ax in fig.axes:
#  	 axLine, axLabel = ax.get_legend_handles_labels()
#    lines.extend(axLine)
#    labels.extend(axLabel)
#设置图例和调整图例位置
fig.legend(lines, labels,loc="lower center",
           ncol=5,framealpha=False,fontsize=25)

结果如下图

调整子图间距

plt.subplots_adjust(wspace=0.4,hspace=0.4)

wspace为子图之间宽间距,hspace为子图之间高间距

对比图如下

设置了间距的图像

没有设置间距的图像

到此这篇关于Python Matplotlib绘制多子图详解的文章就介绍到这了,更多相关Python Matplotlib多子图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

关键词: 组合模型 进行修改 导入数据 时间序列 这个时候

X 关闭

X 关闭