未知y范围的离散时间序列图
在一个离散时间序列的图表中,我尝试用 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()
这是我现在得到的图表:
但我希望得到类似这样的图表,(能够反映出这是一个不规则的时间分布):
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
图。
ymax
是 vlines
的上限,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()
这是结果:
