df.plot()是Matplotlib轻量封装,需手动配置中文字体、负号显示、x轴指定、图例位置、样式控制及子图布局等细节,否则易出现乱码、横轴错乱、图例遮挡等问题。

直接用 df.plot(kind='line') 就能画,但默认行为常让人困惑
它不是“画不出来”,而是画出来后可能没标题、没坐标轴标签、中文乱码、线条挤成一团——因为 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')或指定位置
x 和 y 参数不填就容易出事
对 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() 支持 color、linestyle、marker 等基础参数,但像网格线样式、坐标轴刻度密度、图标题字体大小这些,它不暴露接口,必须用 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 很方便,但别忽略 layout 和 ax
想把每列数据单独画一张折线图(比如语文、数学、英语各一个子图),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)本身不提供批量样式入口
plot() 只负责把数据喂过去,剩下的得自己接住。










