Seaborn FacetGrid如何调整每个子图x轴为对应数据的取值范围
问题解决:Seaborn FacetGrid子图独立设置x轴范围
问题描述
现有如下Seaborn FacetGrid输出:
生成代码片段如下:
import pandas as pd import numpy as np import seaborn as sns imax = 3 df = pd.DataFrame(columns = ['x','y','i']) for i in range(imax): x = np.linspace(0, 1/(2 ** i),101) y = x ** x df = df.append(pd.DataFrame({'x': x, 'y': y, 'i':i}), ignore_index = True) g = sns.FacetGrid(df, col='i') g = g.map(sns.lineplot, 'x', 'y') import matplotlib.pyplot as plt plt.show()
需求是让网格中每个子图的x轴都适配对应i分组下的x值范围,第一个子图x轴范围为[0,1],第二个为[0,0.5],第三个为[0,0.25]。
已尝试的问题代码
对axes对象调用set_xbound方法修改范围,结果所有子图的x轴范围都被设为了[0,0.25]:
for i,b in enumerate(g.axes[0]): b.set_xbound(0, 1/(2 ** i))
原因说明
默认情况下FacetGrid会开启sharex=True配置,所有子图共享同一个x轴标尺,修改任意一个子图的x轴范围都会同步到所有共享轴的子图上,因此循环修改后所有子图都会保留最后一次设置的[0, 0.25]范围。
解决方案
只需要在初始化FacetGrid时关闭x轴共享即可,开启后子图会自动适配各自的数据范围,不需要手动修改边界:
# 仅需新增sharex=False参数即可实现需求 g = sns.FacetGrid(df, col='i', sharex=False) g = g.map(sns.lineplot, 'x', 'y')
如果需要更精细的自定义控制,也可以在关闭共享后手动设置每个子图的x轴范围:
g = sns.FacetGrid(df, col='i', sharex=False) g = g.map(sns.lineplot, 'x', 'y') # 手动自定义每个子图的x轴边界 for i, ax in enumerate(g.axes.flat): ax.set_xlim(0, 1/(2**i)) plt.show()
内容的提问来源于stack exchange,提问作者halloleo
相关产品推荐
相关产品推荐

