在Python中跳过不需要的日期时绘制时间与日期

在Python中跳过不需要的日期时绘制时间与日期,python,datetime,matplotlib,Python,Datetime,Matplotlib,我想做一个程序来监控我5000米的进度。在和的启发下,我试图在没有任何运气的情况下,将一些答案结合起来,使其发挥作用 from __future__ import division from matplotlib import pyplot as plt from matplotlib.ticker import FuncFormatter import matplotlib.dates as mdates import numpy as np import datetime as dt de

我想做一个程序来监控我5000米的进度。在和的启发下,我试图在没有任何运气的情况下,将一些答案结合起来,使其发挥作用

from __future__ import division
from matplotlib import pyplot as plt
from matplotlib.ticker import FuncFormatter
import matplotlib.dates as mdates
import numpy as np
import datetime as dt

def equidate_ax(fig, ax, dates, fmt="%d.%m.%Y", label="Date"):
    N = len(dates)
    def format_date(index, pos):
        index = np.clip(int(index + 0.5), 0, N - 1)
        return dates[index].strftime(fmt)
    ax.xaxis.set_major_formatter(FuncFormatter(format_date))
    ax.set_xlabel(label)
    fig.autofmt_xdate()

def DistVel2Time(distance, velocity_kph):
    velocity_ms = velocity_kph / 3.6
    time_sec = distance / velocity_ms
    hours = int(time_sec//3600)
    minutes = int((time_sec%3600)//60)
    seconds = int(time_sec%60)
    return "{:02d}:{:02d}".format(minutes, seconds)

times = [DistVel2Time(a, b) for a, b in [(5000, 13), (5000, 15), (5000, 14)]]

dates = [dt.datetime(year, month, day) for year, month, day in [(2019,2,1), (2019,2,2), (2019,2,7)]]

fig_1, ax_1 = plt.subplots()
ax_1.plot(dates, times, 'o--')
ax_1.xaxis_date()
ax_1.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%Y'))
#ax_1.yaxis_date()
#ax_1.yaxis.set_major_formatter(mdates.DateFormatter("%M:%S"))
fig_1.autofmt_xdate()
plt.show()

fig_2, ax_2 = plt.subplots()
ax_2.plot(dates, times, 'D--')
ax_2.xaxis_date()
ax_2.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%Y'))
equidate_ax(fig_2, ax_2, dates)
plt.show()

fig_1.savefig('fig1.png')
fig_2.savefig('fig2.png')
我从@ascripter(第二个链接)偷了
equidate\u ax
,因为我想跳过所有我没有运行的日期

如果我运行这段代码并保存这些图,我最终会得到以下两个非常奇怪的图,因为y轴不区分较低或较高的值(图1和图2),图2的x轴也在重复。 图1:
图1
来自上述代码。 图2:
图2
来自上述代码

  • 为什么y轴不能正确绘制较低或较高的值
  • 如何防止
    equidate\u ax
    函数重复自身而跳过不需要的日期

如果有人能帮我收拾残局,我将不胜感激。

结合以下链接问题的答案:

基本上,您必须确保matplotlib不能猜测x轴的格式,但可以猜测y轴的格式。 使用此matplotlib,您将不会尝试智能化并添加不希望在x轴上显示的日期,但同时将智能化并在y轴上为您排序时间

来自未来进口部的

从matplotlib导入pyplot作为plt
从matplotlib.ticker导入FuncFormatter
将matplotlib.dates导入为mdates
将numpy作为np导入
将日期时间导入为dt
def distvel2时间(距离、速度\u kph):
速度_ms=速度_kph/3.6
时间秒=距离/速度秒
小时=整数(时间/秒//3600)
分钟=int((时间秒%3600)//60)
秒=整数(时间秒%60)
#注意,我在这里返回一个timedelta对象
返回dt.timedelta(分钟=分钟,秒=秒)
#我们必须在这里选择一种可解释的数据类型,只需以秒为单位计算所需的总时间
times=[DistVel2Time(a,b)。a,b在[(5000,13)、(5000,15)、(5000,14)]中的总秒数()
#这里我们要确保matplotlib不能解释它,所以我们直接使用字符串
#根据需要更改格式
日期=[%00d.%00d.%000d”%ymd代表[(2019,2,1)、(2019,2,2)、(2019,2,7)]年的ymd
#格式函数取自https://stackoverflow.com/questions/48294332/plot-datetime-timedelta-using-matplotlib-and-python
def格式函数(x,位置):
小时=整数(x//3600)
分钟=int((x%3600)//60)
秒=整数(x%60)
返回“{:d}:{:02d}:{:02d}”。格式(小时、分钟、秒)
formatter=FuncFormatter(format_func)
图=plt.图()
ax=图添加子批次(1,1,1)
ax.绘图(日期、时间、“o--”)
ax.yaxis.set\u major\u格式化程序(格式化程序)
plt.show()
它将生成如下图:

尽管@milck回答了我的问题,但受他的回答和前面提到的问题答案的启发,我自己制作了一个更精简的版本

from matplotlib import pyplot as plt
from matplotlib.ticker import FuncFormatter

def DistVel2Time(*velocity_kph):
    distance = 5000
    times = [int(distance / (_ / 3.6)) for _ in velocity_kph]
    return times

times = DistVel2Time(13, 15, 14)

dates = ["%00d.%00d.%000d" % dmy for dmy in [(1,2,2019), (2,2,2019), (7,2,2019)]]

def format_func(x, pos):
    #hours = int(x//3600)
    minutes = int((x%3600)//60)
    seconds = int(x%60)
    return "{:02d}:{:02d}".format(minutes, seconds)

formatter = FuncFormatter(format_func)

fig, ax = plt.subplots()

ax.plot(dates, times, 'D--')
ax.yaxis.set_major_formatter(formatter)
fig.autofmt_xdate()

plt.show()
这是简短的,也许更容易理解