2017-04-09 56 views
2

我想添加另一个颜色条到我使用AxesGrid工具包的情节。例如,我在左边添加一个使用ImageGrid的彩条轴,然后手动在右边添加另一个。这里有一个简单的例子:matplotlib axesgrid - 额外的颜色条?

f = plt.figure(1) 
grid = ImageGrid(f, 111, # similar to subplot(111) 
       nrows_ncols=(2, 2), 
       axes_pad=0.01, 
       add_all=True, 
       cbar_location="left", 
       label_mode='L', 
       cbar_mode="edge", 
       cbar_size="3%", 
       cbar_pad="2%", 
       ) 
for i in range(3): 
    m = grid[i].matshow(np.arange(100).reshape((10, 10))) 
plt.colorbar(m, grid.cbar_axes[0]) 
m = grid[3].matshow(np.arange(100).reshape((10, 10)), cmap='plasma') 
plt.colorbar(m, shrink=0.5, anchor=(0, 0)) 
plt.show() 

如何使新的颜色条与网格中其中一个子图的位置完全匹配?我至少设法使用缩小和锚点来固定尺寸和y位置......但是如果我尝试考虑子图之间的填充,并且它们是矩形而不是方形,它也会变得有点复杂......

enter image description here

+0

我不清楚你想达到什么目的。可以用许多不同的方式来解释句子“使新颜色条与网格中的其中一个子图的位置完全匹配”。我认为最好清楚描述你所展示的情节有什么问题。左边的颜色条是否在你想要的位置?您想在哪里放置正确的颜色条?你想让它对齐到哪个位置? '完全匹配意味着它有一个正方形的形状。这是你想要的吗?总共需要多少个颜色条? – ImportanceOfBeingErnest

+0

我想在左边有一个颜色条。而且我想要在另一个右侧的方向上与左侧的一个相同 - 与其中一个子图相对应。不是最重要的,就像现在一样,但在它旁边。 – Phlya

+0

我不认为使用AxesGrid有一个好的解决方案,因为它只允许绘图一侧的子图。我想你想使用AxesGrid的原因是你想避免图之间的间距?但是,如果您可以放弃使用AxesGrid的要求,那么解决方案可能是使用正常的子图。 – ImportanceOfBeingErnest

回答

2

一种选择是根据其中一个轴的位置手动放置色条轴。为此,首先需要绘制画布,以便知道位置。然后可以根据图像坐标创建一个新的坐标轴。这个新的轴将作为彩条轴。

import matplotlib.pyplot as plt 
import numpy as np 
from mpl_toolkits.axes_grid1 import ImageGrid 

fig = plt.figure(1) 
grid = ImageGrid(fig, 111, # similar to subplot(111) 
       nrows_ncols=(2, 2), 
       axes_pad=0.01, 
       add_all=True, 
       cbar_location="left", 
       label_mode='L', 
       cbar_mode="edge", 
       cbar_size="3%", 
       cbar_pad="2%", 
       ) 
for i in range(3): 
    m = grid[i].matshow(np.arange(100).reshape((10, 10))) 
plt.colorbar(m, grid.cbar_axes[0]) 
m = grid[3].matshow(np.arange(100).reshape((10, 10)), cmap='plasma') 

# first draw the figure, such that the axes are positionned 
fig.canvas.draw() 
#create new axes according to coordinates of image plot 
trans = fig.transFigure.inverted() 
g3 =grid[3].bbox.transformed(trans) 
pos = [g3.x1 + g3.width*0.02, g3.y0, g3.width*0.03, g3.height ] 
cax = fig.add_axes(pos) #l,b,w,h 
# add colorbar to new axes 
plt.colorbar(m, cax=cax) 


plt.show() 

enter image description here

此方法依赖于轴线的在图中的位置,一旦改变,例如因为这个数字被重新调整,所以不可能发生的事情可能会发生。

另一种不依赖绘制坐标的方法是(错误地)使用插入轴并将插入点放置在轴的外部。通过这种方式,插图所在的坐标就是坐标轴,所以颜色条会根据坐标轴改变其位置。

from mpl_toolkits.axes_grid1.inset_locator import inset_axes 

cax = inset_axes(grid[3], "3%", "100%", loc=3, bbox_to_anchor=(1.02,0,1,1), 
       bbox_transform=grid[3].transAxes, borderpad=0.0) 
plt.colorbar(m, cax=cax) 
+0

谢谢!所以基本上,为颜色条添加轴应该是最后一件事情,以防万一有什么改变了图形的布局? – Phlya

+0

我发现了一个更好的方法,请参阅更新的答案。 – ImportanceOfBeingErnest

+0

谢谢,我刚刚找到了inset_axes,并正在尝试它!我现在就试一试。 – Phlya