如何正确封装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
相关产品推荐
相关产品推荐

