Matplotlib - 与`colorbar`使用的填充相同

时间:2013-03-06 12:00:49

标签: python matplotlib colorbar

有没有办法保持与colorbar使用的填充相同的填充而不会看到任何colobar

为什么?实际上,这将允许我在从没有颜色着色信息的一个绘图传递到使用colobar的一个绘图时做一个视觉效果。

以下是来自this post的一个起始代码。

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 个答案:

答案 0 :(得分: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()