我正在尝试创建两个情节-一个与Seaborn一起在另一个情节中!
我的代码:
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True, figsize=(22,8))
p1 = sns.relplot(x="sns_codes", y="triad_quantity", hue="label", data=data_2, kind="line", ax=ax1)
p2 = sns.relplot(x="sns_codes", y="triad_quantity", hue="label", data=data_2, kind="line", ax=ax2)
但这将创建4个轴,而不是2个!看:
我放弃阅读这两个额外的轴-需要帮助。
这是创建数据的代码:
df ={'label': {0: 'top_5',
1: 'first_page',
2: 'win_ratecard',
4: 'switched_off',
5: 'top_5',
6: 'first_page',
7: 'win_ratecard',
9: 'switched_off',
10: 'top_5',
11: 'first_page'},
'report_date': {0: Timestamp('2018-08-21 00:00:00'),
1: Timestamp('2018-08-21 00:00:00'),
2: Timestamp('2018-08-21 00:00:00'),
4: Timestamp('2018-08-22 00:00:00'),
5: Timestamp('2018-08-22 00:00:00'),
6: Timestamp('2018-08-22 00:00:00'),
7: Timestamp('2018-08-22 00:00:00'),
9: Timestamp('2018-08-23 00:00:00'),
10: Timestamp('2018-08-23 00:00:00'),
11: Timestamp('2018-08-23 00:00:00')},
'sns_codes': {0: 0, 1: 0, 2: 0, 4: 1, 5: 1, 6: 1, 7: 1, 9: 2, 10: 2, 11: 2},
'triad_quantity': {0: 9,
1: 204,
2: 214,
4: 20,
5: 5,
6: 191,
7: 230,
9: 21,
10: 2,
11: 98}}
data_2 = pd.DataFrame(df)
答案 0 :(得分:3)
以下是摆脱其他多余的空图的可能解决方案。问题在于,当您调用sns.relplot
时,relplot
返回一个class:FacetGrid object
。可以看到here。但是,由于您传递了ax1
和ax2
进行绘制,因此这些分配了变量p1
和p2
的FacetGrid都显示为空白图。要消除这些,只需添加以下几行
plt.close(p1.fig)
plt.close(p2.fig)
答案 1 :(得分:0)
relplot是一个figure-level函数,因此它将创建一个图形。如果要将线图放置在现有的matplotlib轴上而不创建多余的图形,请使用seaborn的lineplot函数,该函数是axes-level函数:
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True, figsize=(22,8))
p1 = sns.lineplot(x="sns_codes", y="triad_quantity", hue="label", data=data_2, kind="line", ax=ax1)
p2 = sns.lineplot(x="sns_codes", y="triad_quantity", hue="label", data=data_2, kind="line", ax=ax2)
您作为示例给出的两个图似乎做相同的事情,但是如果您尝试做多个图,这些图沿着数据框中的一列表示的某个维度变化,则不必自己指定子图。您可以使用seaborn通过sns.replot进行此操作,并在行(构面)参数中指定row="a_column_on_which_your_plots_vary"
。请参见seaborn tutorial中的说明。