如何在pandas plot()中自动推断轴

如何在pandas plot()中自动推断轴,pandas,plot,Pandas,Plot,我正在努力复制熊猫df.plot()文档的“基本绘图:绘图”部分中戏谑地承诺的优雅、轻松和成功的结果: 在这里,作者的第一幅图像非常接近我想从数据框中绘制的线图。他们的第一个df和结果图是一条直线,正如我希望我下面的df在绘制时看起来一样 我的df看起来像这样: 2014-03-28 2014-04-04 2014-04-11 2014-04-18 \ Jenny Todd 1699.6 1741.6 1710.7 1744.

我正在努力复制熊猫df.plot()文档的“基本绘图:绘图”部分中戏谑地承诺的优雅、轻松和成功的结果:

在这里,作者的第一幅图像非常接近我想从数据框中绘制的线图。他们的第一个df和结果图是一条直线,正如我希望我下面的df在绘制时看起来一样

我的df看起来像这样:

            2014-03-28  2014-04-04  2014-04-11  2014-04-18  \
Jenny Todd    1699.6      1741.6      1710.7      1744.2   

            2014-04-25  2014-05-02  2014-05-09  
Jenny Todd    1764.2      1789.7      1802.3 
他们的第二个图像是一个多线图,非常类似于我试图绘制df的多索引版本时所希望的。例如:

                    2014-06-13  2014-06-20  2014-06-27  \
William Acer        1674.7      1689.4      1682.0   
Katherine Baker     1498.5      1527.3      1530.5   


                    2014-07-04  2014-07-11  2014-07-18  \
William Acer        1700.0      1674.5      1677.8   
Katherine Baker     1540.4      1522.3      1537.3   

                    2014-07-25  
William Acer        1708.0  
Katherine Baker     1557.1
然而,他们得到了阴谋。我得到了3.3kb的图像和警告:

/home/lee/test/local/lib/python2.7/site packages/matplotlib/axes/_base.py:2787:UserWarning:试图设置相同的left==right会导致奇异变换;自动扩展。 左=0.0,右=0.0 '左=%s,右=%s')%(左,右))

文档的作者似乎拥有plot()函数,该函数从df的索引中推断x轴的值以及y轴的范围和值

四处搜索,我可以找到拥有不同数据、不同索引和不同场景(例如,绘制一列与另一列或试图生成多个子图)的人,他们会出现这种“轴”错误。然而,我无法将他们的问题映射到我的问题

我想知道是否有人可以帮助解决我的数据或代码的不同之处,从而导致与文档中看似相似的数据和看似相似的代码不同的绘图结果

我的代码:

print plotting_df # (This produces the df examples I pasted above)
plottest = plotting_df.plot.line(title='Calorie Intake', legend=True)
plottest.set_xlabel('Weeks')
plottest.set_ylabel('Calories')
fig = plt.figure()
plot_name = week_ending + '_' + collection_name + '.png'
fig.savefig(plot_name)
请注意,此数据帧在脚本中动态创建了很多次。在任何给定的运行中,脚本都将获得不同的日期集、不同的人名和不同的数字来绘制。所以我不知道索引和图例标签会出现什么样的字符串,以便事先打印。我确实对格式有预见性

我发现我的dataframe的日期索引与参考文档中描述的日期格式不同。这是原因吗?不管是不是,一个人应该如何最好地处理这个问题

添加于2016-08-24,以回答以下关于无法重新创建我的数据的评论

plotting_df是作为更大数据帧的子集动态创建的。它只是一个索引(有时是多个索引)和一些从较大的数据框中提取的日期列。生成plotting_df的代码运行良好,始终以我期望的格式生成具有正确索引和列的plotting_df

我可以使用以下python代码模拟创建数据集以存储在plotting_df中:

plotting_1 = {
          '2014-03-28': 1699.6,
          '2014-04-04': 1741.6,
          '2014-04-11': 1710.7,
          '2014-04-18': 1744.2,
          '2014-04-25': 1764.2,
          '2014-05-02': 1789.7,
          '2014-05-09': 1802.3
        }

