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

如何正确封装Pandas绘图函数以生成不同时间段的时间序列图?

问题原因
  • 数据中year列存储的是字符串类型(如'2014'),但调用函数时传入的是整数2014,导致过滤条件df.year == y无法匹配到任何数据,最终分组后的tmp为空,因此生成空图。
  • 若多次调用函数,未创建独立画布会导致图表重叠,影响展示效果。
修正后的函数及调用方式

方案1:自动适配参数类型(推荐)

修改函数,自动将传入的年份转为字符串,同时添加空数据判断和独立画布创建,避免后续问题:

import seaborn as sns
import pandas as pd
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

def plot_year(df, y):
    # 统一年份参数为字符串,匹配数据类型
    y_str = str(y)
    df_filtered = df[df.year == y_str]
    
    # 提前判断无数据情况
    if df_filtered.empty:
        print(f"未找到年份为{y}的数据")
        return None
    
    tmp = (df_filtered.groupby(['CAT', pd.to_datetime(df_filtered['month'], format='%Y%m')])
           ['appl'].mean().reset_index(name='probability of application')
          )
    
    # 创建独立画布,避免多图重叠
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.lineplot(data=tmp, x='month', y='probability of application', hue='CAT', ax=ax)
    
    ax.tick_params(axis='x', rotation=45)
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
    ax.set_title(f"申请概率趋势 - {y}年")
    plt.tight_layout()  # 自动调整布局,防止标签截断
    return ax

调用示例

# 先将字典转为DataFrame
sample = pd.DataFrame(data)

# 传入整数或字符串年份均可
plot_year(sample, 2014)
# 或
plot_year(sample, '2014')

# 显示图表
plt.show()

方案2:直接传入字符串年份

如果不想修改函数,调用时直接传入字符串类型的年份即可:

plot_year(sample, '2014')
plt.show()
额外说明
  • 添加空数据判断可以提前反馈问题,避免生成无效空图。
  • 创建独立画布能保证多次调用函数时,每次生成的图表都是独立的,不会出现重叠覆盖。
  • plt.tight_layout()会自动调整图表元素位置,避免X轴日期标签被截断。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:13:17