如何让Seaborn分面图的宽度与X轴数据范围成正比
解决方案
你需要先统计每个Subunit分组对应的X轴Seq列的数值范围跨度,将跨度值作为子图宽度比例,通过gridspec_kws参数传递给分面绘图对象即可实现需求。
1. 基于FacetGrid的修改代码
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd sns.set() # 计算每个Subunit分组的Seq列数值跨度,作为子图宽度比例 subunit_x_range = rmsf_crys.groupby("Subunit")["Seq"].agg(lambda s: s.max() - s.min()) width_ratios = subunit_x_range.to_list() # 初始化FacetGrid时传入gridspec_kws指定宽度比例 graph = sns.FacetGrid(rmsf_crys, col = "Subunit", sharex = False, gridspec_kws={"width_ratios": width_ratios}) graph.map(plt.plot, "Seq", "RMSF") graph.set_titles(col_template = '{col_name}') plt.show()
2. 基于relplot的修改代码
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd sns.set() # 计算每个Subunit分组的Seq列数值跨度,作为子图宽度比例 subunit_x_range = rmsf_crys.groupby("Subunit")["Seq"].agg(lambda s: s.max() - s.min()) width_ratios = subunit_x_range.to_list() # 在facet_kws中增加gridspec_kws参数指定宽度比例 graph = sns.relplot(data = rmsf_crys, x = "Seq", y = "RMSF", col = "Subunit", kind = "line", facet_kws = dict(sharex=False, gridspec_kws={"width_ratios": width_ratios})) graph.set_titles(col_template = '{col_name}') plt.show()
实现原理
seaborn的分面绘图底层基于matplotlib的GridSpec布局系统,gridspec_kws参数可以将自定义布局配置传递给GridSpec初始化,其中width_ratios参数用于指定每列子图的宽度比例,我们提前计算每个分组X轴的数值跨度作为比例值,即可实现子图宽度与X轴数据范围成正比的效果。
内容的提问来源于stack exchange,提问作者AppleIntusion
相关产品推荐
相关产品推荐

