我有这样的代码,它绘制了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
这里有什么问题?为什么第一个子图在x轴上浮动或飙升?
答案 0 :(得分:2)
您可能希望使用面向对象的API设置轴对象本身的标题和限制。这意味着您可以在单个子图上控制标题等,这在使用多个子图时比plt.title
更容易:
创建图fig, ax = plt.subplots(nrows = 2,ncols = 1)
时,您已经拥有了轴对象。因此,请使用set_title
和set_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