autoAxis1 = ax8i[1].axis() #ax8i[1] is the axis where we want the border
import matplotlib.patches as ptch
rec = ptch.Rectangle((autoAxis1[0]-12,autoAxis1[2]-30),(autoAxis1[1]-
autoAxis1[0])+18,(autoAxis1[3]-
autoAxis1[2])+35,fill=False,lw=2,edgecolor='cyan')
rec = ax8i[1].add_patch(rec)
rec.set_clip_on(False)
import seaborn as sns
# load sample dataframe and convert it to a long form
df = sns.load_dataset('geyser')
df = df.melt(id_vars='kind', var_name='cat', value_name='time')
# plot the catplot
g = sns.catplot(data=df, x='kind', y='time', col='cat')
# extract the figure object
fig = g.figure
# use standard matplotlib figure methods
fig.patch.set_linewidth(10)
fig.patch.set_edgecolor('pink') # substitute 'k' for black
轴边框
g = sns.catplot(data=df, x='kind', y='time', col='cat')
# extract and flatten the numpy array of axes
axes = g.axes.flat
# iterate through each axes and increase the linewidth and add a color
for ax in axes:
ax.patch.set_linewidth(10)
ax.patch.set_edgecolor('pink')
图形和轴组合边框
g = sns.catplot(data=df, x='kind', y='time', col='cat')
axes = g.axes.flat
for ax in axes:
ax.patch.set_linewidth(5)
ax.patch.set_edgecolor('k')
fig = g.figure
fig.patch.set_linewidth(10)
fig.patch.set_edgecolor('purple')
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 1)
# add a bit more breathing room around the axes for the frames
fig.subplots_adjust(top=0.85, bottom=0.15, left=0.2, hspace=0.8)
fig.patch.set_linewidth(10)
fig.patch.set_edgecolor('cornflowerblue')
# When saving the figure, the figure patch parameters are overwritten (WTF?).
# Hence we need to specify them again in the save command.
fig.savefig('test.png', edgecolor=fig.get_edgecolor())
# We want to use axis.get_tightbbox to determine the axis dimensions including all
# decorators, i.e. tick labels, axis labels, etc.
# However, get_tightbox requires the figure renderer, which is not initialized
# until the figure is drawn.
plt.ion()
fig.canvas.draw()
for ii, ax in enumerate(axes):
ax.set_title(f'Title {ii+1}')
ax.set_ylabel(f'Y-Label {ii+1}')
ax.set_xlabel(f'X-Label {ii+1}')
bbox = ax.get_tightbbox(fig.canvas.get_renderer())
x0, y0, width, height = bbox.transformed(fig.transFigure.inverted()).bounds
# slightly increase the very tight bounds:
xpad = 0.05 * width
ypad = 0.05 * height
fig.add_artist(plt.Rectangle((x0-xpad, y0-ypad), width+2*xpad, height+2*ypad, edgecolor='red', linewidth=3, fill=False))
fig.savefig('test2.png', edgecolor=fig.get_edgecolor())
plt.show()
3条答案
按热度按时间5rgfhyps1#
I发现了一些非常相似的东西,并以某种方式配置了它的功能。
代码有点复杂,但一旦我们知道Rectangle()中括号的哪一部分在做什么,就很容易得到代码。
ki1q1bka2#
seaborn
是matplotlib
的高级API。对于那些希望在seabornaxes-level函数周围放置边界的人,过程与其他人相同。但是,图级函数需要额外的步骤。matplotlib
方法,但是必须从catplot FacetGrid
中提取figure
和axes
对象,如下所示。'pink'
,以便使用黑色StackOverflow背景的用户可以显示边框。图边框
轴边框
图形和轴组合边框
neekobn83#
地物和轴具有面片属性,即构成背景的矩形。因此,设置图形框架非常简单:
现在斧头是一个更难啃的坚果。我们可以使用与图相同的方法(我认为@jody-klymak建议),然而,补丁只对应于轴限制内的区域,即它不包括刻度标签、轴标签和标题。
然而,axes有一个
get_tightbbox
方法,这就是我们所追求的。然而,使用它也有一些陷阱,如代码注解中所解释的。