matplotlib pandas图忽略索引

nfzehxib  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(102)

我有一个pandas Series,以整数运行时间作为索引,其中的时间不是从午夜开始,而是随机开始(下面的例子中为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])

有什么建议吗?

u0sqgete

u0sqgete1#

一种选择是(正如您在评论中所说的)使用非数字索引。

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()

v440hwme

v440hwme2#

use_index设置为False,如下所示:

ax = values.plot(use_index=False)

参见:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html

use_index: bool, default True
    Use index as ticks for x axis.

相关问题