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
相关产品推荐
相关产品推荐

