为pandas / matplotlib设置xlim,其中index是string

时间:2014-06-28 15:33:09

标签: python matplotlib pandas

我有一个使用字符串作为索引的pandas数据框。当我的数据帧索引是object类型时,如何为x轴设置xlim?我尝试在最后添加两年,在开始时添加一年,其中所有数据集都是np.nan但是没有用。

这是数据框

Dataframe

索引的数据类型是object

df.index
Out[52]: Index(['2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012'], dtype='object')

这是情节

Matplotlib Plot

所以我希望在x轴上有一些额外的空间,这样第一年和去年的值就更明显了。我能做什么?

修改

这是使用对象而不是日期对象作为索引

的最小示例

ipython notebook

2 个答案:

答案 0 :(得分:4)

使用set_xlim+1表示向右移动1个单位,-1表示相反。在下面的例子中,我将每个方面扩展了0.5个月:

df=pd.DataFrame({'A': range(10), 'B': range(1, 11), 'C': range(2,12)})
df.index=pd.date_range('2001/01/01', periods=10, freq='M')
ax=df.plot(kind='line')
ax.set_xlim(np.array([-0.5, 0.5])+ax.get_xlim())

enter image description here

编辑,每年都有xticklabel,而不是pandas每两年一次的默认值:

ax=df.plot(kind='line', xticks=df.index)
ax.set_xticklabels(df.index.map(lambda x: datetime.datetime.strftime(x, '%Y')))

enter image description here

答案 1 :(得分:2)

from __future__ import print_function
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

df = pd.DataFrame({'Foo': pd.Series([2,3,4], index=['2002', '2003', '2004'])})
fig, ax = plt.subplots()

df.plot(ax=ax)

它可以让你获得情节。要了解如何处理x-ticks,请查看:

# note this is an AutoLocator
print(ax.xaxis.get_major_locator())
# note this is a FixedFormatter
print(ax.xaxis.get_major_formatter())
# these are the ticks that are used
ff = ax.xaxis.get_major_formatter()
print(ff.seq)

这意味着如果你在标记周围标记将保持不变,但将在随机位置。这与更改xlim的问题相同,pandas最初设置图表的方式是标签与数据完全解耦

解决此问题的一种(详细)方法是:

ax.xaxis.set_major_locator(mticker.FixedLocator(np.arange(len(df))))
ax.xaxis.set_major_formatter(mticker.FixedFormatter(df.index))


# note this is a FixedLocator
print(ax.xaxis.get_major_locator())
# note this is a FixedFormatter
print(ax.xaxis.get_major_formatter())

无论您将索引设置为(字符串与日期)

,这都会有效

我用pandas https://github.com/pydata/pandas/issues/7612

创建了一个问题