Hi John, I added one line that shows the problem. If you

    > do a set_xticks() first, then the usual ([]) doesn't
    > blank them. Here's code that should suppress the xticks
    > for all but the bottom-most graphs in each column. It
    > works if you comment out the set_xticks line (HERE HERE
    > HERE).

Hi Charles,

As an aside, you'll be interested in these super secret undocumented
methods of the Subplot class, which I implemented so I wouldn't have
to do the if i % COLS == 1 tricks that I came to know and love in
matlab. I too find myself making lots-o-subplots and blanking out the

Subplot methods:

    def is_first_col(self):
    def is_first_row(self):
    def is_last_row(self):
    def is_last_col(self):

which enables you to write your loop

for i in range(1,NUMPLOTS+1):
    ax = subplot (ROWS, COLS, i)
    title('Simple ' + str(i))
    if ax.is_first_col(): ax.set_ylabel('voltage (mV)')
    else: ax.set_yticklabels ([])

    if ax.is_last_row(): ax.set_xlabel('time (s)')
    else: ax.set_xticklabels ([])

Now onto your problem. Thanks for the example script. I am not sure
which version of matplotlib you are working with, but it appears there
is a clear bug in Axis.set_ticklabels in the part which reads

        for s, label in zip(self._ticklabelStrings, self._ticklabels):

when len(self._ticklabelStrings) is less than len(self._ticklabels),
the label text doesn't get updated. Duh!

Something like this should work better. At least with
matplotlib-0.32a it handles your example

    def set_ticklabels(self, ticklabels, *args, **kwargs):
        Set the text values of the tick labels. ticklabels is a
        sequence of strings. Return a list of AxisText instances
        ticklabels = ['%s'%l for l in ticklabels]
        self._ticklabelStrings = ticklabels
        override = {}
        override = backends._process_text_args(override, *args, **kwargs)

        Nnew = len(self._ticklabelStrings)
        existingLabels = self.get_ticklabels()
        for i, label in enumerate(existingLabels):
            if i<Nnew: label.set_text(self._ticklabelStrings[i])
            else: label.set_text('')
        return existingLabels

    > Is this comment better for -users or -devel? Or bug
    > tracking?

I think users, since my answer includes a *possible* fix which others
may find useful. Let me know how this works for you; I'll take a
closer look on Thurs when I have some breathing room again.


Hi John,

The patch worked for me. :slight_smile:

JH: def is_last_row(self):

Nice, but maybe not enough. If the plots don't fill the bottom row, (say 7
plots on a 3x3 grid), it'll leave some columns with no xticklabels. We'd
need something like
But that would require knowing how many subplots there are, which subplot
doesn't do, and probably shouldn't.



Charles R. Twardy www.csse.monash.edu.au/~ctwardy
Monash University sarbayes.org
Computer Sci. & Software Eng.
+61(3) 9905 5823 (w) 5146 (fax)