如何在带有水平条的 Python seaborn catplot 中设置条宽相等?
How to set bar widths equal in Python seaborn catplot with horizontal bars?
我有一个数据,我想将其显示为行和列中的水平条形图。我正在尝试使用 Python seaborn 来做到这一点,哪个方面的设施很适合这个目的。
y 轴变量集在行维度上不同,我不想在分面中显示空项。问题是当条形宽度调整时,刻面得到相同的高度。我想知道我是否可以以相反的方式进行此操作,以便所有面的所有条形宽度都相等,但面高度会调整。
这是一个例子:
import plotly.express as px
import seaborn as sns
df = px.data.tips()
g = sns.catplot(x="total_bill", y="day", col="sex", row="time", hue="smoker", data=df,
kind="bar", sharey=False, margin_titles=True)
这就是这个数字的样子(seaborn 版本 0.11.2):
如何更改网格规格
要获得您想要的输出,您可以根据类别数设置 FacetGrid 的 gridspec:
df = px.data.tips()
df = df[df["day"] != "Thur"]
ratios = df.groupby('time')['day'].nunique().values
g = sns.catplot(x="total_bill", y="day", col="sex", row="time",
data=df, kind="bar", sharey=False,
legend=False, margin_titles=True,
facet_kws={'gridspec_kws':{'height_ratios': ratios}})
输出:
上一个答案:再现性
如果我用 seaborn 0.11.0 重现你的代码,我会得到以下输出。由于 day
的 Categorical
值,公共日期被广播到所有地块并且列具有相同的宽度。
>>> df = sns.load_dataset("tips")
>>> df.dtypes
total_bill float64
tip float64
sex category
smoker category
day category
time category
size int64
dtype: object
更新:plotly 表达数据集
>>> import plotly.express as px
>>> df2 = px.data.tips()
>>> df2.dtypes
total_bill float64
tip float64
sex object
smoker object
day object
time object
size int64
dtype: object
我有一个数据,我想将其显示为行和列中的水平条形图。我正在尝试使用 Python seaborn 来做到这一点,哪个方面的设施很适合这个目的。
y 轴变量集在行维度上不同,我不想在分面中显示空项。问题是当条形宽度调整时,刻面得到相同的高度。我想知道我是否可以以相反的方式进行此操作,以便所有面的所有条形宽度都相等,但面高度会调整。
这是一个例子:
import plotly.express as px
import seaborn as sns
df = px.data.tips()
g = sns.catplot(x="total_bill", y="day", col="sex", row="time", hue="smoker", data=df,
kind="bar", sharey=False, margin_titles=True)
这就是这个数字的样子(seaborn 版本 0.11.2):
如何更改网格规格
要获得您想要的输出,您可以根据类别数设置 FacetGrid 的 gridspec:
df = px.data.tips()
df = df[df["day"] != "Thur"]
ratios = df.groupby('time')['day'].nunique().values
g = sns.catplot(x="total_bill", y="day", col="sex", row="time",
data=df, kind="bar", sharey=False,
legend=False, margin_titles=True,
facet_kws={'gridspec_kws':{'height_ratios': ratios}})
输出:
上一个答案:再现性
如果我用 seaborn 0.11.0 重现你的代码,我会得到以下输出。由于 day
的 Categorical
值,公共日期被广播到所有地块并且列具有相同的宽度。
>>> df = sns.load_dataset("tips")
>>> df.dtypes
total_bill float64
tip float64
sex category
smoker category
day category
time category
size int64
dtype: object
更新:plotly 表达数据集
>>> import plotly.express as px
>>> df2 = px.data.tips()
>>> df2.dtypes
total_bill float64
tip float64
sex object
smoker object
day object
time object
size int64
dtype: object