未知y范围的离散时间序列图

2 投票
2 回答
2200 浏览
提问于 2025-04-18 15:39

在一个离散时间序列的图表中,我尝试用 ax.vlines(x,y) 替换 ax.plot(x,y)

  • 结果出现了错误:vlines() 缺少一个必需的位置参数:'ymax'

但是,我事先并不知道 ymax 的值。 我该如何避免这个错误呢?

我是否应该通过解析所有要显示的数据来计算这个值?有没有办法让 matplotlib 自动适应数据呢?


关于这个图表的一些更多细节:

这个图表并不准确,因为它绘制的是一条连续的曲线,而我的数据实际上是随时间变化的离散值分布。这就是我想使用 vlines 的原因。

这是我用来创建图表的代码:

(exception_time_series 对象是一个统计程序中某种异常类型在特定时间出现次数的对象)。

fig = figure(1) 

for exception_time_series in exceptions_time_series.list_exception_time_series:

    time_values, series_values = exception_time_series.time_values, exception_time_series.series_values

    ax = fig.add_subplot(111, autoscale_on=True )

    dates = np.array(time_values)
    x = dates 
    y = np.array(series_values)

    ax.plot(x, y, label=exception_time_series.exception) # <=== using plot 
    ax.legend()

show()

这是我现在得到的图表:

每秒 SEH 异常率

但我希望得到类似这样的图表,(能够反映出这是一个不规则的时间分布):

我想要的图表类型

2 个回答

1

这里的 ymax 实际上并不是 y 轴的范围,而是你想要的竖线的顶部值。为了制作一个和你现在的图类似的竖线图,我认为你需要把 ymin 设置为一个全是零的数组,把 ymax 设置为你的 y 值。如果你的 y 值中有负数,那么你应该把 ymin 和 ymax 设置为 0 和你的 y 数组中的最小/最大值。

yz = np.zeros(y.shape)
ymin = np.minimum(yz, y)
ymax = np.maximum(yz, y)

ax.vlines(x, ymin, ymax)
2

看起来你想要画一个 bar 图。

ymaxvlines 的上限,vlines(0, 0, 1) 的意思是在 x=0 的位置,从 y=0 到 y=1 画一条竖线。

这是一个简单的示例:

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import normal

x = np.linspace(0, 10, 100)
y = normal(0, 1, 100)
bar_width = (max(x) - min(x))/len(x)

plt.bar(x, y, bar_width, facecolor='black')
plt.show()

这是结果:

在这里输入图片描述

撰写回答