AxisSubplot,将显示坐标转换为实际坐标

时间:2015-07-05 19:16:22

标签: python python-2.7 matplotlib plot

我正在尝试使用AxisSubplot对象将一些显示坐标转换为真实坐标,以便将形状绘制到绘图上。问题是我无法找到文档或AxisSubplot 任何地方,我看到Axis但无法弄清楚AxisSubplot对象中包含的是什么。

我的情节坐标以时间x海拔高度显示,因此显示明智的一套可能是

[ ['03:42:01', 2.3] , ['03:42:06', 3.4] , ...]

在我的显示功能中,我格式化子图的轴,如下所示:

    fig.get_xaxis().set_major_locator(mpl.dates.AutoDateLocator())
    fig.get_xaxis().set_major_formatter(mpl.dates.DateFormatter('%H:%M:%S'))

现在,当我想使用上面的设置显示多边形时,如何将该日期字符串转换为绘图cooridnates?

    points = [['03:42:01', 1], ['03:43:01', 2.1], ['03:21:01', 1]]
    polygon = plt.Polygon(points)
    fig.add_patch(polygon)

当然,这给了我错误ValueError: invalid literal for float(): 03:42:01。谁会知道怎么做?以下是绘图轴的示例:

enter image description here

1 个答案:

答案 0 :(得分:3)

您似乎有两个问题:

  1. 您找不到AxesSubplot对象的文档。

    这是因为它仅在运行时创建。它继承自SubplotBase。您可以在this answer (to the same question)

  2. 中找到更多详细信息
  3. 您希望将日期/时间的多边形绘制为x坐标:

    因为matplotlib需要知道您的坐标代表日期/时间。有一些绘图函数可以处理日期时间对象(例如plot_date),但一般情况下你必须处理它。

    Matplotlib使用自己的日期内部表示(浮动天数),但在matplotlib.dates模块中提供必要的转换函数。在您的情况下,您可以按如下方式使用它:

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.dates as mdates
    from datetime import datetime
    
    # your original data
    p = [['03:42:01', 1], ['03:43:01', 2.1], ['03:21:01', 1]]
    
    # convert the points 
    p_converted = np.array([[mdates.date2num(datetime.strptime(x, '%H:%M:%S')), y] 
            for x,y in p])
    
    # create a figure and an axis
    fig, ax = plt.subplots(1)
    
    # build the polygon and add it
    polygon = plt.Polygon(p_converted)
    ax.add_patch(polygon)
    
    # set proper axis limits (with 5 minutes margins in x, 0.5 in y)
    x_mrgn = 5/60./24.
    y_mrgn = 0.5
    ax.set_xlim(p_converted[:,0].min() - x_mrgn, p_converted[:,0].max() + x_mrgn)
    ax.set_ylim(p_converted[:,1].min() - y_mrgn, p_converted[:,1].max() + y_mrgn)
    
    # assign date locators and formatters 
    ax.xaxis.set_major_locator(mdates.AutoDateLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
    
    # show the figure
    plt.show()
    

    结果:

    enter image description here