熊猫情节无视指数

时间:2017-11-08 10:09:11

标签: pandas matplotlib

我有一个以整数运行小时作为索引的pandas系列,其中小时不是在午夜开始,而是在随机小时开始(下例中为8)。

hour = range(8, 24) + range(0, 8)
values = pd.Series(range(24), index=hour)

我希望绘制一个24小时的值图表,但我希望x轴显示“原始”小时值,而不是重新排列索引。

ax = values.plot()
ax.axis([0, 23, 0, 23])

enter image description here

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

确实(正如您在评论中所述)使用非数字索引。

import pandas as pd
import matplotlib.pyplot as plt

hour = range(8, 24) + range(0, 8)
values = pd.Series(range(24), index=list(map(str,hour)))

ax = values.plot()

plt.show()

enter image description here

由于这会自动选择一些标签并且无法控制它们,因此可能不是最佳选择。

更好的解决方案可能是使用不同的索引,即一个数字并连续增加(在本例中为8到31),然后将ticklabels修改为24的模数。

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

hour = range(8, 24) + range(0, 8)
values = pd.Series(range(24), index=hour)
values.index = values.index[0]+np.arange(0,len(values))

ax = values.plot()
func = lambda x,pos: "{:g}".format(x%24)
ax.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(func))

plt.show()

enter image description here

这样也可以将位置设置为某个数字的倍数(例如6),这对于一天中的几个小时是有意义的。

ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(6))

enter image description here

最后,您当然可以选择使用真实的日期时间。

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

hour = range(8, 24) + range(0, 8)
values = pd.Series(range(24), index=hour)

todate = lambda i: datetime(2017,11,8+(values.index[0]+i)//24,(values.index[0]+i)%24)
values.index = [todate(i) for i in range(len(values))]

ax = values.plot()

plt.show()

enter image description here