如何更改 seaborn 图表或图形级别绘图的图像大小

494
如何调整图片的尺寸以适合打印呢?
举个例子,我想使用A4纸,它的尺寸是11.7英寸乘以8.27英寸,横向排列。
14个回答

544
您还可以通过将字典传递给 seaborn 的 set 方法中的 rc 参数,并使用 key 为 'figure.figsize' 来设置图形大小:
import seaborn as sns

sns.set(rc={'figure.figsize':(11.7,8.27)})

另一种选择是使用rcParamsfigure.figsize来设置图形大小,如下所示:

from matplotlib import rcParams

# figure size in inches
rcParams['figure.figsize'] = 11.7,8.27

更多细节可以在Matplotlib文档中找到。


9
与其他解决方案不同,该解决方案不假设特定的情节定义方式。谢谢。 - LoMaPh
34
请注意,当您调用sns.set()时,默认情况下会将图形样式设置为sns默认值,而不是matplotlib默认值。例如,您的图形将突然具有灰色背景和白色网格 - 请参见此处:https://seaborn.pydata.org/tutorial/aesthetics.html。此外,这对我的绘图大小(sns.pairplot)没有任何影响。 - Melissa
3
不是我的sns.boxplot。 - Gordon
4
哎呀,它们都无法在Jupyter Lab中生成任何图表。相反,fig, ax = pyplot.subplots(figsize=(20, 2)); a = sns.lineplot(ax=ax, x=..., y=...) 可以正常工作。当这样的参数,在seaborn里本应该很直接因为很常用,但需要使用一些“技巧”来设置时,我总是感到惊讶。 - Alex Poca
1
不知道我有多少次访问这个问题只是为了复制粘贴那一行哈哈。我的数字都是(11.7,8.27)。 - Juan Luis Ruiz-tagle
显示剩余2条评论

328

您需要提前创建Matplotlib的Figure和Axes对象,指定图形的大小:

from matplotlib import pyplot
import seaborn

import mylib

a4_dims = (11.7, 8.27)
df = mylib.load_data()
fig, ax = pyplot.subplots(figsize=a4_dims)
seaborn.violinplot(ax=ax, data=df, **violin_options)

11
这个解决方案似乎无法与接下来的代码(不同类型的图形)配合使用。有什么想法吗?我假设“mylib”只是一个库,用于存储数据,在这段代码中不需要它:fig,ax = pyplot.subplots(figsize =(12,6)); sns.jointplot(memoryPrice ['price'],memoryPrice ['Memory']) - TMWP
3
这个答案不适用于 @TMWP 的情况,因为 jointplot 是一个图形级别的方法。请参见下面的答案。 - elz
9
这个答案对于那些不接受ax作为输入的绘图类型是无效的,例如sns.lmplot() - F.S.
5
在 seaborn 中,需要使用 heightaspect 参数来设置绘图大小,具体请参考 https://dev59.com/tlwZ5IYBdhLWcg3wVO5U#51602446。 - LeandroOrdonez
@LeandroOrdonez 这并不适用于轴级别函数。 - Paul H

261

53
到目前为止,这是唯一一个正确处理不接受“ax”作为参数的sns绘图的答案。 - Melissa
6
请注意,高度和纵横比控制了单个“面”,即子图的尺寸。因此,这不会直接调整整个图形的尺寸。 - bernie
4
请参阅 官方教程 - JohanC
1
注意:这也适用于relplot。即使使用plt.figure(figsize=...)提前创建图形,我仍然需要指定height/aspect来改变尺寸。我更喜欢这种方法而不是sns.set()的解决方案,因为我希望不同的图形有不同的值。 - Neil Traft

154

首先导入matplotlib并使用它来设置图形的大小

from matplotlib import pyplot as plt
import seaborn as sns

plt.figure(figsize=(15,8))
ax = sns.barplot(x="Word", y="Frequency", data=boxdata)

1
这个解决方案要简单得多。 - Nemo

109

你可以将上下文设置为poster,或者手动设置fig_size

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(0)
n, p = 40, 8
d = np.random.normal(0, 2, (n, p))
d += np.log(np.arange(1, p + 1)) * -5 + 10


