我有一个以整数运行小时作为索引的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])
有什么建议吗?
答案 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()
由于这会自动选择一些标签并且无法控制它们,因此可能不是最佳选择。
更好的解决方案可能是使用不同的索引,即一个数字并连续增加(在本例中为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()
这样也可以将位置设置为某个数字的倍数(例如6),这对于一天中的几个小时是有意义的。
ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(6))
最后,您当然可以选择使用真实的日期时间。
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()