绘制一天中的小时而不是时间

2024-09-30 16:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

标题可能没有意义,但我会尽力解释

我正在绘制化学浓度图。x轴应为当地时间午夜后的小时数(即0,4,8,12,16,20)。然而,当我这样做的时候,所有的Xtick都被弄脏了

xticks = range(0,24,4)
ozoneest["mean"].plot(ax=ax, xticks=xticks,)

结果:

enter image description here

xticks只接受datetime变量数组,其值为:00:00、04:00、08:00、12:00、16:00、20:00

xticks = pd.date_range("2000/01/01", end="2000/01/02", freq="4H").time
ozoneest["mean"].plot(ax=ax, xticks=xticks,)

结果:

enter image description here

这接近我想要的,但我只想要小时数

谢谢


Tags: 标题plot时间绘制rangeaxmean意义
1条回答
网友
1楼 · 发布于 2024-09-30 16:26:58

我假设您的数据存储在一个带有DatetimeIndex的数据框中,该索引具有“小时”频率。我无法准确再现您的问题,因为您没有共享生成ax对象的代码。无论是使用matplotlib还是pandas创建,问题在于x轴单位基于自1970-01-01以来经过的时间段数(基于pandas中的DatetimeIndex频率,matplotlib中的天数)。因此xticks = range(0,24,4)相对于您的datetimes位于较左侧。您可以使用ax.get_xticks()检查默认XTICK的x轴值

这里有两种格式化XTick和标签的方法。我建议您不要为小时创建新的DatetimeIndex,因为这会降低代码的重用性,请使用数据帧的DatetimeIndex,如第二个解决方案所示

创建示例数据帧

import numpy as np   # v 1.20.2
import pandas as pd  # v 1.2.5

rng = np.random.default_rng(seed=123)  # random number generator
time = pd.date_range(start="2000/01/01", end="2000/01/02", freq="H")[:-1]
mean = rng.normal(size=len(time))
ozoneest = pd.DataFrame(dict(mean=mean), index=time)
ozoneest.head()

df_head


使用默认的XTICK打印

ozoneest["mean"].plot()

plot


简单解决方案:不要将DatetimeIndex用作x轴

xticks = range(0,24,4)
ax = ozoneest["mean"].plot(use_index=False, xticks=xticks)

custom_xticks_range


一般解决方案:从DatetimeIndex中选择xticks并使用strftime创建标签

xticks = ozoneest.index[::4]
xticklabels = xticks.strftime("%H")
ax = ozoneest["mean"].plot()
ax.set_xticks(xticks)
ax.set_xticks([], minor=True)
ax.set_xticklabels(xticklabels)

custom_xticks_strftime

此解决方案更为通用,因为如果数据集的时间范围发生变化,则无需手动调整XTICK,并且可以通过多种方式轻松自定义刻度标签。 如果要删除前导零,可以使用以下列表:

xticklabels = [tick[1:] if tick[0] == "0" else tick for tick in xticks.strftime("%H")]

相关问题 更多 >