python - Seaborn Factorplot 在实际图下方生成额外的空图
问题描述
全部,
我正在尝试使用 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()
上述代码的输出:
注意:我是 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}}
解决方案
请注意,在最新版本的 seaborn 中factorplot
称为“catplot” 。
catplot
或者factorplot
是数字级别的功能。这意味着它们应该在图形级别而不是轴级别上工作。
您的代码中发生了什么:
f,axes=plt.subplots(1,2,figsize=(8,4))
- 这将创建“图 1”。
sns.factorplot(x="borough", y="pickups", hue="borough", kind='bar', data=n, size=4, aspect=2,ax=axes[0])
- 这将创建“图 2”,但不是在
Figure 2
您上绘制,而是告诉 seabornaxes[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])
- 现在这再次创建了一个图形:
Figure 3
在这里,您也告诉 seaborn 从 的轴上绘制Figure 1
,axes[1]
也就是说。
plt.close(2)
- 在这里,您关闭了
Figure 2
由 seaborn 创建的空。
所以现在你只剩下Figure 1
你有点“注入”到调用中的两个轴,以及由第二次调用创建factorplot
的仍然空的图形,但从未包含任何内容:(。Figure 3
factorplot
plt.show()
现在你看到
Figure 1
2 个轴和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()
基本上,您factorplot
通过提供来自Figure 1
. 可能不是factorplot
设计的目的,但是嘿,如果它有效,它就有效......而且它确实有效。
2.正确的:
让图形级功能完成其工作并创建自己的图形。您需要做的是指定您想要作为列的变量。
由于您似乎有 2 个数据框,n
并且low_pickups
,您应该首先从它们中创建一个数据框,列说cat
要么是n
要么low_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)
现在,您可以使用变量作为列通过一次调用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()
注意:sharey=False
默认情况下它是必需的,并且您基本上不会看到第二个面板中的值,因为它们比第一个面板中的值小得多。
你可能仍然需要一些样式,但我会把这个留给你;)。
希望这有帮助!
推荐阅读
- flutter - 在颤动中点击谷歌地图标记后如何添加底页?
- asp.net-core-mvc - ASP.NET Core 2 应用程序中的活动 ID
- python - 如何允许用户使用数字输入从列表中选择文件?(即文件 x 为“1”,文件 y 为“2”等)
- blockchain - Waves 智能合约是否具有与以太坊类似的地址?
- python - 在 Python 套接字编程中,为什么直接从套接字接收数据只给你第一条消息?
- google-cloud-ml - 在 MLengine 中运行单元测试(返回无法识别的参数:--job-dir)
- javascript - 如何在 python-selenium 中获取 html 元素的“值”?
- scala - 在纱线集群上分发 sparkContext 错误
- python - 如何在 python 中安装 fastText 库?
- django - 生产环境中的 Django virtualenvwrapper 环境变量