2016-03-03 329 views
0

我有兩組具有非常不同軸的條形圖中的數據集:一個非常負(-7500),另一個稍微正(+5)。Matplotlib條形圖:將兩個不同的y軸對齊

我怎樣才能讓兩個y軸對齊在0,但仍然是一個很好的大小?使用set_ylim意味着你看不到第二個數據集。

我使用的是當前的代碼:

A165H = [-4915, -7037] 
B167H = [-6927, -4105] 
B186H = [-5597, 0] 
CH =[0, 0] 
ConH = [0, 0] 

# Lists of dS values 

A165S = [6.28,-4.91] 
B167S = [-3.25, 6.7] 
B186S = [3.93, 0] 
CS = [0, 0] 
ConS = [0, 0] 

N1H = [A165H[0], B167H[0], B186H[0], CH[0], ConH[0]] 
N1S = [A165S[0], B167S[0], B186S[0], CS[0], ConS[0]] 
print(N1H) 
print(N1S) 

N2H = [A165H[1], B167H[1], B186H[1], CH[1], ConH[1]] 
N2S = [A165S[1], B167S[1], B186S[1], CS[1], ConS[1]] 


width = 0.35 
fig, ax1 = plt.subplots() 
ind = np.arange(len(N1H)) 
rects1 = ax1.bar(ind, N1H, width, color = 'b') 
ax1.set_xticks(ind+width) 
ax1.set_xticklabels(('A165', 'B167', 'B186', 'C', 'Con')) 
ax1.set_ylabel('dH', color='b') 
for tl in ax1.get_yticklabels(): 
    tl.set_color('b') 


ax2 = ax1.twinx() 
rects2 = ax2.bar(ind + width, N1S, width, color = 'r') 
ax2.set_ylabel('dS', color='r') 
for tl in ax2.get_yticklabels(): 
    tl.set_color('r') 

plt.show() 

這是我的標準圖像

enter image description here

編輯:使用

this questionalign_yaxis()只顯示我的負值第二組數據:

enter image description here

+0

可能重複的[Matplotlib軸有兩個scale共享來源](http://stackoverflow.com/questions/10481990/matplotlib-axis-with-two-scales-shared-origin) – tom

+1

嘗試在該帖子中的第二個答案,你會得到完整的'ylim'(http ://stackoverflow.com/questions/10481990/matplotlib-axis-with-two-scales-shared-origin/26456731# 26456731) – tom

+0

是的,我在編輯後才意識到 – Charlietrypsin

回答

0

如果我在閱讀the other post下我會發現它解決了我的問題adjust_yaxis

對這個問題的答案給出的代碼:

def align_yaxis(ax1, v1, ax2, v2): 
"""adjust ax2 ylimit so that v2 in ax2 is aligned to v1 in ax1""" 
_, y1 = ax1.transData.transform((0, v1)) 
_, y2 = ax2.transData.transform((0, v2)) 
adjust_yaxis(ax2,(y1-y2)/2,v2) 
adjust_yaxis(ax1,(y2-y1)/2,v1) 

def adjust_yaxis(ax,ydif,v): 
    """shift axis ax by ydiff, maintaining point v at the same location""" 
    inv = ax.transData.inverted() 
    _, dy = inv.transform((0, 0)) - inv.transform((0, ydif)) 
    miny, maxy = ax.get_ylim() 
    miny, maxy = miny - v, maxy - v 
    if -miny>maxy or (-miny==maxy and dy > 0): 
     nminy = miny 
     nmaxy = miny*(maxy+dy)/(miny+dy) 
    else: 
     nmaxy = maxy 
     nminy = maxy*(miny+dy)/(maxy+dy) 
    ax.set_ylim(nminy+v, nmaxy+v)