Matplotlib绘制多子图+合并图例+子图间距

通过获取子图的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为子图之间高间距
对比图如下

设置了间距的图像

在这里插入图片描述

没有设置间距的图像

在这里插入图片描述

<think>好的,用户的问题是关于如何在Python使用Matplotlib或其他库绘制和散点的。我需要结合系统级指令和用户提供的参考内容来回答这个问题。首先,系统级指令要求使用中文回答,正确使用LaTeX格式的数学表达式,生成相关问题,并在引用处添加标识。用户提供的三个引用都是关于Matplotlib绘制散点的,特别是第三个引用提到封装方法,而用户还提到了和可能的“散点”(sandiantu可能为拼音错误)。我需要确保回答结构清晰,分步骤说明如何绘制和散点,并引用相关的参考资料。 首先,我应该先回答如何绘制散点,因为用户明确提到了,然后转向绘制。根据引用[1],用户已经知道使用Matplotlib的基本散点绘制方法,但可能需要更详细的说明或更复杂的例。接着,引用[2]提到了三维散点,用户可能对此也有兴趣,但问题主要聚焦在和二维散点。引用[3]提到了封装的散点方法,可以建议用户参考封装的方法,但可能需要给出具体示例。 对于部分,Matplotlib中的subplot和subplots函数是关键。需要解释如何使用这些函数创建,并在每个绘制不同的形,比如散点。可能需要展示一个包含的示例代码,每个展示不同类型的散点,或者不同数据集的情况。 然后,生成相关问题,确保问题与主题相关,比如性能优化、应用场景等。同时,注意引用标识的正确添加,在回答中引用参考内容的地方要自然标注,例如在提到Matplotlib绘制散点时引用[^1],三维散点引用[^2],封装方法引用[^3]。 需要检查LaTeX格式是否正确,比如行内公式使用$...$,独立公式使用$$...$$,但根据用户的问题,可能不需要太数学公式,但如果有涉及的话要确保格式正确。例如,在解释数据分布时可能会有数学表达式,如相关系数$r$,或者回归线方程等。 最后,确保回答结构清晰,分步骤说明,代码示例正确,并且相关问题有针对性。可能需要先介绍基本概念,然后给出代码示例,再讨论可能的变体或高级用法,如三维散点布局的调整。</think>### 绘制与散点Python实现 #### 1. 绘制散点 使用Matplotlib绘制散点时,通过$plt.scatter()$函数实现。以下是一个基础示例: ```python import matplotlib.pyplot as plt # 生成数据 x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] # 绘制散点 plt.scatter(x, y, color='red', marker='x', label='线性数据') plt.xlabel("X轴") plt.ylabel("Y轴") plt.title("基础散点示例") plt.legend() plt.grid(True) plt.show() ``` 此代码生成一个红色叉形标记的散点,并包含图例和网格线。 #### 2. 绘制 Matplotlib通过$plt.subplots()$或$plt.subplot()$创建多子图布局。以下是包含散点和折线示例: ```python import numpy as np # 创建数据 x = np.linspace(0, 10, 50) y1 = np.sin(x) y2 = np.cos(x) # 创建2x1的布局 fig, axes = plt.subplots(2, 1, figsize=(8, 6)) # 1:散点 axes[0].scatter(x, y1, color='green', label='sin(x)') axes[0].set_title("正弦函数散点") axes[0].legend() # 2:折线 axes[1].plot(x, y2, color='orange', label='cos(x)') axes[1].set_title("余弦函数折线") axes[1].legend() plt.tight_layout() # 自动调整间距 plt.show() ``` 此代码生成两行一列的,分别展示散点和折线[^2]。 #### 3. 高级应用:三维散点 对于三维数据,使用$mpl_toolkits.mplot3d$工具包: ```python from mpl_toolkits.mplot3d import Axes3D # 生成三维数据 z = np.random.rand(50) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y1, z, c='purple', marker='^') ax.set_xlabel('X轴') ax.set_ylabel('Y轴') ax.set_zlabel('Z轴') ax.set_title("三维散点") plt.show() ``` 此代码生成一个带三维坐标轴的紫色三角标记散点[^2]。 #### 4. 布局进阶 使用$plt.subplot2grid()$实现复杂布局: ```python plt.figure(figsize=(10,6)) # 定义布局结构 ax1 = plt.subplot2grid((3,3), (0,0), colspan=2) ax2 = plt.subplot2grid((3,3), (0,2), rowspan=3) ax3 = plt.subplot2grid((3,3), (1,0), rowspan=2, colspan=2) ax1.scatter(x[:10], y1[:10], color='blue') ax2.plot(x, y2, 'r--') ax3.hist(y1, bins=15, color='green') plt.tight_layout() plt.show() ``` 此布局包含三个不同尺寸的,分别展示散点、折线和直方[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青石横刀策马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值