Python 如何嵌入seaborn lmplot生成的插入图?

Python 如何嵌入seaborn lmplot生成的插入图?,python,python-3.x,matplotlib,plot,seaborn,Python,Python 3.x,Matplotlib,Plot,Seaborn,在seabornsns中,lmplot返回对象。我想画一幅插图。下面是一个自包含的“工作”示例: 但是我得到了以下两个图,而不是嵌入插图中的第二个图: 最后,我希望代码能够知道哪里有一个空白,并将插图干净地放在里面,如下所示: FWIW,我的玩具套装数据以表格格式显示如下: 由于FaceGrid生成自己的图形,因此lmplot不能在轴内使用。 您将需要绘制所需数量的regplots from io import StringIO import pandas as pd df_stri

在seaborn
sns中,lmplot
返回对象。我想画一幅插图。下面是一个自包含的“工作”示例:

但是我得到了以下两个图,而不是嵌入插图中的第二个图:

最后,我希望代码能够知道哪里有一个空白,并将插图干净地放在里面,如下所示:


FWIW,我的玩具套装数据以表格格式显示如下:


由于
FaceGrid
生成自己的图形,因此
lmplot
不能在轴内使用。 您将需要绘制所需数量的
regplot
s

from io import StringIO
import pandas as pd

df_string="""time\tsex\tage\tval1\tval2\n1\tM\t18\t0.285837375\t4.402793733\n
2\tM\t18\t0.234239365\t2.987464305\n
3\tM\t18\t0.820418465\t3.23991295\n
4\tM\t18\t0.826027695\t9.707366329\n
5\tM\t18\t0.625449525\t2.971235344\n
6\tM\t18\t0.485980081\t5.517575471\n
7\tM\t18\t0.136163546\t3.620177216\n
8\tM\t18\t0.784944053\t5.116294718\n
9\tM\t18\t0.981526403\t6.348155198\n
10\tM\t18\t0.822237037\t4.682176522\n
1\tF\t22\t0.104339381\t5.434133736\n
2\tF\t22\t0.788797127\t0.843869877\n
3\tF\t22\t0.997986894\t8.765048753\n
4\tF\t22\t0.51167857\t2.054679646\n
5\tF\t22\t0.328416139\t6.581617426\n
6\tF\t22\t0.317804112\t1.584234393\n
7\tF\t22\t0.489944956\t8.564257177\n
8\tF\t22\t0.207348127\t1.346020575\n
9\tF\t22\t0.727347344\t7.487993859\n
10\tF\t22\t0.252917798\t8.822904862\n
11\tF\t22\t0.690106636\t6.728470474\n
12\tF\t22\t0.508078197\t2.489437246\n"""
df = pd.read_csv(StringIO(df_string), sep='\t')


import seaborn as sns
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

fig, ax = plt.subplots()

for (n, grp) in df.groupby("sex"):
    sns.regplot(x='time',y='val1', x_estimator=np.mean,
                   data=grp, logx= True, truncate=True)

ax.xaxis.set_label_text('t [sec]')
ax.set(yscale="log")   

axins = inset_axes(ax,  "30%", "40%" ,loc="lower right", borderpad=3)

for (n, grp) in df.groupby("sex"):
    sns.regplot(x='time',y='val1', x_estimator=np.mean,
                   data=grp, truncate=True, ax=axins)


plt.show()

从代码来看,这里似乎没有任何理由使用
lmplot
。如果使用
regplot
,则可以在任何matplotlib轴上绘制。我认为自动搜索空白是最难的部分,因为没有明确的解决方案that@ImportanceOfBeingErnest在较大的真实数据帧中,我有10种不同的色调提示。你有什么想法?
import seaborn as sns
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.axes_grid.inset_locator import inset_axes, mark_inset

df_to_plot = df_tmp.reset_index()
g = sns.lmplot(x='time',y='val1',hue="sex",x_estimator=np.mean,height=10, aspect=1,
                   data=df_to_plot, logx= True, legend_out=True, truncate=True)

g.axes[0][0].xaxis.set_label_text('t [sec]')
g.set(yscale="log")   

ax = g.axes[0][0]
axins = inset_axes(ax, "30%", "40%")
g_inset = sns.lmplot(x='time',y='val1',hue="sex",x_estimator=np.mean, data=df_to_plot, legend_out=False)
from io import StringIO
import pandas as pd

df_string="""time\tsex\tage\tval1\tval2\n1\tM\t18\t0.285837375\t4.402793733\n
2\tM\t18\t0.234239365\t2.987464305\n
3\tM\t18\t0.820418465\t3.23991295\n
4\tM\t18\t0.826027695\t9.707366329\n
5\tM\t18\t0.625449525\t2.971235344\n
6\tM\t18\t0.485980081\t5.517575471\n
7\tM\t18\t0.136163546\t3.620177216\n
8\tM\t18\t0.784944053\t5.116294718\n
9\tM\t18\t0.981526403\t6.348155198\n
10\tM\t18\t0.822237037\t4.682176522\n
1\tF\t22\t0.104339381\t5.434133736\n
2\tF\t22\t0.788797127\t0.843869877\n
3\tF\t22\t0.997986894\t8.765048753\n
4\tF\t22\t0.51167857\t2.054679646\n
5\tF\t22\t0.328416139\t6.581617426\n
6\tF\t22\t0.317804112\t1.584234393\n
7\tF\t22\t0.489944956\t8.564257177\n
8\tF\t22\t0.207348127\t1.346020575\n
9\tF\t22\t0.727347344\t7.487993859\n
10\tF\t22\t0.252917798\t8.822904862\n
11\tF\t22\t0.690106636\t6.728470474\n
12\tF\t22\t0.508078197\t2.489437246\n"""
df = pd.read_csv(StringIO(df_string), sep='\t')


import seaborn as sns
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

fig, ax = plt.subplots()

for (n, grp) in df.groupby("sex"):
    sns.regplot(x='time',y='val1', x_estimator=np.mean,
                   data=grp, logx= True, truncate=True)

ax.xaxis.set_label_text('t [sec]')
ax.set(yscale="log")   

axins = inset_axes(ax,  "30%", "40%" ,loc="lower right", borderpad=3)

for (n, grp) in df.groupby("sex"):
    sns.regplot(x='time',y='val1', x_estimator=np.mean,
                   data=grp, truncate=True, ax=axins)


plt.show()