到目前为止,我已经尝试了以下代码:
# Import to handle plotting
import seaborn as sns
# Import pyplot,figures inline,set style,plot pairplot
import matplotlib.pyplot as plt
# Make the figure space
fig = plt.figure(figsize=(2,4))
gs = fig.add_gridspec(2,4)
ax1 = fig.add_subplot(gs[0,:])
ax2 = fig.add_subplot(gs[1,:])
# Load the example car crash dataset
tips = sns.load_dataset("tips")
# Plot the frequency counts grouped by time
sns.catplot(x='sex',hue='smoker',kind='count',col='time',data=tips,ax=ax1)
# View the data
sns.catplot(x='sex',y='total_bill',kind='violin',split='True',cut=0,bw=0.25,scale='area',scale_hue=False,inner='quartile',ax=ax2)
plt.close(2)
plt.close(3)
plt.show()
这似乎将每种类别图分别堆叠在彼此之上.
我想要的是以下代码在单个图中的结果图,其中第一行的计数图和第二行的小提琴图.
# Import to handle plotting
import seaborn as sns
# Import pyplot,plot pairplot
import matplotlib.pyplot as plt
# Load the example car crash dataset
tips = sns.load_dataset("tips")
# Plot the frequency counts grouped by time
sns.catplot(x='sex',data=tips)
# View the data
sns.catplot(x='sex',data=tips)
我想跨越图的第一行的实际分类计数图,该图还包含分类小提琴图(参见图3):
我想跨越图的第二行的实际分类小提琴图,其中也包含分类计数图(参见图2):
我尝试了以下代码,将图强制显示在同一图中.不利的一面是图形/轴的子项没有转移,即轴标签,图例和网格线.我对这种骇客感到很亲密,但需要其他推动或灵感来源.另外,我不再能够关闭旧的/不需要的数字.
# Import to handle plotting
import seaborn as sns
# Import pyplot,plot pairplot
import matplotlib.pyplot as plt
# Set some style
sns.set_style("whitegrid")
# Load the example car crash dataset
tips = sns.load_dataset("tips")
# Plot the frequency counts grouped by time
a = sns.catplot(x='sex',data=tips)
numSubs_A = len(a.col_names)
for i in range(numSubs_A):
for p in a.facet_axis(0,i).patches:
a.facet_axis(0,i).annotate(str(p.get_height()),(p.get_x()+0.15,p.get_height()+0.1))
# View the data
b = sns.catplot(x='sex',data=tips)
numSubs_B = len(b.col_names)
# Subplots migration
f = plt.figure()
for i in range(numSubs_A):
f._axstack.add(f._make_key(a.facet_axis(0,i)),a.facet_axis(0,i))
for i in range(numSubs_B):
f._axstack.add(f._make_key(b.facet_axis(0,b.facet_axis(0,i))
# Subplots size adjustment
f.axes[0].set_position([0,1,1])
f.axes[1].set_position([1,1])
f.axes[2].set_position([0,1])
f.axes[3].set_position([1,1])
最佳答案
通常,不可能将多个Seaborn图形级功能的输出组合到一个图形中.参见(this question,也this issue).我曾经从wrote a hack外部组合这样的数字,但是它有几个缺点.如果适合您,请随意使用它.
但通常,请考虑手动创建所需的图.在这种情况下,它可能看起来像这样:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
fig,axes = plt.subplots(2,2,figsize=(8,6),sharey="row",sharex="col")
tips = sns.load_dataset("tips")
order = tips["sex"].unique()
hue_order = tips["smoker"].unique()
for i,(n,grp) in enumerate(tips.groupby("time")):
sns.countplot(x="sex",hue="smoker",data=grp,order=order,hue_order=hue_order,ax=axes[0,i])
sns.violinplot(x='sex',ax=axes[1,i])
axes[0,i].set_title(f"time = {n}")
axes[0,0].get_legend().remove()
axes[1,1].get_legend().remove()
plt.show()