代码之家  ›  专栏  ›  技术社区  ›  SaadH

matplotlib:如何从cdf图中删除datetime值的垂直线

  •  2
  • SaadH  · 技术社区  · 7 年前

    以下代码绘制日期时间值的CDF:

    import matplotlib.pyplot as plt
    import matplotlib.dates as dates
    import numpy as np; np.random.seed(42)
    import pandas as pd
    
    objDate = dates.num2date(np.random.normal(735700, 300, 700))
    
    ser = pd.Series(objDate)
    ax = ser.hist(cumulative=True, density=1, bins=500, histtype='step')
    
    plt.show()
    

    cdf of datetime values

    如何删除图形最右端的垂直线?上述方法 here 不能将第9行替换为:

    ax = ser.hist(cumulative=True, density=1, bins=sorted(objDate)+[np.inf], histtype='step')
    

    给予

    typeerror:无法将datetime.datetime与float进行比较

    1 回复  |  直到 7 年前
        1
  •  1
  •   bnaecker    7 年前

    CDF实际上被画成一个多边形,在 matplotlib 定义为 路径 . 路径依次由顶点(到哪里)和代码(如何到达那里)定义。文件说我们不应该直接改变这些属性,但是我们可以 新的 多边形是从旧的多边形衍生出来的,适合我们的需要。

    poly = ax.findobj(plt.Polygon)[0]
    vertices = poly.get_path().vertices
    
    # Keep everything above y == 0. You can define this mask however
    # you need, if you want to be more careful in your selection.
    keep = vertices[:, 1] > 0
    
    # Construct new polygon from these "good" vertices
    new_poly = plt.Polygon(vertices[keep], closed=False, fill=False,
                           edgecolor=poly.get_edgecolor(),
                           linewidth=poly.get_linewidth())
    poly.set_visible(False)
    ax.add_artist(new_poly)
    plt.draw()
    

    你应该得到如下图:

    CDF with offending points removed