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

时间:2016-08-20 15:03:59

标签: pandas plot

我正在努力复制优雅的轻松 - 和成功的结果 - 在“基本绘图:情节' pandas df.plot()文档的一部分:

http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization

作者和#39;第一个图像非常接近我想从我的数据帧绘制的线图。他们的第一个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 = 0.0,right = 0.0   ' left =%s,right =%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)

请注意,此数据框是在脚本中多次动态创建的。在任何给定的运行中,脚本将获取不同的日期集,不同名称的人以及要绘制的不同数字。因此,对于预先绘制索引和图例标签的字符串,我不具备可预测性。我确实对格式有可预测性。

我知道我的数据集的日期索引具有与引用文档描述的格式不同的日期。这是原因吗?无论是或不是,应该如何最好地处理这个问题?

已于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'])

我可以用这个python代码模拟多索引plotting_df的创建:

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的第一个实例时添加转换没有任何区别。我应该做一些其他变换吗?

1 个答案:

答案 0 :(得分:1)

这是你的问题:

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)