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

4
这是我的数据结构:

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]]

这是一个将经纬度坐标转换为弧度的numpy数组。
我在设置matplot-figure的x和y轴限制/边界时遇到了问题。我尝试了set_xlim()/set_ylim()set_xbound()/set_ybound(),但结果并不令人满意: set_xlim()set_ylim()会导致我的数据显示变形: enter image description hereset_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


1
对于那些想要了解bounds和limits之间的区别的人来说,答案在这里:在matplotlib中,set_xlim和set_xbound有什么区别? - mins
2个回答

2

您定义的最小值和最大值存在问题。另外,您可能还忘记转置数据。应该改为:

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_ylim()set_xbound()/set_ybound() 产生相同的图像:


我知道这个,但是我得到了limXMin = -1.3868174877和limXMax = 0.761924200543 / limYMin = -1.38683883307和limYMax = 0.761675019886。 - Alex
我真的希望你不要指望我们在没有提供问题的最小完整可复现示例([mcve])的情况下进行任何测试。 - ImportanceOfBeingErnest
非常抱歉如果我表达不清楚,我已经在原帖中添加了我的数据结构。 - Alex
是的,使用您的数据,我希望上面的内容能够按照预期工作。请参见编辑答案中的图片。 - ImportanceOfBeingErnest
非常感谢!问题确实是我numpy数组中缺少了Transpose。我仍然对pandas.dataframes、numpy.ndarray和其他数据结构感到困惑,但查看它们的打印输出让我意识到了我的错误。如果您将我第一篇帖子的最后一个图与下面我的答案中的正确图进行比较,还可以看出我不小心镜像了x轴和y轴。 - Alex

1

在意识到需要转置我的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,我可以避免创建坐标轴和子图(例如 ax1 = plt.subplot(131) 然后 ax.set_xlim(left=limXMin,right=limXMax))。
非常感谢 ImportanceOfBeingErnest 指导我找到正确的方向(请参见上面的答案)!

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接