从 matplotlib 保存图,使图居中

Save plot from matplotlib so that plot is centered

我正在尝试使用 matplotlib 在 Python 中绘制绘图。具体来说,我使用 contourf(Xm,Ym,Zm)colorbar 并使用 figX.savefig('name') 保存绘图,Xm,Ym,Zm 是一些网格。

颜色条靠近实际图,使用 savefig 中的默认参数,图偏离中心。

如何制作图形,使生成的图像文件以实际图的中心为中心。最好的情况;调整大小,这样颜色条等就不会被切断。

我似乎无法在 savefig() 的参数中找到任何我可以使用的东西,而且根本不知道该怎么做。

一些代码:

import matplotlib.pyplot as plt
import numpy as np

# make data
Xm, Ym = np.meshgrid(np.linspace(-3, 3, 256), np.linspace(-3, 3, 256))
Zm = (1 - Xm/2 + Xm**5 + Ym**3) * np.exp(-Xm**2 - Ym**2)
levels = np.linspace(Zm.min(), Zm.max(), 7)

# plot
fig, ax = plt.subplots()

cp = ax.contourf(Xm, Ym, Zm, levels=levels)

cbar = fig.colorbar(cp)

#plt.show()

fig.savefig('plots/contour-plot.png')

红叉应该等于紫叉:

如评论中所述,您可以使用 GridSpecs:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

#generate data
import numpy as np
Xm, Ym = np.meshgrid(np.linspace(-3, 3, 256), np.linspace(-3, 3, 256))
Zm = (1 - Xm/2 + Xm**5 + Ym**3) * np.exp(-Xm**2 - Ym**2)
levels = np.linspace(Zm.min(), Zm.max(), 7)

fig = plt.figure(figsize=(10,8))
#define subplot width ratios 
gs = GridSpec(1, 3, width_ratios=[1, 20, 1])

#leave first axis gs[0] empty for symmetry
#add middle plot for contour
plt_ax = fig.add_subplot(gs[1])
cp = plt_ax.contourf(Xm, Ym, Zm, levels=levels)

#add colorbar
cbar_ax = fig.add_subplot(gs[2])
cbar = fig.colorbar(cp, cax=cbar_ax)

#fig.savefig('test.png')

plt.show()

示例输出:

更新 正如您现在介绍的不同图形大小的问题:通过创建 subGridSpec,可以将相同的逻辑应用于颜色条的高度。如果我们想确保不同图形尺寸比例的外观一致,我们必须在创建 GridSpecs 时考虑到这一点。

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec, GridSpecFromSubplotSpec

#generate data
import numpy as np
Xm, Ym = np.meshgrid(np.linspace(-3, 3, 256), np.linspace(-3, 3, 256))
Zm = (1 - Xm/2 + Xm**5 + Ym**3) * np.exp(-Xm**2 - Ym**2)
levels = np.linspace(Zm.min(), Zm.max(), 7)

width = 20
height = 8
fig = plt.figure(figsize=(width, height))
#define subplot width ratios 
gs_main = GridSpec(1, 3, width_ratios=[1, 2*width, 1], wspace=1/width)

#add middle plot for contour
plt_ax = fig.add_subplot(gs_main[1])
cp = plt_ax.contourf(Xm, Ym, Zm, levels=levels)

#add colorbar to middle subGridSpec on the right
gs_cbar = GridSpecFromSubplotSpec(3, 1, subplot_spec=gs_main[2], height_ratios=[1, 8, 1])
cbar_ax = fig.add_subplot(gs_cbar[1])
cbar = fig.colorbar(cp, cax=cbar_ax)

#fig.savefig('test.png')

plt.show()

这样可以使颜色栏的宽度、它与主图的距离以及它的相对高度在一系列图形尺寸范围内保持不变。