为何Python for循环中首个绘图尺寸未生效,后续绘图格式正常?
问题描述
我编写了如下Python代码,遍历log_df的每一行,从两列中提取开始时间戳和结束时间戳以确定时序范围,再从另一时序数据DataFrame(data_df)中截取对应范围的数据并绘图。代码可正常运行,但存在问题:生成的第一个绘图未应用我设置的尺寸,后续所有绘图的尺寸均符合预期。困惑为何循环内的figsize参数未作用于第一个绘图,该如何正确设置以让所有绘图格式一致?
from datetime import datetime import pandas as pd import numpy as np from functools import reduce pd.options.mode.chained_assignment = None # default='warn' #Ignore warning messages from matplotlib import pyplot as plt from matplotlib.pyplot import figure import matplotlib as mpl from datetime import datetime, timedelta import warnings warnings.filterwarnings("ignore") for index, row in log_df.iterrows(): print('Range ID: ' + str(row['cycle_ID'])) start_time_string = row['Start_time'] end_time_string = row['End_time'] start_time = datetime.strptime(start_time_string, '%Y-%m-%d %H:%M:%S') end_time = datetime.strptime(end_time_string, '%Y-%m-%d %H:%M:%S') print('Start timestamp: ' + str(start_time)) print('End timestamp: ' + str(end_time)) mask = (data_df['timestamp'] > start_time) & (data_df['timestamp'] <= end_time) df_masked = data_df.loc[mask] df_masked plt.rcParams['figure.figsize'] = [20, 10] df_masked.plot('localminute' , 'values', legend=False) plt.xlabel("Timestamp", fontsize=14) plt.ylabel("Watts", fontsize=14) plt.show()
问题原因与解决办法
原因
plt.rcParams['figure.figsize'] 的设置仅对之后创建的新figure生效。第一次循环时,pandas的plot()方法会自动创建第一个figure,但此时你是先调用了plot()再设置rcParams,导致第一个图未应用该尺寸;后续循环中,plt.show()会关闭当前figure,下次plot()会基于已修改的rcParams创建新图,所以尺寸符合预期。
解决办法(三种可选)
1. 提前全局设置rcParams
把尺寸设置移到循环外部,在导入matplotlib后立即配置,让所有后续生成的figure默认使用该尺寸:
from matplotlib import pyplot as plt # 全局设置,放在循环前 plt.rcParams['figure.figsize'] = [20, 10] for index, row in log_df.iterrows(): # 循环内代码保持不变,移除原有的rcParams设置 ...
2. 手动创建figure再绘图
每次绘图前手动创建指定尺寸的figure,避免pandas自动创建时的时序问题:
for index, row in log_df.iterrows(): ... df_masked = data_df.loc[mask] # 手动创建指定尺寸的figure plt.figure(figsize=(20, 10)) df_masked.plot('localminute' , 'values', legend=False) plt.xlabel("Timestamp", fontsize=14) plt.ylabel("Watts", fontsize=14) plt.show()
3. 在pandas plot方法中直接指定figsize
利用pandas plot() 方法自带的figsize参数,直接传入尺寸,无需修改全局配置:
# 替换原plot行,加入figsize参数 df_masked.plot('localminute' , 'values', legend=False, figsize=(20, 10))
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