plotting_df = pd.DataFrame(plotting_1, index=['Jenny Todd'])
plotting_2 = {
            'Katherine Baker': {
                '2014-06-13': 1498.5,
                '2014-06-20': 1527.3,
                '2014-06-27': 1530.5,
                '2014-07-04': 1540.4,
                '2014-07-11': 1522.3,
                '2014-07-18': 1537.3,
                '2014-07-25': 1557.1
            },
            'William Acer': {
                '2014-06-13': 1674.7,
                '2014-06-20': 1689.4,
                '2014-06-27': 1682.0,
                '2014-07-04': 1700.0,
                '2014-07-11': 1674.5,
                '2014-07-18': 1677.8,
                '2014-07-25': 1708.0
            }
}

plotting_df = pd.DataFrame.from_dict(plotting_2)
我可以用下面的python代码模拟创建多个索引:

plotting_1 = {
          '2014-03-28': 1699.6,
          '2014-04-04': 1741.6,
          '2014-04-11': 1710.7,
          '2014-04-18': 1744.2,
          '2014-04-25': 1764.2,
          '2014-05-02': 1789.7,
          '2014-05-09': 1802.3
        }

plotting_df = pd.DataFrame(plotting_1, index=['Jenny Todd'])
plotting_2 = {
            'Katherine Baker': {
                '2014-06-13': 1498.5,
                '2014-06-20': 1527.3,
                '2014-06-27': 1530.5,
                '2014-07-04': 1540.4,
                '2014-07-11': 1522.3,
                '2014-07-18': 1537.3,
                '2014-07-25': 1557.1
            },
            'William Acer': {
                '2014-06-13': 1674.7,
                '2014-06-20': 1689.4,
                '2014-06-27': 1682.0,
                '2014-07-04': 1700.0,
                '2014-07-11': 1674.5,
                '2014-07-18': 1677.8,
                '2014-07-25': 1708.0
            }
}

plotting_df = pd.DataFrame.from_dict(plotting_2)
我确实用代码尝试了建议的转换:

plotdf = plotting_df.T
plotdf.index = pd.to_datetime(plotdf.index)
因此,我的原始代码现在看起来像:

print plotting_df # (This produces the df examples I pasted above)
plotdf = plotting_df.T # Transform the df - date columns to indices
plotdf.index = pd.to_datetime(plotdf.index) # Convert indices to datetime
plottest = plotdf.plot.line(title='Calorie Intake', legend=True)
plottest.set_xlabel('Weeks')
plottest.set_ylabel('Calories')
fig = plt.figure()
plot_name = week_ending + '_' + collection_name + '.png' 
fig.savefig(plot_name)
但我还是得到了同样的结果(创建了3.3kb的空白图像)

我确实注意到,当我打印出plotdf的第一个实例时,添加变换并没有什么不同。那么,我应该做一些其他转换吗?

这是您的问题:

fig = plt.figure()
plot_name = week_ending + '_' + collection_name + '.png' 
fig.savefig(plot_name)
创建第一个图形后,您正在创建第二个图形,然后只保存第二个空图形。只需取出行
fig=plt.figure()
并将
fig.savefig
更改为
plt.savefig

因此,你应该:

print plotting_df # (This produces the df examples I pasted above)
plotdf = plotting_df.T # Transform the df - date columns to indices
plotdf.index = pd.to_datetime(plotdf.index) # Convert indices to datetime
plottest = plotdf.plot.line(title='Calorie Intake', legend=True)
plottest.set_xlabel('Weeks')
plottest.set_ylabel('Calories')
plot_name = week_ending + '_' + collection_name + '.png' 
plt.savefig(plot_name)

没有你的数据,我无法重新创建你的图表。然而,我想到的想法是1。时间序列必须是索引,并且列中有它。Plot plotdf=而是plotting_df.T。2.通过使用plotdf.index=pd.to_datetime(plotdf.index)设置索引,确保它是timeseriesindex