Matplotlib - 与`colorbar`相同的填充方式
有没有办法保持和colorbar
一样的边距,但不显示任何colorbar
呢?
为什么要这样做呢?其实,这样可以让我在从一个没有颜色阴影信息的图表切换到一个使用了colorbar
的图表时,产生一种视觉效果。
下面是一个起始代码,来自于这个帖子。
from matplotlib.pylab import *
import matplotlib.cm as cm
min_val = 0
max_val = 1
# See : http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps
my_cmap = cm.get_cmap('jet') # or any other one
norm = matplotlib.colors.Normalize(min_val, max_val) # the color maps work for [0, 1]
cmmapable = cm.ScalarMappable(norm, my_cmap)
cmmapable.set_array(range(min_val, max_val))
figure()
ax = gca()
cbar = colorbar(cmmapable, ticks=[0, 1])
cbar.ax.set_yticklabels(['Min', 'Max'])
show()
1 个回答
1
我理解的是,你想做一个演示,有两张幻灯片。第一张幻灯片上有一个图,但没有颜色条;第二张幻灯片上是同样的图,但有颜色条。这两张幻灯片上的图要保持一样的大小,这样在切换幻灯片时,图就不会跳动或者变形。
设置颜色图会改变原来的 Axes
实例的大小。你可以用 ax.get_position()
来获取调整大小后的 Axes
的边界框。它会返回一个边界框:Bbox(array([[ 0.125, 0.1 ], [ 0.745, 0.9 ]]))
,这个框给出了左边、底边、右边和顶边的位置。我觉得可以稍微偷懒一下,直接用 ax._position.bounds
,这样可以得到一个矩形(左边缘、底边缘、宽度、高度),你可以直接用它来创建新的坐标轴,下面的代码就是这样做的。
import matplotlib
import matplotlib.pyplot as plt
min_val = 0
max_val = 1
my_cmap = matplotlib.cm.get_cmap('jet')
norm = matplotlib.colors.Normalize(min_val, max_val)
cmmapable = matplotlib.cm.ScalarMappable(norm, my_cmap)
cmmapable.set_array(range(min_val, max_val))
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
cbar = plt.colorbar(cmmapable, ax = ax1, ticks=[0, 1])
cbar.ax.set_yticklabels(['Min', 'Max'])
# gives bounding box with left, right, bottom, top
print(ax1.get_position())
# gives rectangle with left, bottom, width, height
print(ax1._position.bounds)
fig2 = plt.figure()
ax2 = fig2.add_axes(ax1._position.bounds)
plt.show()
更新:在上面的解决方案中没有颜色条,而下面的解决方案中有颜色条,但你把它设置成白色,并且去掉了标签和边框。如果图的背景颜色不是白色,你会看到一个白色的矩形,原本应该是颜色条的位置。
import matplotlib
import matplotlib.pyplot as plt
min_val = 0
max_val = 1
my_cmap = matplotlib.cm.get_cmap('jet')
norm = matplotlib.colors.Normalize(min_val, max_val)
cmmapable = matplotlib.cm.ScalarMappable(norm, my_cmap)
cmmapable.set_array(range(min_val, max_val))
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
# set opacity to 0
cbar = plt.colorbar(cmmapable, ax = ax1, ticks=[0, 1], alpha = 0)
# remove the tick labels
cbar.ax.set_yticklabels(['', ''])
# set the tick length to 0
cbar.ax.tick_params(axis = 'y', which = "both", length = 0)
# set everything that has a linewidth to 0
for a in cbar.ax.get_children():
try:
a.set_linewidth(0)
except:
pass
plt.show()