如何使用Pandas的_df.plot()函数结合Matplotlib绘制折线图?

2026-05-08 05:175阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计1002个文字,预计阅读时间需要5分钟。

如何使用Pandas的_df.plot()函数结合Matplotlib绘制折线图?

它不是画不出来,而是画出后可能没有、没有坐标轴标签、没有图例、中文乱码、线条折断等——因为df.plot()是Matplotlib的轻量级封装,不自动处理中文字体、负号显示、图例位置等细节。

  • 必须提前设置 plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False,否则中文标题/标签显示为方块,负数变成小方框
  • df.plot() 默认把 DataFrame 的索引当 x 轴,列名当 y 轴;如果想用某列为 x(比如 '日期'),必须显式传 x='日期',否则容易画错横轴顺序
  • 多列数据(如 ['销售额', '成本'])会自动画多条线并加图例,但图例默认在右上角,常遮挡数据——加 legend=True 没用(它本来就是 True),要用 plt.legend(loc='best') 或指定位置

xy 参数不填就容易出事

DataFrame,不设 x 时,x 轴强制用索引;设了 y 才限制画哪些列。但很多人误以为 y=['A','B'] 就够了,忘了 x 还是索引,结果时间序列图横轴变成 0,1,2,3…

  • 时间类数据务必用 df.plot(x='日期', y=['销售额', '成本']),且确保 '日期' 列是 datetime64 类型,否则排序错乱
  • 如果只画单列(如 y='销售额'),x 可省略;但一旦涉及多列或非索引列做横轴,x 必须明确指定
  • y 接受字符串(单列)或字符串列表(多列),但不能传 Series —— 会报 KeyError,因为它是按列名查 DataFrame 的

样式控制别只靠 plot(),该交还给 plt 的就得交

df.plot() 支持 colorlinestylemarker 等基础参数,但像网格线样式、坐标轴刻度密度、图标题字体大小这些,它不暴露接口,必须用 plt 或返回的 Axes 对象操作。

  • 想让网格变虚线+半透明:ax.grid(True, linestyle=':', alpha=0.5),而不是指望 grid=True 自动美化
  • 修改标题字号:ax.set_title('趋势图', fontsize=14)df.plot(title='趋势图') 不支持字号控制
  • 保存高清图必须用 plt.savefig('trend.png', dpi=300, bbox_inches='tight'),直接关窗口再截图会糊

子图布局用 subplots=True 很方便,但别忽略 layoutax

想把每列数据单独画一张折线图(比如语文、数学、英语各一个子图),df.plot(subplots=True) 看似简单,实际容易失控:子图堆成一列太长、共享 y 轴导致尺度失真、图之间没空隙。

  • layout=(2, 2) 明确指定 2×2 网格,比默认垂直排列更可控
  • plt.subplots_adjust(hspace=0.3, wspace=0.2) 手动调间距,否则标题和上图紧贴
  • 若需统一设置某项(如所有子图都加网格),得循环遍历 ax 数组:for a in ax.flat: a.grid(True)df.plot(subplots=True) 本身不提供批量样式入口
真正卡住人的,从来不是“怎么画出来”,而是“为什么横轴顺序不对”“为什么图例盖住了峰值”“为什么保存后字变小了”——这些细节全在 Matplotlib 层,Pandas 的 plot() 只负责把数据喂过去,剩下的得自己接住。

本文共计1002个文字,预计阅读时间需要5分钟。

如何使用Pandas的_df.plot()函数结合Matplotlib绘制折线图?

它不是画不出来,而是画出后可能没有、没有坐标轴标签、没有图例、中文乱码、线条折断等——因为df.plot()是Matplotlib的轻量级封装,不自动处理中文字体、负号显示、图例位置等细节。

  • 必须提前设置 plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False,否则中文标题/标签显示为方块,负数变成小方框
  • df.plot() 默认把 DataFrame 的索引当 x 轴,列名当 y 轴;如果想用某列为 x(比如 '日期'),必须显式传 x='日期',否则容易画错横轴顺序
  • 多列数据(如 ['销售额', '成本'])会自动画多条线并加图例,但图例默认在右上角,常遮挡数据——加 legend=True 没用(它本来就是 True),要用 plt.legend(loc='best') 或指定位置

xy 参数不填就容易出事

DataFrame,不设 x 时,x 轴强制用索引;设了 y 才限制画哪些列。但很多人误以为 y=['A','B'] 就够了,忘了 x 还是索引,结果时间序列图横轴变成 0,1,2,3…

  • 时间类数据务必用 df.plot(x='日期', y=['销售额', '成本']),且确保 '日期' 列是 datetime64 类型,否则排序错乱
  • 如果只画单列(如 y='销售额'),x 可省略;但一旦涉及多列或非索引列做横轴,x 必须明确指定
  • y 接受字符串(单列)或字符串列表(多列),但不能传 Series —— 会报 KeyError,因为它是按列名查 DataFrame 的

样式控制别只靠 plot(),该交还给 plt 的就得交

df.plot() 支持 colorlinestylemarker 等基础参数,但像网格线样式、坐标轴刻度密度、图标题字体大小这些,它不暴露接口,必须用 plt 或返回的 Axes 对象操作。

  • 想让网格变虚线+半透明:ax.grid(True, linestyle=':', alpha=0.5),而不是指望 grid=True 自动美化
  • 修改标题字号:ax.set_title('趋势图', fontsize=14)df.plot(title='趋势图') 不支持字号控制
  • 保存高清图必须用 plt.savefig('trend.png', dpi=300, bbox_inches='tight'),直接关窗口再截图会糊

子图布局用 subplots=True 很方便,但别忽略 layoutax

想把每列数据单独画一张折线图(比如语文、数学、英语各一个子图),df.plot(subplots=True) 看似简单,实际容易失控:子图堆成一列太长、共享 y 轴导致尺度失真、图之间没空隙。

  • layout=(2, 2) 明确指定 2×2 网格,比默认垂直排列更可控
  • plt.subplots_adjust(hspace=0.3, wspace=0.2) 手动调间距,否则标题和上图紧贴
  • 若需统一设置某项(如所有子图都加网格),得循环遍历 ax 数组:for a in ax.flat: a.grid(True)df.plot(subplots=True) 本身不提供批量样式入口
真正卡住人的,从来不是“怎么画出来”,而是“为什么横轴顺序不对”“为什么图例盖住了峰值”“为什么保存后字变小了”——这些细节全在 Matplotlib 层,Pandas 的 plot() 只负责把数据喂过去,剩下的得自己接住。