如何使用 .on(fig) 而不扭曲 seaborn.objects 中的图例位置?

问题描述 投票:0回答:1

我正在 seaborn.objects 中创建一个绘图。这个图有一个图例,我也想改变它的大小。

这可以使用

.theme()
方法来完成,该方法会影响 matplotlib
rcParams
:

import matplotlib.pyplot as plt
import seaborn.objects as so
import pandas as pd

dat = pd.DataFrame({'group':['a','a','b','b'],
                    'x': [1, 2, 1, 2],
                    'y': [4, 3, 2, 1]})

# Choosing a very distorted figure size here so you can see when it works
(so.Plot(dat, x = 'x', y = 'y', color = 'group')
 .add(so.Line())
 .theme({'figure.figsize': (8,2)}))

Line graph with legend and (8,2) figure size

但是,为了解决这篇文章中概述的问题,我需要创建一个matplotlib图形对象,然后绘制

.on()
该对象。当我这样做时,
'figure.figsize'
中的
.theme()
设置将被忽略(其他一些
.theme()
设置仍然有效,但不是这个或我尝试过的其他几个设置)。另外,如果仔细观察,您可以看到图例的右边缘被推离图像的边缘。

(另请注意,无论有或没有

'legend.loc'
rcParam
.on(fig)
都会被忽略:我认为seaborn.objects有自己的图例放置系统。)

fig = plt.figure()

# Choosing a very distorted figure size here so you can see when it works
(so.Plot(dat, x = 'x', y = 'y', color = 'group')
 .on(fig)
 .add(so.Line())
 .theme({'figure.figsize': (8,2)}))

Line graph with legend and a figure size that is not (8,2)

但是,我现在可以在

figsize
函数中设置
plt.figure()
。但当我这样做时,图例的定位就变得更加混乱,并且基本上被切断了。

fig = plt.figure(figsize = (8,2))

# Choosing a very distorted figure size here so you can see when it works
(so.Plot(dat, x = 'x', y = 'y', color = 'group')
 .on(fig)
 .add(so.Line()))

Line graph with misplaced legend and (8,2) figure size

如何将

.on(fig)
包含在图例中而不将图例推开?正如这个other question中所指出的,为常规matplotlib/seaborn中的图例移动而设计的标准工具对于seaborn.objects的工作方式不同。虽然需要明确的是,我的问题并不是真正关于如何移动图例(虽然这将是解决此问题的一种方法) - seaborn.objects 已经知道如何正确放置调整大小的图形的图例(如果通过)
.theme()
,理想情况下我也希望能够解决
plt.figure()

(编辑:发布后,我立即尝试使用

figsize
但从
matplotlib
内部更改 rcParams,但这并不重要:
import matplotlib as mpl; mpl.rcParams['figure.figsize'] = (8,2)
产生与
fig = plt.figure(figsize = (8,2))
尝试相同的结果)

python matplotlib seaborn seaborn-objects
1个回答
3
投票

我不完全确定这里发生了什么,但看起来可以通过在创建图形时使用

layout="tight"
来修复:

fig = plt.figure(figsize=(8, 2), layout="tight")

(so.Plot(dat, x = 'x', y = 'y', color = 'group')
 .on(fig)
 .add(so.Line())
)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.