我正在努力复制熊猫df.plot()文档的“基本绘图:图”部分中令人满意地承诺的优雅易用性和成功的结果,网址为:
http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization
在那里,作者的第一张图片非常接近我要从数据框中绘制的折线图。他们的第一个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)
请注意,此数据帧在脚本中多次动态创建。在任何给定的运行中,脚本都将获取不同的日期集,名称不同的人以及要绘制的不同数字。因此,对于预先绘制的索引和图例标签将使用哪些字符串,我没有可预测性。我确实对格式有可预测性。
我得到我的数据框的日期索引具有与引用的文档描述不同的日期格式。这是原因吗?不管是不是,如何最好地解决这一问题?
添加于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的第一个实例时,添加转换没有任何区别。那我应该做一些其他的转换吗?
这是你的问题:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句