2015-01-27 4 views
0

Я пытаюсь дублировать ось y так, чтобы она отображалась как на левой, так и на правой стороне моего графика (одинаковая шкала с каждой стороны). Я верю, что правильный способ сделать это - с помощью близкого метода, но я не могу обойти его. Вот мой текущий код:Создание одинаковых осей с matplotlib twiny

import matplotlib as mpl 
mpl.use('Agg') 
import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 

def bar(data_df, 
    colour_df=None, 
     method='default', 
     ret_obj=False): 
    height = len(data_df.columns)*4 
    width = len(data_df.index)/4 
    ind = np.arange(len(data_df.index)) 
    dat = data_df[data_df.columns[0]] 
    bar_width = 0.85 
    fig, ax = plt.subplots(figsize=(width,height)) 
    ax1 = ax.bar(ind,dat,bar_width,color='y',log=True) 
    ax2 = ax1.twiny() 
    ax.tick_params(bottom='off', top='off', left='on', right='on') 
    plt.xticks(np.arange(len(data_df.index)) + bar_width, 
       data_df.index, rotation=67,ha='right') 
    ylab = 'Region Length (base pairs, log10)' 
    figname = 'bar' + method + '.png' 
    if ret_obj==False: 
     fig.savefig(figname,bbox_inches='tight',dpi=250) 
     print "Output figure:", figname 
     plt.close() 
    if ret_obj==True: 
     return fig 

который возвращает ошибку при вынесший dataframe:

AttributeError: 'BarContainer' object has no attribute 'twiny' 

Посмотрев в него немного дальше, я считаю, что использование host/parasite methods также будет работать, но я m немного потерял, как я мог поместить его в мой текущий код. Совет будет с благодарностью оценен!

ответ

1

В этом случае нет необходимости использовать twiny. Достаточно нарисовать этикетки со всех сторон:

bars = ax.bar(ind,dat,bar_width,color='y',log=True) 
ax.tick_params(axis='both', which='both', labelbottom=True, labeltop=True, 
       labelleft=True, labelright=True) 

я получаю следующий результат с фиктивными данными:

df = pd.DataFrame({"a": np.logspace(1,10,20)}) 
bar(df) 

plot

+0

Awesome, веселит @cel. Он выбивает ярлык оси ylab, предположим, что я должен назвать это по-другому? –

+1

@s_boardman, Похоже, что вы не установили метку в своем коде. Добавление 'ax.set_ylabel (ylab)', похоже, работает нормально. Вы не хотите иметь это с обеих сторон, не так ли? – cel

+0

этот код действительно работал для предыдущей версии. Но использование «ax.set_ylabel()» частично решает проблему для меня. Еще раз спасибо! - Да, обе стороны были бы идеальны, при необходимости могут справиться с левыми. –

Смежные вопросы