驯服多级pandas数据帧的x轴标签maptlotlib .plot()调用

时间:2018-01-16 12:57:51

标签: python pandas matplotlib

我的pandas数据帧包含由两个datetime值组成的多级行索引。

我绘制了数据帧的各个切片。 (他们是内心水平的切片)。

我的问题是x轴标签有太多细节。标签包括索引的两个级别,并使用包含00:00:00时间的格式字符串。我只需要使用外层(index[0].values),我不关心时间片段。我用红色突出显示了我不想要的部分。

enter image description here

我能为.plot()提供不同索引(看起来像我想要的)的最有效方法是什么?我可以在不弄乱数据框本身的情况下做到吗?

#create the main dataframe
dt = pd.DatetimeIndex(start='2010-1-1', end = '2010-12-31', freq='m')
dt2 = pd.DatetimeIndex(start='2011-1-1', end = '2011-1-10', freq='d')
mi = pd.MultiIndex.from_product([dt,dt2], names=['assessment_date', 'contract_date'])

df = pd.DataFrame(index=mi)
df['foo']=7

df.plot(rot=50)

1 个答案:

答案 0 :(得分:1)

由于多索引数据框的ticklabels无论如何都是固定的,你可以循环遍历它们并将它们的文本截断为你想要的任何内容。

trunc = lambda x: x.strip("()").split(" ")[0]
tl = [ trunc(t.get_text()) for t in ax.get_xticklabels()]
ax.set_xticklabels(tl)

完整示例:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#create the main dataframe
dt = pd.DatetimeIndex(start='2010-1-1', end = '2010-12-31', freq='m')
dt2 = pd.DatetimeIndex(start='2011-1-1', end = '2011-1-10', freq='d')
mi = pd.MultiIndex.from_product([dt,dt2], names=['assessment_date', 'contract_date'])

df = pd.DataFrame(index=mi)
df['foo']=np.random.rand(len(df))

ax = df.plot(rot=50)

trunc = lambda x: x.strip("()").split(" ")[0]
tl = [ trunc(t.get_text()) for t in ax.get_xticklabels()]
ax.set_xticklabels(tl)

plt.show()

enter image description here