在具有共享轴的 seaborn pairplot 中显示 y 轴标签

6

我正在使用seaborn的pairplot来绘制多个独立变量与一个因变量之间的关系。

import seaborn as sns
iris = sns.load_dataset("iris")
x_vars = ['sepal_length', 'sepal_width', 'petal_length']
y_vars = ['petal_width']
pp = sns.pairplot(data=iris, x_vars=x_vars, y_vars=y_vars)

图片描述

现在我想要给第二个和第三个子图添加y轴刻度和标签。

添加y轴标签很容易:

pp.set(ylabel='petal_width')

enter image description here

我真的想不出如何显示y_ticklabels。

例如:

pp.set(yticklabels=np.arange(-0.5, 3.01, 0.5))

或者:

for i in range(3):
    ax = pp.axes[0,i]
    ax.set_yticks(np.arange(-0.5, 3.01, 0.5))
    ax.set_yticklabels(np.arange(-0.5, 3.01, 0.5))
    ax.set_visible(True)

不会有任何区别。


PairGrid 使用 sharey=True 设置轴,因此问题在于是否可以事后关闭它。 - mwaskom
@mwaskom,不是真的。其他子图的y轴刻度只是不可见的。您可以共享y轴并仍然具有刻度标签。 - CT Zhu
1
今天我了解到share{x,y}可以设置刻度标签的可见性! - mwaskom
3个回答

5

只需要将yticklabels恢复为可见状态,然后在所需的子图中进行操作即可:

import seaborn as sns
iris = sns.load_dataset("iris")
x_vars = ['sepal_length', 'sepal_width', 'petal_length']
y_vars = ['petal_width']
pp = sns.pairplot(data=iris, x_vars=x_vars, y_vars=y_vars)
_ = plt.setp(pp.axes[0,1].get_yticklabels(), visible=True) #changing the 2nd plot

_ = ... 这里是为了在交互式环境中抑制不必要的打印输出。 输入图像描述


1

我的 matplotlib 版本是 3.0.3,CT Zhu 的答案对我没有用,我不知道为什么。

我在这里找到了答案。

您可以在所需的子图上使用 tick_params 方法通过传递 labelleft=True 参数来显示 yticklabels(有两种方法)。


"""enabling yticklabels for all subplots"""

import seaborn as sns
iris = sns.load_dataset("iris")
x_vars = ['sepal_length', 'sepal_width', 'petal_length']
y_vars = ['petal_width']
pp = sns.pairplot(data=iris, x_vars=x_vars, y_vars=y_vars)

# iterating over all subplots
for ax in pp.axes.flat:
    # labelleft refers to yticklabels on the left side of each subplot
    ax.tick_params(axis='y', labelleft=True) # method 1
    # ax.yaxis.set_tick_params(labelleft=True) # method 2
plt.show()

enabling yticklabels for shared axes

tick_params 文档 中获取。

更改刻度、刻度标签和网格线的外观。


0
将sharey设置为False,将分离轴标签 - 附注:只是分享我在其中一个用例中的示例代码 -
fig, ax =plt.subplots(1,2,figsize=(15, 5), sharey=False)

fig.suptitle('Sentiment scores - comparison')

sns.countplot(df['Sentiment'], ax=ax[0])

sns.countplot(df['new_sentiment'], ax=ax[1])

fig.show()

输出如下 -

enter image description here


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