2015-10-31 17 views
0

這是此question的後續操作。我感謝maxnoe的幫助。Python:有兩個次軸的插圖

我想添加第二個輔助軸到我的每個子圖,與此example類似,但在一個子圖中。

我試圖用建立我的身材:

fig, ((ax1a, ax2a), (ax3a, ax4a)) = host_subplot(4,4, axes_class=AA.Axes) 

,但我得到TypeError: 'AxesHostAxesSubplot' object is not iterable

ValueError: Illegal argument(s) to subplot: (4, 4) 

是否有可能有一個插曲,其中每個人物有兩個副軸線?

+1

'host_subplot'不是替代'plt.subplots',這是一個完全不同的指令下降。 – MaxNoe

回答

2

plt.subplots是一個方便的功能,一次創建圖形和多個子圖。但是,它的權力是有限的。如果你想創建特殊的軸,你將不得不以「硬」的方式初始化它們。

根據顯示的屬性調整您提到的2x2子圖的網格示例。爲了避免重複代碼,我使用for循環來初始化所有圖並將它們存儲在字典列表中。

from mpl_toolkits.axes_grid1 import host_subplot 
import mpl_toolkits.axisartist as AA 
import matplotlib.pyplot as plt 

subplots = [] 
rows = 2 
columns = 2 

for n in range(rows * columns): 
    host = host_subplot(rows, columns, n + 1, axes_class=AA.Axes) 

    par1 = host.twinx() 
    par2 = host.twinx() 

    offset = 60 

    par2.axis["right"] = par2.get_grid_helper().new_fixed_axis(
     loc="right", 
     axes=par2, 
     offset=(offset, 0), 
    ) 

    par2.axis["right"].toggle(all=True) 

    host.set_xlabel("Distance") 
    host.set_ylabel("Density") 
    par1.set_ylabel("Temperature") 
    par2.set_ylabel("Velocity") 

    subplots.append({ 
     'density': host, 
     'temperature': par1, 
     'velocity': par2, 
    }) 


subplots[0]['density'].plot([1, 2, 3]) 
subplots[2]['temperature'].plot([1, 2, 3]) 
plt.tight_layout() 
plt.savefig('result2.png', dpi=300) 

結果: result

+0

太棒了!我永遠無法自己弄清楚 – Plug4

+0

如果我可以在代碼的某個地方使用'sharex = True',你知道嗎?謝謝 – Plug4

+0

所以你想,同一列中的兩個圖都有'sharex = True'? – MaxNoe