多个子图用于个性化

时间:2013-10-11 09:46:50

标签: python numpy matplotlib plot subplot

我使用以下方法制作了一些子图:

fig, ax = plt.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

然后,我想个性化子图,例如:

plt.subplots_adjust(hspace = 0., wspace= 0.)

但是,我也希望个性化刻度,例如删除其中一些子图的刻度和标签。 我怎么能这样做?

问题是,在定义之后,ax是一个numpy数组:我不知道那么多,我知道的是不可能使用属性(比如,ax[0].set_yticks([]))。 / p>

2 个答案:

答案 0 :(得分:3)

如果您创建一个二维图形阵列,例如用:

>>> fig, axarray = plt.subplots(3, 4)

然后axarray是一个2D对象数组,每个元素都包含matplotlib.axes.AxesSubplot

>>> axarray.shape
(3, 4)

问题在于,当您索引axarray[0]时,您实际上正在索引该数组的整行,其中包含多个轴:

>>> axarray[0].shape
(4,)

>>> type(axarray[0])
numpy.ndarray

但是,如果您对数组中的单个元素进行寻址,则可以按正常方式设置其属性:

>>> type(axarray[0,0])
matplotlib.axes.AxesSubplot

>>> axarray[0,0].set_title('Top left')

设置数组中所有轴的属性的一种快速方法是在轴数组上循环一个平面迭代器:

for ii,ax in enumerate(axarray.flat):
    ax.set_title('Axis %i' %ii)

你可以做的另一件事是将数组中的轴“解包”成一个单独轴对象的嵌套元组,尽管当你处理大量的行/列时这会有点尴尬:

fig, ((ax1, ax2, ax3, ax4), (ax5, ax6, ax7, ax8), (ax9, ax10, ax11, ax12)) \
    = plt.subplots(3,4)

答案 1 :(得分:1)

使用此方法时:

fig, ax = plt.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

你有两个选择,就像你建议的那样调用数组ax的元素(但是你需要使用两个索引或者将它展平):

ax[0][0].plot(...
ax.flat[0].plot(...

如果循环遍历图,则第二行非常有用。或者您可以通过以下方式进行修改:

fig, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = plt.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

这将取决于你的用例哪个更好,如果有可能我会改变子图的数量,我通常会调用数组ax