Seaborn Factorplot在实际图块下方生成额外的空图

Dat*_*wer 10 python plot visualization matplotlib seaborn

所有,

我正在尝试使用subplots函数和Seaborn库来绘制两个Factorplots 。我可以使用下面的代码分别绘制两个图。但是,seaborn正在实际图下方生成额外的图(请参见下图)。有没有一种方法可以避免seaborn生成多余的空图?我试图plt.close摆脱地块,但不幸的是,它只是关闭了1个地块。此外,我试图将图例移出地块并在地块旁边显示图例。有没有简单的方法可以做到这一点。我尝试legend_out使用seaborn包装提供的产品,但是没有用。

我的代码:

f,axes=plt.subplots(1,2,figsize=(8,4))

sns.factorplot(x="borough", y="pickups", hue="borough", kind='bar', data=n, size=4, aspect=2,ax=axes[0])

sns.factorplot(x="borough", y="pickups", hue="borough", kind='bar', data=low_pickups, size=4, aspect=2,ax=axes[1])
plt.close(2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

以上代码的输出:

在此处输入图片说明

注意:我是python的新手,请在您的代码中提供解释。

数据帧的输出

#n dataframe
{'borough': {0: 'Bronx', 1: 'Brooklyn', 2: 'EWR', 3: 'Manhattan', 4: 'Queens', 5: 'Staten Island', 6: 'Unknown'}, 'pickups': {0: 50.66705042597283, 1: 534.4312687082662, 2: 0.02417683628827999, 3: 2387.253281142068, 4: 309.35482385447847, 5: 1.6018880957863229, 6: 2.0571804140650674}}
#low_pickups dataframe
{'borough': {2: 'EWR', 5: 'Staten Island', 6: 'Unknown'}, 'pickups': {2: 0.02417683628827999, 5: 1.6018880957863229, 6: 2.0571804140650674}}
Run Code Online (Sandbox Code Playgroud)

joj*_*ojo 15

请注意,在最新版本的seaborn中factorplot称为“ catplot”

catplot或者factorplot是图形级功能。这意味着它们应该在图形级而不是轴级上工作。

您的代码中发生了什么:

f,axes=plt.subplots(1,2,figsize=(8,4))
Run Code Online (Sandbox Code Playgroud)
  • 这将创建“图1”。
sns.factorplot(x="borough", y="pickups", hue="borough", kind='bar', data=n, size=4, aspect=2,ax=axes[0])
Run Code Online (Sandbox Code Playgroud)
  • 这将创建“图2”,但不是吸取了Figure 2你告诉seaborn借鉴axes[0]Figure 1,所以Figure 2保留为空。
sns.factorplot(x="borough", y="pickups", hue="borough", kind='bar', data=low_pickups, size=4, aspect=2,ax=axes[1])
Run Code Online (Sandbox Code Playgroud)
  • 现在,这再次创建一个数字:Figure 3在这里也一样,你告诉seaborn上绘制从轴Figure 1axes[1]即。
plt.close(2)
Run Code Online (Sandbox Code Playgroud)
  • 在这里,您可以关闭Figure 2seaborn创建的空缺。

因此,现在剩下的Figure 1是将您“注入”到factorplot调用中的两个轴以及Figure 3由第二次调用创建的仍然为空的图形,factorplot但是从不共享任何内容:(.。

plt.show()
Run Code Online (Sandbox Code Playgroud)
  • 现在,您将看到Figure 12个轴,并且Figure 3有一个空图。

    这是在终端机中运行时,在笔记本中,您可能只看到两个图形一个在另一个图形下方,另一个图形似乎是带有3个轴的图形。


如何解决这个问题:

您有2个选择:

1.快速:

只需在关闭Figure 3之前plt.show()

f,axes=plt.subplots(1,2,figsize=(8,4))

sns.factorplot(x="borough", y="pickups", hue="borough", kind='bar', data=n, size=4, aspect=2,ax=axes[0])

sns.factorplot(x="borough", y="pickups", hue="borough", kind='bar', data=low_pickups, size=4, aspect=2,ax=axes[1])
plt.close(2)
plt.close(3)
plt.show()
Run Code Online (Sandbox Code Playgroud)

基本上,您是factorplot通过从中提供“自定义”轴来短路创建图形和要绘制的轴的部分Figure 1。可能不是factorplot设计的目的,但是,嘿,如果它起作用了,它就起作用了……而且它起作用了。

2.正确的一个:

让图形级功能完成其工作并创建自己的图形。您需要做的是指定要作为列的变量。

由于您似乎有2个数据帧,n并且low_pickups您应该首先从中创建一个数据帧,并在列cat中注明nlow_pickups

# assuming n and low_pickups are a pandas.DataFrame:
# first add the 'cat' column for both
n['cat'] = 'n'
low_pickups['cat'] = 'low_pickups'
# now create a new dataframe that is a combination of both
comb_df = n.append(low_pickups)
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用变量作为列,通过一次调用sns.catplot(或sns.factorplot在您的情况下)来创建图形cat

sns.catplot(x="borough", y="pickups", col='cat', hue="borough", kind='bar', sharey=False, data=comb_df, size=4, aspect=1)
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

注意sharey=False默认情况下为true是必需的,并且您基本上不会在第二个面板中看到这些值,因为它们比第一个面板中的值小得多。

然后,版本2给出: 在此处输入图片说明

您可能仍需要一些样式,但是我会留给您;)。

希望这对您有所帮助!

  • 看到`plt.close(2)`让我大惊小怪:) (2认同)