2017-04-09 57 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