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

Pandas绘制折线图时x、y轴用同一列数据报错求助

问题原因与解决办法

问题原因

pandas的plot.line()方法在指定x参数时,会自动将该列从DataFrame的可用数据列中排除(默认逻辑认为x轴列不会同时作为y轴数据)。当你尝试同时指定y='y_1'时,DataFrame中已找不到该列,因此抛出KeyError。而plot.scatter()没有这个限制,所以能正常运行。

解决办法

以下是几种可行的解决方案:

方案1:直接使用matplotlib原生plot函数

绕过pandas的line plot限制,直接调用matplotlib绘制参考线:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def plot_me():
    df = pd.DataFrame({
        'y_1': [20, 30, 290, 675, 800],
        'y_2': [22, 25, 281, 600, 900]
    }, index=[1990, 1997, 2003, 2009, 2014])
   
    df.plot.line(x='y_1', y='y_2')    
    # 直接用matplotlib绘制y=x参考线
    plt.plot(df['y_1'], df['y_1'], color='red', linestyle='--')
    plt.show()

plot_me()

方案2:复制y_1列作为新列

给DataFrame添加y_1的副本,避免x参数导致的列排除:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def plot_me():
    df = pd.DataFrame({
        'y_1': [20, 30, 290, 675, 800],
        'y_2': [22, 25, 281, 600, 900]
    }, index=[1990, 1997, 2003, 2009, 2014])
    # 复制y_1列作为参考线数据列
    df['y_1_ref'] = df['y_1']
   
    df.plot.line(x='y_1', y='y_2')    
    df.plot.line(x='y_1', y='y_1_ref', color='red', linestyle='--')
    plt.show()

plot_me()

方案3:直接传入x和y的Series数据

调用plot.line()时,不指定列名,直接传入对应的Series对象:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def plot_me():
    df = pd.DataFrame({
        'y_1': [20, 30, 290, 675, 800],
        'y_2': [22, 25, 281, 600, 900]
    }, index=[1990, 1997, 2003, 2009, 2014])
   
    df.plot.line(x='y_1', y='y_2')    
    # 直接传入Series作为x、y数据源
    df.plot.line(x=df['y_1'], y=df['y_1'], color='red', linestyle='--')
    plt.show()

plot_me()

额外优化:绘制通用y=x参考线

如果需要覆盖整个坐标轴范围的理想参考线,可基于当前轴范围绘制:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def plot_me():
    df = pd.DataFrame({
        'y_1': [20, 30, 290, 675, 800],
        'y_2': [22, 25, 281, 600, 900]
    }, index=[1990, 1997, 2003, 2009, 2014])
   
    df.plot.line(x='y_1', y='y_2')    
    # 获取当前坐标轴的范围,绘制覆盖全范围的参考线
    ax = plt.gca()
    lims = [min(ax.get_xlim()[0], ax.get_ylim()[0]), max(ax.get_xlim()[1], ax.get_ylim()[1])]
    plt.plot(lims, lims, 'r--')
    plt.show()

plot_me()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:40:20