首页 > 解决方案 > 尝试将 xplot 刻度更改为每 12 小时一次

问题描述

尝试将我的 xticks 更改为每 12 小时一次,而不是每 2 天一次。也不能让它在 x 轴上显示时间。尝试了一些方法来更改日期格式,但在执行列表格式设置时出现错误。

from datetime import datetime
import numpy as np
from matplotlib import pyplot as plt

Time =[datetime(2020, 2, 8, 3),
       datetime(2020, 2, 8, 7, 30),
       datetime(2020, 2, 8, 10, 30),
       datetime(2020, 2, 8, 14),
       datetime(2020, 2, 8, 18, 30),
       datetime(2020, 2, 8, 22, 30),
       datetime(2020, 2, 9, 6, 30),
       datetime(2020, 2, 9, 10, 30),
       datetime(2020, 2, 9, 17, 30),
       datetime(2020, 2, 9, 22),
       datetime(2020, 2, 10, 2),
       datetime(2020, 2, 10, 9),
       datetime(2020, 2, 10, 13),
       datetime(2020, 2, 10, 19, 30),
       ]

leftAmount =[25, 25, 20, 20, 25, 25, 55, 40, 35, 50, 30, 55, 30, 35, 50, 40, 50, 30, 30, 40, 40, 70, 20, 35, 40, 50,
                50, 55, 25, 35, 40, 65, 35, 40, 40, 40, 75, 40, 40, 30, 40, 55, 40, 35, 50, 40, 65, 40,]

rightAmount =[50, 50, 40, 35, 50, 40, 90, 70, 60, 75, 55, 90, 50, 40, 65, 70, 75, 60, 65, 60, 55, 110, 40, 55,
                 50, 75, 80, 75, 40, 60, 60, 100, 55, 65, 60, 60, 105, 70, 60, 55, 60, 75, 60, 45, 80,]

sumAmount =[75, 75, 60, 45, 90, 60, 145, 110, 95, 120, 85, 135, 90, 70, 115, 100, 120, 90, 95, 100, 90, 180, 60,
            85, 70, 120, 130, 120, 70, 95, 95, 165, 80, 105, 100, 100, 180, 100, 100, 80, 100, 120, 100,]

plt.plot(Time, leftAmount, label ="Left")
plt.plot(Time, rightAmount, label ="Right")
plt.plot(Time, sumAmount, label ="Total amount")
plt.xlabel("Time")
plt.ylabel("Amount (mL)")
plt.xticks(size='small',
           rotation=45, horizontalalignment='center')
plt.legend()
plt.show()

我删除了相当多的数据以使其更具可读性,现在每个列表的长度可能不同。

标签: pythonmatplotlib

解决方案


这是我用最少代码的解决方案。唯一需要注意的是我使用Plotly图形库。它提供了带有悬停信息的交互式绘图,但针对您的问题,它可以很好地处理日期和时间(Matplotlib 可能会让人头疼xticklabels)。例如,当您放大时,x 轴上的日期时间会相应缩放。

from plotly import graph_objs as go
from datetime import datetime

Time =[datetime(2020, 2, 8, 3),
       datetime(2020, 2, 8, 7, 30),
       datetime(2020, 2, 8, 10, 30),
       datetime(2020, 2, 8, 14),
       datetime(2020, 2, 8, 18, 30),
       datetime(2020, 2, 8, 22, 30),
       datetime(2020, 2, 9, 6, 30),
       datetime(2020, 2, 9, 10, 30),
       datetime(2020, 2, 9, 17, 30),
       datetime(2020, 2, 9, 22),
       datetime(2020, 2, 10, 2),
       datetime(2020, 2, 10, 9),
       datetime(2020, 2, 10, 13),
       datetime(2020, 2, 10, 19, 30),
       ]

leftAmount =[25, 25, 20, 20, 25, 25, 55, 40, 35, 50, 30, 55, 30, 35]
rightAmount =[50, 50, 40, 35, 50, 40, 90, 70, 60, 75, 55, 90, 50, 40]
sumAmount = [la + ra for la, ra in zip(leftAmount, rightAmount)]

leftAmountTrace = go.Scatter(x=Time, y=leftAmount, name="Left Amount")
rightAmountTrace = go.Scatter(x=Time, y=rightAmount, name="Right Amount")
sumAmountTrace = go.Scatter(x=Time, y=sumAmount, name="Sum Amount")

fig = go.Figure(data=[leftAmountTrace, rightAmountTrace, sumAmountTrace])
fig.update_layout(title="Interactive Plot", xaxis_title="Date & Time", yaxis_title="Amount")

fig.show()

这就像为您的数据创建跟踪,将它们加载到go.Figure对象中,然后更新布局以获得正确的标题和轴标签一样简单。无需担心格式化日期。

这是结果图: Plotly_Plot


推荐阅读