【问题标题】:Discrete time-series graph with unknown y rangey 范围未知的离散时间序列图
【发布时间】:2014-09-24 20:41:03
【问题描述】:

在离散时间序列图中,我尝试将ax.plot(x,y) 替换为ax.vlines(x,y)

  • 我收到错误:vlines() missing 1 required positional argument: '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()

这就是我现在得到的图表:

但我想得到这样的东西,(这会反映出它随着时间的推移是不规则的分布):

【问题讨论】:

    标签: python matplotlib time-series timeserieschart


    【解决方案1】:

    在我看来你想要一个 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()
    

    这是结果:

    【讨论】:

      【解决方案2】:

      这里的ymax 实际上不是yrange - 它是您想要的垂直线的最高值。为了使 vline 图类似于您当前的图,我相信您希望将 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多