千家信息网

Python Matplotlib如何绘制多子图

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章将为大家详细讲解有关Python Matplotlib如何绘制多子图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。通过获取子图的label和线型来合并图例注
千家信息网最后更新 2025年01月18日Python Matplotlib如何绘制多子图

这篇文章将为大家详细讲解有关Python Matplotlib如何绘制多子图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

注意添加label

#导入数据(读者可忽略)pre_lp=total_res#组合模型true=diff1[-pre_day:]#真实值pre_ph=results_data["yhat"]#prophetpre_lstm=reslut#lstmpre_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=[]#通过循环获取线型和labelsfor 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"]#prophetpre_lstm=reslut#lstmpre_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如何绘制多子图"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0