用于缩放到最大范围的Matplotlib set_xlim()/ set_ylim()或set_xbound()/ set_ybound()?

时间:2017-12-15 08:59:10

标签: python matplotlib plot

这是我的数据结构:

print("test_data: " + str(test_data))

#test_data: [[-1.3869276   0.76189806]
# [-1.3870304   0.76177611]
# [-1.38695643  0.76194005]
# ...,
# [-1.38663699  0.76174211]
# [-1.38670514  0.76161662]
# [-1.3865974   0.76163099]]

这是一个转换为弧度的lat / lng坐标的numpy数组。

我在设置matplot-figure的x和y限制/边界时遇到问题。我同时尝试了set_xlim() / set_ylim()set_xbound() / set_ybound(),但效果并不理想:

set_xlim()set_ylim()会导致数据视图失真: enter image description here

..虽然set_xbound()set_ybound()放大太多(以及y轴的其他作物标签): enter image description here

这是我的代码:

    test_data = np.radians(points)
    #get max data extent
    limXMin = np.max(test_data[0])
    limXMax = np.max(test_data[1])
    limYMax = np.min(test_data[0])
    limYMin = np.min(test_data[1])
    #print max data extent:
    print(limXMin)
    print(limXMax)
    print(limYMin)
    print(limYMax)
    #0.761924200543
    #0.761882818787
    #-1.38701148104
    #-1.3868174877

    #create figure
    fig = plt.figure(figsize=(11, 8), dpi=80)
    #print current extent
    print(str(plt.xlim()))
    print(str(plt.ylim()))
    #(0.0, 1.0)
    #(0.0, 1.0)
    ax = fig.add_subplot(1,1,1) # 1 Row, 1 Column and the first axes in this grid
    plt.scatter(test_data.T[0], test_data.T[1], color='b', **plot_kwds)
    #modify extent (Fig.1)
    ax.set_xlim([limXMin, limXMax])
    ax.set_ylim([limYMin, limYMax])
    #modify extent (Fig.2)
    ax.set_xbound(limXMin, limXMax)
    ax.set_ybound(limYMin, limYMax)
    ax.figure.savefig(pathname + '/graph_1.png')

相反,如果我这样做:

    plt.figure(figsize=(11, 8), dpi=80)
    plt.autoscale(enable=True)
    fig = plt.scatter(test_data.T[0], test_data.T[1], color='b', **plot_kwds)
    fig.figure.savefig(pathname + '/graph_1.png')

我得到了完整的范围,但边界太多了。几乎一半的情节区域没有显示数据:

enter image description here

2 个答案:

答案 0 :(得分:1)

您对最小值和最大值的定义出了问题。此外,您可能还忘记转置数据。应该是

limXMin = np.min(test_data.T[0])
limXMax = np.max(test_data.T[0])

limYMin = np.min(test_data.T[1])
limYMax = np.max(test_data.T[1])

使用提供的数据,

set_xlim() / set_ylimset_xbound() / set_ybound()都生成相同的数字:

答案 1 :(得分:0)

在意识到我需要transpose我的numpy数组后,我设法得到了正确的结果:

    limYMin = np.min(test_data.T[1])
    limYMax = np.max(test_data.T[1])
    limXMin = np.min(test_data.T[0])
    limXMax = np.max(test_data.T[0])

    fig = plt.figure(figsize=(11, 11), dpi=80)
    plt.gca().set_xlim([limXMin, limXMax])
    plt.gca().set_ylim([limYMin, limYMax])
    fig = plt.scatter(test_data.T[0], test_data.T[1], color='b', **plot_kwds)
    fig.figure.savefig(pathname + 'graph_01.png')

.T以某种方式转动数组,因此可以在行而不是列中访问它。此外,通过使用plt.gca().set_xlimplt.gca().set_ylim,我可以避免创建轴和sub_plots(例如ax1 = plt.subplot(131)然后ax.set_xlim(left=limXMin,right=limXMax))。

非常感谢ImportanceOfBeingErnest指出我正确的方向(见上面的答案)!

enter image description here