question about explicit tick labels

Hi All,

I’m trying to create a set of strip charts so that I can see the relationships between a large number of time series. I’d like to label the y-axis with a name on the left side and a value/percentile on the right hand side. I can get the names on the left axis, and it looks very nice (yay Matplotlib!). When I try to the code below I don’t get the output I’d like. None of the explicit tick labels that I’m setting make it to the display, and also the 3 charts on the page aren’t kept separate (left tick labels from chart 132 hit the right tick labels from chart 131). Any suggestions very appreciated.

import numpy as np

import matplotlib.pyplot as plt

nameN = 25

obsN = 50

names = [“foo%d” % x for x in range(nameN)]

vols = np.random.uniform(0.2, 0.45, nameN)

labels = [‘ValA’, ‘ValB’, ‘ValC’]

d1 = np.random.normal(0,1, obsN*nameN).reshape(obsN, -1)*vols

d2 = np.random.normal(0,1, obsN*nameN).reshape(obsN, -1)*vols

d3 = np.random.normal(0,1, obsN*nameN).reshape(obsN, -1)*vols

f = 0.45

fig = plt.figure()

for label, dset, ax_id in zip(labels, (d1, d2, d3), (131, 132, 133)):

ax = fig.add_subplot(ax_id)

for i in range(len(names)):

mx = np.max(dset[:,i])

mn = np.min(dset[:,i])

y = i + dset[:,i]2f/(mx - mn) - f*(mx + mn)/(mx - mn) + 1

y_last = y[-1]*np.ones_like(y)

x = np.arange(obsN)

ax.fill_between(x, y_last, y)

ax.set_ylim((0, nameN + 1))

ax.set_yticks(range(1, nameN + 1))

ax.set_title(label, fontsize=10)

for tk, nm in zip(ax.yaxis.get_major_ticks(), list(reversed(names))):

tk.tick1On = False

tk.tick2On = False

tk.label1On = True

tk.label2On = True

tk.set_label1(nm)

tk.set_label2("%.1f\n(%.1f tile)" % (36.2, 98.6))

#ytickNames = ax.set_yticklabels(list(reversed(names)), rotation = 45, fontsize = 8)

plt.show()

Hi,

I reattached your example in a slightly modified way. For me with current svn
it does its job. The key points are that I introduced a twin-axes and used
subplots_adjust(wspace=0.6) to extend the horizontal space between the
subplots.

Does this help you?

Kind regards
Matthias

question_about_explicit_tick_labels.py (1.45 KB)

···

On Sunday 29 November 2009 04:17:39 Peter Williams wrote:

Hi All,
I'm trying to create a set of strip charts so that I can see the
relationships between a large number of time series. I'd like to label the
y-axis with a name on the left side and a value/percentile on the right
hand side. I can get the names on the left axis, and it looks very nice
(yay Matplotlib!). When I try to the code below I don't get the output I'd
like. None of the explicit tick labels that I'm setting make it to the
display, and also the 3 charts on the page aren't kept separate (left tick
labels from chart 132 hit the right tick labels from chart 131). Any
suggestions very appreciated.

import numpy as np
import matplotlib.pyplot as plt

nameN = 25
obsN = 50

names = ["foo%d" % x for x in range(nameN)]
vols = np.random.uniform(0.2, 0.45, nameN)

labels = ['ValA', 'ValB', 'ValC']
d1 = np.random.normal(0,1, obsN*nameN).reshape(obsN, -1)*vols
d2 = np.random.normal(0,1, obsN*nameN).reshape(obsN, -1)*vols
d3 = np.random.normal(0,1, obsN*nameN).reshape(obsN, -1)*vols

f = 0.45
fig = plt.figure()
for label, dset, ax_id in zip(labels, (d1, d2, d3), (131, 132, 133)):

    ax = fig.add_subplot(ax_id)

    for i in range(len(names)):

        mx = np.max(dset[:,i])
        mn = np.min(dset[:,i])
        y = i + dset[:,i]*2*f/(mx - mn) - f*(mx + mn)/(mx - mn) + 1
        y_last = y[-1]*np.ones_like(y)
        x = np.arange(obsN)
        ax.fill_between(x, y_last, y)

    ax.set_ylim((0, nameN + 1))
    ax.set_yticks(range(1, nameN + 1))
    ax.set_title(label, fontsize=10)

    for tk, nm in zip(ax.yaxis.get_major_ticks(), list(reversed(names))):
        tk.tick1On = False
        tk.tick2On = False
        tk.label1On = True
        tk.label2On = True
        tk.set_label1(nm)
        tk.set_label2("%.1f\n(%.1f tile)" % (36.2, 98.6))

    #ytickNames = ax.set_yticklabels(list(reversed(names)), rotation = 45,
fontsize = 8)

plt.show()