如何为seaborn中的子图设置标题和ylims

时间:2018-05-08 11:20:13

标签: python python-3.x pandas matplotlib seaborn

我有这样的代码,它绘制了2个子图。我想为两个子图设置ylim和title,但它只适用于最后一个子图。

   TREATMENTINSTIDs = atg_cg.TREATMENTINSTID.unique()
    sn.set_style('ticks')
    fig, ax = plt.subplots(nrows = 2,ncols = 1)
    fig.set_size_inches(10, 12)
    i = 0
    #plt.title(TREATMENTINSTID)

    for TREATMENTINSTID in TREATMENTINSTIDs:
        plt.title(TREATMENTINSTID)
        plt.ylim(0, 1000)
        sn.violinplot(x="group_type", y="arpu" , hue = 'isSMS',ax=ax[i],cut=0, 
                      data=atg_cg[atg_cg.TREATMENTINSTID == TREATMENTINSTID],inner="quartile", split=True, title = TREATMENTINSTID)
        sn.despine(left=True)
        i = i + 1

enter image description here

这里有什么问题?为什么第一个子图在x轴上浮动或飙升?

1 个答案:

答案 0 :(得分:2)

您可能希望使用面向对象的API设置轴对象本身的标题和限制。这意味着您可以在单个子图上控制标题等,这在使用多个子图时比plt.title更容易:

创建图fig, ax = plt.subplots(nrows = 2,ncols = 1)时,您已经拥有了轴对象。因此,请使用set_titleset_ylim修改标题和ylim的设置。

您的代码变为:

TREATMENTINSTIDs = atg_cg.TREATMENTINSTID.unique()
sn.set_style('ticks')
fig, ax = plt.subplots(nrows=2, ncols=1)
fig.set_size_inches(10, 12)
i = 0
# plt.title(TREATMENTINSTID)

for TREATMENTINSTID in TREATMENTINSTIDs:
    ax[i].set_title(TREATMENTINSTID)
    ax[i].set_ylim(0, 1000)
    sn.violinplot(x="group_type", y="arpu", hue='isSMS', ax=ax[i], cut=0,
                  data=atg_cg[atg_cg.TREATMENTINSTID == TREATMENTINSTID], inner="quartile", split=True,
                  title=TREATMENTINSTID)
    sn.despine(left=True)
    i = i + 1