You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:05:20