2017-02-22 11 views
-1

Я пытаюсь динамически масштабировать оси y для каждой строки подзаголовков, поэтому я решил вручную определить ymax для каждого подзаголовка, который я создавал бы с циклом for.Разная шкала y для каждой строки Matplotlib

fig, ax = plt.subplots(3, len(motif.strip()), figsize=(15, 10), sharex=True, sharey=True) 

    for i, s in enumerate(dataw.pos.unique()): 
     for j, r in enumerate(dataw.type.sort_values().unique()): 
      atmp = dataw[(dataw.pos == s) & (dataw.type == r)] 
      btmp = dataw[(dataw.type == r)] 
      ymax = (btmp['values'].values).max() 
      #print(btmp) 
      #print(ymax) 
      tmp = [atmp[atmp['base'] == 'A']['values'].values, 
        atmp[atmp['base'] == 'G']['values'].values, 
        atmp[atmp['base'] == 'T']['values'].values, 
        atmp[atmp['base'] == 'C']['values'].values] 

      ax[j][i].violinplot(tmp) 
      ax[j][i].set_ylim([0, ymax]) 

      #ax[j][i].set(xlabel='base', 
      #    ylabel='values', 
      #    title=s + '--' + r) 

    fig.tight_layout() 

    fig.savefig(str(graph) + ".png") 

То, что я прямо сейчас:

enter image description here

То, что я хотел бы иметь (отметить разные Y оси для каждой строки):

enter image description here

ответ

0

Установка ylim вручную не будет работать в вашем случае sharey=True. Если вы установите значение False, вы можете установить ylim для каждого сюжета (с отдельными y-тиками для каждого сюжета).

Поскольку вам кажется, что для каждого строки вам необходимо рассчитать максимальное значение для каждой строки и установить его вне внутреннего цикла. Затем вы можете скрыть тики для всех, кроме первого графика в каждой строке: ax.set_yticks([]).