绘制 pandas 数据框的两列
绘制 pandas 数据框的两列
我有一个pandas的数据框,其中日期是索引,还有一些列:
我想要绘制一张折线图,有两条线(假设是'ISP.MI'和'Ctrv');在x轴上我需要使用'Date'。
Ticker ISP.MI Daily returns Ctrv Inv_Am Giac_Media Date 2016-01-01 2.90117 NaN 100.000000 100 100.0 2016-01-04 2.80159 -0.034927 196.507301 200 150.0 2016-01-05 2.85608 0.019263 300.292610 300 200.0 2016-01-06 2.77904 -0.027345 392.081255 400 250.0 2016-01-07 2.73206 -0.017050 485.396411 500 300.0 2016-01-08 2.72267 -0.003443 583.725246 600 350.0
问题出现的原因是在使用plot函数时,指定了要绘制的x轴列名为'x',而y轴列名为['y_one','y_two']。然而,根据pandas的plot函数文档,y参数需要传入一个标量或者一个列名的列表。因此,传入列表['y_one','y_two']会导致报错。
解决方法是将y参数传入一个单独的列名,然后通过在DataFrame中选择相应的列来绘制。以下是修改后的代码:
import numpy as np import pandas as pd import matplotlib.pyplot as plt d = {'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'y_one': np.random.rand(10), 'y_two': np.random.rand(10)} df = pd.DataFrame(d) # 选择要绘制的y轴列 df.plot('x', y='y_one') df.plot('x', y='y_two') plt.show()
通过分别调用plot函数,传入正确的y轴列名,可以成功绘制两个列的折线图。
问题的出现原因:这个问题出现的原因是因为在绘制pandas dataframe中的两列数据时,有些人可能不关心轴的刻度(scale),只是简单地将两列数据绘制到同一个图表中。而另一些人可能希望关注轴的刻度(scale),以便更好地理解数据之间的趋势和关系。
解决方法:根据不同的需求,可以采用两种不同的解决方法。
如果不关心轴的刻度(scale),可以使用以下代码:
plt.figure() x = df['Date'] y1 = df['ISP.MI'] y2 = df['Ctrv'] plt.plot(x, y1) plt.plot(x, y2)
这样就可以将两列数据绘制在同一个图表中,轴的刻度(scale)将会自动调整。
如果关心轴的刻度(scale),可以使用以下代码:
fig, ax1 = plt.subplots() x = df['Date'] y1 = df['ISP.MI'] y2 = df['Ctrv'] ax2 = ax1.twinx() ax1.plot(x, y1, 'g-') ax2.plot(x, y2, 'b-')
这样就可以将两列数据绘制在同一个图表中,同时轴的刻度(scale)会根据数据的范围自动调整,使得两列数据的趋势和关系更加清晰可见。
通过以上的两种解决方法,我们可以根据自己的需求选择合适的方式绘制pandas dataframe中的两列数据,并根据需要关注或不关注轴的刻度(scale)。这样可以更好地展示数据的趋势和关系,帮助我们更好地理解和分析数据。