如何避免Seaborn FacetGrid中叠加绘图时坐标轴被重新缩放?
问题
我尝试在分类小提琴图(violin plot)上叠加分类带状图(strip plot)。先绘制小提琴图,再绘制带状图后,坐标轴被带状图重新缩放,我希望保留小提琴图的原始坐标轴缩放比例。
小提琴图代码
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data = pd.DataFrame.from_dict({ 'y_violin': list(range(16)), 'y_strip': [8] * 16, 'x': [1, 1, 0, 0] * 4, 'col': [1, 1, 1, 1, 0, 0, 0, 0] * 2, 'hue': [1] * 8 + [0] * 8, }) g = sns.catplot( kind = 'violin', data = data, x = 'x', y = 'y_violin', col = 'col', hue = 'hue', inner = 'points', dodge = False, ) plt.show()
叠加带状图的代码
for col, ax in g.axes_dict.items(): sns.stripplot( data = data.loc[data.col == col], x = 'x', y = 'y_strip', jitter = False, legend = False, palette = ['#00FF00'], ax = ax ) plt.show()
执行上述代码后,带状图的点位置正确,但图表坐标轴被重新缩放,需要保留小提琴图的原始轴范围。
解决方法
核心思路是先记录小提琴图绘制完成后每个子图的y轴范围,绘制带状图后再将轴范围恢复回去。
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data = pd.DataFrame.from_dict({ 'y_violin': list(range(16)), 'y_strip': [8] * 16, 'x': [1, 1, 0, 0] * 4, 'col': [1, 1, 1, 1, 0, 0, 0, 0] * 2, 'hue': [1] * 8 + [0] * 8, }) # 绘制小提琴图 g = sns.catplot( kind = 'violin', data = data, x = 'x', y = 'y_violin', col = 'col', hue = 'hue', inner = 'points', dodge = False, ) # 保存每个子图的原始y轴范围 y_ranges = {col: ax.get_ylim() for col, ax in g.axes_dict.items()} # 叠加带状图并恢复轴范围 for col, ax in g.axes_dict.items(): sns.stripplot( data = data.loc[data.col == col], x = 'x', y = 'y_strip', jitter = False, legend = False, palette = ['#00FF00'], ax = ax ) # 恢复原始y轴范围 ax.set_ylim(y_ranges[col]) plt.show()
关键步骤说明
- 用
ax.get_ylim()获取小提琴图绘制完成后每个子图的y轴上下限,存入字典y_ranges - 绘制完带状图后,调用
ax.set_ylim(y_ranges[col])将每个子图的y轴范围恢复到之前记录的值,避免被带状图的数据影响缩放比例
内容的提问来源于stack exchange,提问作者Icy Clench
相关产品推荐
相关产品推荐