# plot
sns.set_style('ticks')
fig, ax = plt.subplots()
# the size of A4 paper
fig.set_size_inches(11.7, 8.27)
sns.violinplot(data=d, inner="points", ax=ax)    
sns.despine()

fig.savefig('example.png')

在这里输入图片描述


5
这个答案对于不接受ax作为输入的那些图表类型是不适用的,例如sns.lmplot() - F.S.
1
进一步解释Chris的答案,一些seaborn图形生成具有多个轴的复合图形,因此它们不能将单个轴作为参数。 - Marmaduke
这对我很有用,当我尝试绘制小提琴图时。我能够在Jupiter实验室笔记本中内联更改图形的大小。 - muammar

67

这可以通过以下方式完成:

plt.figure(figsize=(15,8))
sns.kdeplot(data,shade=True)

3
如果不需要import matplotlib.pyplot as plt就可以使用这个简单的调用,那就太好了。我想知道为什么他们不直接使用sns.set_figure_size()来公开它。 - n1k31t4

64

除了elz回答的关于返回多图网格对象的“图形级别”方法之外,还可以使用以下方法明确设置图形的高度和宽度(而不是使用纵横比):

import seaborn as sns 

g = sns.catplot(data=df, x='xvar', y='yvar', hue='hue_bar')
g.fig.set_figwidth(8.27)
g.fig.set_figheight(11.7)

1
set_figwidthset_figheight在网格对象中的使用效果很好。
导入 seaborn 导入 matplotlib.pyplot as pyplot tips = seaborn.load_dataset("tips") g = seaborn.FacetGrid(tips, col="time", row="smoker") g = g.map(pyplot.hist, "total_bill") g.fig.set_figwidth(10) g.fig.set_figheight(10)
- Paul Rougieux
3
也许API已经改变了,但对我来说应该使用g.figure.set_figwidth而不是g.fig.set_figwidth。我正在使用matplotlib版本3.1.0和seaborn 0.9.0。 - NateW
适用于 seaborn 版本 0.11.1 - 此页面上的其他解决方案均无效。 - joshi123
1
非常感谢,这是唯一有效的解决方案。我一直在尝试解决这个问题,已经花了大约15分钟了。 - Nick
1
15分钟?试试15小时。 - Jesse Kerr

31

这也应该可以运作。

from matplotlib import pyplot as plt
import seaborn as sns    

plt.figure(figsize=(15,16))
sns.countplot(data=yourdata, ...)

29

对于我的绘图(一个sns factorplot),提供的答案效果不佳。

因此我使用了

plt.gcf().set_size_inches(11.7, 8.27)

在 seaborn 绘制图形后(因此不需要将 ax 传递给 seaborn 或更改 rc 设置)。


1
这是我使用FacetGrid的唯一有效解决方案:g = sns.FacetGrid(df.set_index('category'), col="id") pyplot.gcf().set_size_inches(11.7, 8.27) g.map(lambda data, color: data.plot.barh(color=color), "count") - Nicolas78
一样的情况。似乎sns.FacetGrid会根据计算的值(由heightaspect设置)设置图形大小,直接在seaborn绘图后更改图形大小也将起作用。并且在更改图形大小之后可以进行其他细微调整。 - Yunting Zhao

24

导入和数据

import seaborn as sns
import matplotlib.pyplot as plt

# load data
df = sns.load_dataset('penguins')

sns.displot

  • 使用height和/或aspect参数可以调整图形级别绘图的大小
  • 此外,可以通过访问fig对象并使用.set_dpi()来设置图形的dpi
p = sns.displot(data=df, x='flipper_length_mm', stat='density', height=4, aspect=1.5)
p.fig.set_dpi(100)
  • 没有 p.fig.set_dpi(100)

enter image description here

  • 使用 p.fig.set_dpi(100)

enter image description here

sns.histplot

  • 使用figsize和/或dpi可以调整轴级绘图的大小。
# create figure and axes
fig, ax = plt.subplots(figsize=(6, 5), dpi=100)

# plot to the existing fig, by using ax=ax
p = sns.histplot(data=df, x='flipper_length_mm', stat='density', ax=ax)
  • 没有 dpi=100

enter image description here

  • 使用 dpi=100

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接