如何使用 colorbar 使 bbox 在 3 个边上保持紧密并在不同的绘图中保持不变
How can I keep the bbox tight on 3 sides and constant for different plots using colorbar
我需要不同变量的雷达图像图具有相同的大小,以便我可以在网页上垂直对齐它们。
单位不同,颜色条(包括刻度标签和标签)的宽度相应变化,因为一些颜色条的刻度值是负数,只需要比其他颜色条多 space。然而,在 savefig 命令中使用 bbox_inches="tight" 选项会导致不同的图形宽度。如果我嵌入图表,它们会调整大小,但图中绘制数据的方框也会调整,并且方框不再对齐。
有没有一种方法可以防止 bbox 在一侧变紧,但在设置固定图像宽度的同时保持另一侧变紧?
这是我使用的代码的简化版本:
import numpy as np
import matplotlib.pyplot as plt
import pylab
method=1
fs=12
height=600
width=3200
my_dpi=200
x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
z=numpy.random.rand(32,100)
else:
z=-3*numpy.random.rand(32,100)
plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
plt.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
cbar=plt.colorbar()
plt.ylabel('Height above Radar [m]',fontsize=fs)
plt.xlabel('Time UTC',fontsize=fs)
plt.title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])
cbar.set_label('Reflectivity [dBZ]', rotation=90)
plotname="somename"+str(method)+".png"
pylab.savefig(plotname,dpi=my_dpi,bbox_inches='tight')
PS: 使用子图不是一个选项,因为实际网页将使用 JavaScript 并且图将单独更改。
这可能不是最优雅的解决方案,但您可以将颜色栏的刻度标签右对齐,并提供填充,以免它们与您的颜色栏冲突。
需要调整填充,以便无论数据范围如何都能正常工作
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
method=1
fs=12
height=600
width=3200
my_dpi=200
x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
z=np.random.rand(32,100)
else:
z=-3*np.random.rand(32,100)
fig = plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
ax = fig.add_subplot(111)
a = ax.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
ax.set_ylabel('Height above Radar [m]',fontsize=fs)
ax.set_xlabel('Time UTC',fontsize=fs)
ax.set_title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])
cbar = plt.colorbar(a)
cbar.set_label('Reflectivity [dBZ]', rotation=90)
for T in cbar.ax.yaxis.get_ticklabels():
T.set_horizontalalignment('right')
cbar.ax.yaxis.set_tick_params(pad=30)
plotname="somename"+str(method)+".png"
plt.savefig(plotname,dpi=my_dpi, bbox_inches='tight')
我找到了 i.m.o 的解决方案。比 Diziet Asahi 的回答更优雅(无论如何谢谢。你的回答是这个解决方案的灵感)。我改编自 here.
它不是插入一个 pad 并将颜色条标记标签右对齐,而是手动插入颜色条标签作为文本,这使每个变量的颜色条标签保持在相同位置:
plt.text(1.065, .5, cbar_title, fontsize=fs,
verticalalignment='center',rotation = 90, transform = ax.transAxes)
此外,我在 plt.colorbar()
命令中添加了 pad=0.01
,使颜色条更靠近绘图,看起来更好一些。
完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
method=2
fs=12
height=600
width=3200
my_dpi=200
x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
z=np.random.rand(32,100)
else:
z=-3*np.random.rand(32,100)
fig = plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
ax = fig.add_subplot(111)
a = ax.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
ax.set_ylabel('Height above Radar [m]',fontsize=fs)
ax.set_xlabel('Time UTC',fontsize=fs)
ax.set_title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])
cbar = plt.colorbar(a,pad=0.01)
cbar_title='Reflectivity [dBZ]'
plt.text(1.065, .5, cbar_title, fontsize=fs, verticalalignment='center',
rotation = 90, transform = ax.transAxes)
plotname="somename"+str(method)+".png"
plt.savefig(plotname,dpi=my_dpi, bbox_inches='tight')
可以看到结果here.
我需要不同变量的雷达图像图具有相同的大小,以便我可以在网页上垂直对齐它们。
单位不同,颜色条(包括刻度标签和标签)的宽度相应变化,因为一些颜色条的刻度值是负数,只需要比其他颜色条多 space。然而,在 savefig 命令中使用 bbox_inches="tight" 选项会导致不同的图形宽度。如果我嵌入图表,它们会调整大小,但图中绘制数据的方框也会调整,并且方框不再对齐。
有没有一种方法可以防止 bbox 在一侧变紧,但在设置固定图像宽度的同时保持另一侧变紧?
这是我使用的代码的简化版本:
import numpy as np
import matplotlib.pyplot as plt
import pylab
method=1
fs=12
height=600
width=3200
my_dpi=200
x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
z=numpy.random.rand(32,100)
else:
z=-3*numpy.random.rand(32,100)
plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
plt.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
cbar=plt.colorbar()
plt.ylabel('Height above Radar [m]',fontsize=fs)
plt.xlabel('Time UTC',fontsize=fs)
plt.title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])
cbar.set_label('Reflectivity [dBZ]', rotation=90)
plotname="somename"+str(method)+".png"
pylab.savefig(plotname,dpi=my_dpi,bbox_inches='tight')
PS: 使用子图不是一个选项,因为实际网页将使用 JavaScript 并且图将单独更改。
这可能不是最优雅的解决方案,但您可以将颜色栏的刻度标签右对齐,并提供填充,以免它们与您的颜色栏冲突。
需要调整填充,以便无论数据范围如何都能正常工作
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
method=1
fs=12
height=600
width=3200
my_dpi=200
x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
z=np.random.rand(32,100)
else:
z=-3*np.random.rand(32,100)
fig = plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
ax = fig.add_subplot(111)
a = ax.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
ax.set_ylabel('Height above Radar [m]',fontsize=fs)
ax.set_xlabel('Time UTC',fontsize=fs)
ax.set_title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])
cbar = plt.colorbar(a)
cbar.set_label('Reflectivity [dBZ]', rotation=90)
for T in cbar.ax.yaxis.get_ticklabels():
T.set_horizontalalignment('right')
cbar.ax.yaxis.set_tick_params(pad=30)
plotname="somename"+str(method)+".png"
plt.savefig(plotname,dpi=my_dpi, bbox_inches='tight')
我找到了 i.m.o 的解决方案。比 Diziet Asahi 的回答更优雅(无论如何谢谢。你的回答是这个解决方案的灵感)。我改编自 here.
它不是插入一个 pad 并将颜色条标记标签右对齐,而是手动插入颜色条标签作为文本,这使每个变量的颜色条标签保持在相同位置:
plt.text(1.065, .5, cbar_title, fontsize=fs,
verticalalignment='center',rotation = 90, transform = ax.transAxes)
此外,我在 plt.colorbar()
命令中添加了 pad=0.01
,使颜色条更靠近绘图,看起来更好一些。
完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
method=2
fs=12
height=600
width=3200
my_dpi=200
x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
z=np.random.rand(32,100)
else:
z=-3*np.random.rand(32,100)
fig = plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
ax = fig.add_subplot(111)
a = ax.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
ax.set_ylabel('Height above Radar [m]',fontsize=fs)
ax.set_xlabel('Time UTC',fontsize=fs)
ax.set_title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])
cbar = plt.colorbar(a,pad=0.01)
cbar_title='Reflectivity [dBZ]'
plt.text(1.065, .5, cbar_title, fontsize=fs, verticalalignment='center',
rotation = 90, transform = ax.transAxes)
plotname="somename"+str(method)+".png"
plt.savefig(plotname,dpi=my_dpi, bbox_inches='tight')
可以看到结果here.