【问题标题】:Seaborn relplots creates duplicated axesSeaborn relplot 创建重复轴
【发布时间】:2019-02-02 12:53:48
【问题描述】:

我正在尝试使用 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 个!看:

我放弃阅读这些额外的 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)

【问题讨论】:

  • 你为什么要这么做? relplot 是一个图形级函数,它将创建自己的 Figure 实例和可能的几个子图。要求它绘制到特定轴有什么意义?这似乎没有意义。
  • 这能回答你的问题吗? seaborn is not plotting within defined subplots
  • 此页面上的现有解决方案不再有效。 sns.relplot 是一个图形级别的图。请参阅上一个链接的副本。

标签: matplotlib seaborn


【解决方案1】:

以下是摆脱额外不需要的空地块的可能解决方案。问题是当你调用sns.relplot 时,relplot 返回一个class:FacetGrid object。这可以看到here。但是由于您通过 ax1ax2 进行绘图,这些被分配了变量 p1p2 的 FacetGrid 显示为空白图。要摆脱这些,只需添加以下几行

plt.close(p1.fig)
plt.close(p2.fig) 

【讨论】:

  • 这不是我梦寐以求的,但它确实有效。谢谢!
【解决方案2】:

relplot 是一个figure-level 函数,所以它会创建一个图形。如果你想把你的线图放在现有的 matplotlib 轴上,而不创建多余的数字,请使用 seaborn 的线图函数,它是一个 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 获取插图。

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2021-09-13
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多