首页 > 解决方案 > 如何反转 seaborn 图形级别图的轴(FacetGrid)

问题描述

我想在 Facetgrid 的每个图中反转 y 轴。

您可以在下面找到代码的简化示例:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

df_test = pd.DataFrame({'a':['yes', 'no']*5, 'b':np.arange(10), 'c':np.arange(10)*2})
plt.figure()
g = sns.FacetGrid(data=df_test, row='a')
g.map_dataframe(sns.scatterplot, y='c', x='b')
plt.show()

在此处输入图像描述

据我所知,这通常是ax.invert_yaxis()在使用 matplotlib 时完成的,所以我尝试通过它来访问它,g.axes但没有运气。

我知道我可以手动设置 a ylim=(max_val, min_val),但是,这会导致不雅观的刻度间距。

标签: pythonpandasmatplotlibseaborn

解决方案


  • 通过迭代提取和设置每个轴g.axes
  • python 3.8.11, matplotlib 3.4.3,中测试seaborn 0.11.2
g = sns.FacetGrid(data=df_test, row='a')
g.map_dataframe(sns.scatterplot, y='c', x='b')

for ax in g.axes[0]:
    ax.invert_yaxis()
g = sns.relplot(data=df_test, row='a', x='b', y='c', kind='scatter', height=3)
for ax in g.axes[0]:
    ax.invert_yaxis()

在此处输入图像描述

  • 用于.ravel()展平n x n数组或axes, 其中两者n > 1
df_test = pd.DataFrame({'a':['yes', 'no', 'maybe']*4, 'b':np.arange(12), 'c':np.arange(12)*2, 'd': np.arange(12)*3})

g = sns.relplot(data=df_test, col='a', col_wrap=2, x='b', y='c', kind='scatter', height=3)
for ax in g.axes.ravel():
    ax.invert_yaxis()

在此处输入图像描述


推荐阅读