【问题标题】:Setting physically square subplots in Matplotlib 3 with shared axes在 Matplotlib 3 中使用共享轴设置物理正方形子图
【发布时间】:2019-01-09 21:47:37
【问题描述】:

我正在尝试创建一个类似于 seaborn 所做的情节,但在本机 matplotlib 中。

我将数据框中的每个系列与绘图矩阵中的每个其他系列进行对比。

到目前为止,我已经绘制了它,标记了外轴,并将轴设置为沿列和行共享(因为这对数据最有效)。

我未能管理的最后一步是使所有地块的尺寸在物理上呈正方形。以下代码:

#scatter matrix

def plot_scatter_matrix(data):
    dim = len(data.columns.values)
    fig, axs = newfigure(dim, dim, sharex='col', sharey='row', figsize=(10,10))
    fig.tight_layout()
    for row, iname in enumerate(data.columns.values):
        for col, jname in enumerate(data.columns.values):
            axs[row,col].scatter(data[jname], data[iname])
            if col == 0:
                axs[row,col].set_ylabel(iname)
            if row == len(data.columns.values)-1:
                axs[row,col].set_xlabel(jname)

    return fig, axs

fig, axs = plot_scatter_matrix(ndata)
plt.show()

实现了这一点(仅显示上半部分):

我曾尝试在调用scatter() 后使用axs[row,col].set_aspect(1.0, adjustable='box', share=True),但结果却是这样:

如您所见,有些成功地变成了方形,但它们的大小都不同。

仔细阅读文档和其他问题后,我感到很困惑。当此类事情的其他方法在过去的版本中已被弃用时,这并不容易。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    如果某些轴通过使用set_aspect(1.0)(或等效的set_aspect("equal"))变成方形,这或多或少是巧合,只有当轴限制的差异实际上相等时才会发生;例如当 x 和 y 的数据范围相同时。

    当然,您可以共享所有轴,而不仅仅是按列或按行。这将确保所有轴的形状相同——但不一定是方形的。

    对方轴的要求是纵横比是 x 和 y 范围的商。

    ax.set_aspect(np.diff(ax.get_xlim())/np.diff(ax.get_ylim()))
    

    另见:How to make sure that both x and y axes of plot are of equal sizes?

    另一种选择是通过this answerpython interplay between axis('square') and set_xlim 中所示的子图参数限制子图的空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      相关资源
      最近更新 更多