【问题标题】:Setting xlabels for each suplot in a seaborn Pairgrid object plotted using matplotlib为使用 matplotlib 绘制的 seaborn Pairgrid 对象中的每个子图设置 x 标签
【发布时间】:2023-01-09 18:50:11
【问题描述】:

我正在尝试为 seaborn pairgrid 对象中的每个子图设置单独的 xlabels,但该图不会更新,只显示最底部图的 xlabels。

g = sns.PairGrid(dat,x_vars = inputs, y_vars = outputs, hue = 'variable')

def scatter_plt(x, y, *a, **kw):
    if x.equals(y):
        kw["color"] = (0, 0, 0, 0)
    plt.scatter(x, y,*a, **kw)
    plt.xticks(rotation=90)
    plt.subplots_adjust(wspace=0.4, hspace=0.4)
        
g.map(scatter_plt)

我尝试了以下但它没有用,因为我看到了与以前相同的情节。

xlabels,ylabels = [],[]

for ax in g.axes[-1,:]:
    xlabel = ax.xaxis.get_label_text()
    xlabels.append(xlabel)
for ax in g.axes[:,0]:
    ylabel = ax.yaxis.get_label_text()
    ylabels.append(ylabel)

for i in range(len(xlabels)):
    for j in range(len(ylabels)):
        g.axes[j,i].xaxis.set_label_text(xlabels[i])
        g.axes[j,i].yaxis.set_label_text(ylabels[j])

【问题讨论】:

    标签: python matplotlib plot seaborn subplot


    【解决方案1】:

    Seaborn 将这些内部标签设置为不可见,因此您明确需要再次将它们设置为可见。

    这是代码的样子。一些细节也发生了变化:

    • Seaborn 有一些示例数据集可用于快速测试。在这里,iris 数据集用于轻松重现。
    • plt.subplots_adjust(...)只需要调用一次,因为它改变了整个数字。与 plt.subplot_adjust() 不同,plt.tight_layout() 通常更容易工作,因为它会尝试优化所有距离。
    • 通过list comprehension 分配xlabelsylabels 不仅可以缩短代码,还可以防止错误并使事情更容易更改。
    • 基于类似的推理,在 Python 中建议尽量减少显式索引的使用。这就是为什么经常看到诸如 for i, xlabel in enumerate(xlabels) 之类的结构的原因。
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    iris = sns.load_dataset('iris')
    g = sns.PairGrid(iris, x_vars=iris.columns[0:4], y_vars=iris.columns[0:3], hue='species')
    
    def scatter_plt(x, y, *a, **kw):
        if not x.equals(y):
            plt.scatter(x, y, *a, **kw)
        plt.tick_params(axis='x', rotation=90)
    
    g.map(scatter_plt)
    
    xlabels = [ax.xaxis.get_label_text() for ax in g.axes[-1, :]]
    ylabels = [ax.yaxis.get_label_text() for ax in g.axes[:, 0]]
    
    for i, xlabel in enumerate(xlabels):
        for j, ylabel in enumerate(ylabels):
            g.axes[j, i].set_xlabel(xlabel, visible=True)
            g.axes[j, i].set_ylabel(ylabel, visible=True)
    
    plt.tight_layout()
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多