Seaborn重制版创建重复的轴

时间:2018-08-28 00:32:25

标签: matplotlib seaborn

我正在尝试创建两个情节-一个与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个!看:

enter image description here

我放弃阅读这两个额外的轴-需要帮助。
这是创建数据的代码:

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)

2 个答案:

答案 0 :(得分:3)

以下是摆脱其他多余的空图的可能解决方案。问题在于,当您调用sns.relplot时,relplot返回一个class:FacetGrid object。可以看到here。但是,由于您传递了ax1ax2进行绘制,因此这些分配了变量p1p2的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中的说明。