我在Seaborn有一个10个图的FacetGrid图表,其中的图有些许重叠。我想更改整体数字的大小。在下面的代码中使用g.fig.subplots(figsize =(12,12))时,出现错误消息TypeError: subplots() got an unexpected keyword argument 'size'
。
此外,我收到有关UserWarning: Tight layout not applied. tight_layout cannot make axes height small enough to accommodate all axes decorations self.fig.tight_layout()
的警告
在我的代码中没有看到引用ight_layout()的地方。它嵌入在模块C:\Anaconda3\lib\site-packages\seaborn\axisgrid.py:848
中。我不想在站点包模块中乱搞。如何调整参数,以免收到此警告。
我想解决问题,而不仅仅是消除此警告。我对Seaborn和Matplotlib的内部了解不足,无法修复此错误并摆脱警告。
我尝试添加g.fig.subplots(figsize=(12,12))
来更改图形尺寸。显然FacetGrid绘图未包含在图形中,或者我错误地引用了图形边界框对象。
"""
FacetGrid Plot Showing Overlapping Distributions (Densities) Offset by ('ridge plot')
====================================
"""
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})
# Create some random distribution data and labels, and store them in a dataframe
rs = np.random.RandomState(1979)
x = rs.randn(500)
g = np.tile(list("ABCDEFGHIJ"), 50)
df = pd.DataFrame(dict(x=x, g=g))
m = df.g.map(ord)
df["x"] += m
# Initialize the FacetGrid chart object
pal = sns.cubehelix_palette(10, rot=-.25, light=.7)
g = sns.FacetGrid(df, row="g", hue="g", aspect=15, height=.5, palette=pal)
# Draw the densities in a few steps
g.map(sns.kdeplot, "x", clip_on=False, shade=True, alpha=1, lw=1.5, bw=.2)
g.map(sns.kdeplot, "x", clip_on=False, color="w", lw=2, bw=.2)
g.map(plt.axhline, y=0, lw=2, clip_on=False)
# Define and use a simple function to label the plot in axes coordinates
def label(x, color, label):
ax = plt.gca()
ax.text(0, .2, label, fontweight="bold", color=color,
ha="left", va="center", transform=ax.transAxes)
# Use ``map()`` to calculate the label positions
g.map(label, "x")
# Set the subplots to overlap slightly on their vertical direction
g.fig.subplots_adjust(hspace=-.3)
# Remove axes details that don't play well with overlap
g.set_titles("")
g.set(yticks=[])
g.despine(bottom=True, left=True)
g.fig.subplots(figsize=(12,12)) # Don't know how to change figure size for a set of overlapping Seaborn plots
我得到以下警告,之后是错误消息,然后在不更改其大小的情况下显示FacetedGrid图。
self.fig.tight_layout()
C:\Anaconda3\lib\site-packages\seaborn\axisgrid.py:848: UserWarning: Tight layout not applied. tight_layout cannot make axes height small enough to accommodate all axes decorations
self.fig.tight_layout()
C:\Anaconda3\lib\site-packages\seaborn\axisgrid.py:848: UserWarning: Tight layout not applied. tight_layout cannot make axes height small enough to accommodate all axes decorations
self.fig.tight_layout()
<ipython-input-25-a661dbef6e83> in <module>
43 g.set(yticks=[])
44 g.despine(bottom=True, left=True)
---> 45 g.fig.subplots(size=(12,12)) # Don't know how to change figure size for a set of overlapping Seaborn plots
TypeError: subplots() got an unexpected keyword argument 'size'
#############
在整合所有注释之后,这是一个良好而紧凑的情节而没有警告或错误的源代码:
`# -*- coding: utf-8 -*-
""" Created on Mon Jun 24 12:21:40 2019 @author: rlysak01
FacetGrid Plot Showing Overlapping Distributions (Densities) Offset by ('ridge plot')
"""
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})
# Create some random distribution data and labels, and store them in a dataframe
rs = np.random.RandomState(1979)
x = rs.randn(500)
g = np.tile(list("ABCDEFGHIJ"), 50)
df = pd.DataFrame(dict(x=x, g=g))
m = df.g.map(ord)
df["x"] += m
# Initialize the FacetGrid chart object
pal = sns.cubehelix_palette(10, rot=-.25, light=.7)
# g = sns.FacetGrid(df, row="g", hue="g", aspect=6, height=1.0, palette=pal)
g = sns.FacetGrid(df, row="g", hue="g", palette=pal)
''' Alternatively set figsize using the following 2 parameters.'''
g.fig.set_figheight(5.5)
g.fig.set_figwidth(7)
# or use plt.gcf().set_size_inches(12, 12)
# Draw the densities in a few steps
g.map(sns.kdeplot, "x", clip_on=False, shade=True, alpha=1, lw=1.5, bw=.2)
g.map(sns.kdeplot, "x", clip_on=False, color="w", lw=2, bw=.2)
g.map(plt.axhline, y=0, lw=2, clip_on=False)
# Define and use a simple function to label the plot in axes coordinates
# Values x,y in ax.text(x,y, ...) controls the x,y offset from the x axis.
def label(x, color, label):
ax = plt.gca()
ax.text(0, .2, label, fontweight="bold", color=color,
ha="left", va="center", transform=ax.transAxes)
# Use ``map()`` to calculate the label positions
g.map(label, "x")
# Set the subplots to overlap slightly on their vertical direction
g.fig.subplots_adjust(hspace=-0.5)
# Remove axes details that don't play well with overlap
g.set_titles("")
g.set(yticks=[])
g.despine(bottom=True, left=True)
`
答案 0 :(得分:2)
我找到了一种解决方案,您可以将高度和宽度分别设置为
g.fig.set_figheight(12)
g.fig.set_figwidth(12)
或者,您可以尝试将当前图形的大小设置为
g.despine(bottom=True, left=True)
plt.gcf().set_size_inches(12, 12)
使用上面的行为(5,5)大小的示例输出
答案 1 :(得分:1)
Sheldore的回答也可以由以下方式控制FacetGrid的尺寸:
高度:标量,可选
Height (in inches) of each facet. See also: aspect.
方面:标量,可选
Aspect ratio of each facet, so that aspect * height gives the width of each facet in inches.
因此,如果您希望最终的图形尺寸为12x12,并且有10个子图,则需要height = 12/10 = 1.2
和width = aspect * height
或aspect = width/height = 12/1.2 = 10
因此,您需要使用以下方法创建FacetGrid:
g = sns.FacetGrid(df, row="g", hue="g", aspect=10, height=1.2, palette=pal)