每行Matplotlib的y比例不同

时间:2017-02-22 00:34:05

标签: python matplotlib

我试图动态缩放每一行子图的y轴,所以我想我会用for循环创建每个子图的ymax。

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

1 个答案:

答案 0 :(得分:0)

设置ylim手动无法在您的案例中sharey=True工作。如果将其设置为False,则可以为每个情节设置ylim(每个情节都有单独的y刻度)。

由于您似乎希望每个共享y,因此您必须计算每行的最大值并将其设置在内部循环之外。然后,您可以隐藏除每行中第一个绘图之外的所有刻度:ax.set_yticks([])