You need to define your own transform. And the best way is to read
through the transforms.py. Here is a modified version of your example
that uses a custom transform.

However, often you may need to use a custom locator also for this kind
of transform.

HTH,

-JJ

from matplotlib.transforms import Transform, BlendedGenericTransform,
IdentityTransform

c = 3.e2

class Freq2WavelengthTransform(Transform):
    input_dims = 1
    output_dims = 1
    is_separable = False
    has_inverse = True

    def transform(self, tr):
        return c/tr

    def inverted(self):
        return Wavelength2FreqTransform()


class Wavelength2FreqTransform(Freq2WavelengthTransform):
    def inverted(self):
        return Freq2WavelengthTransform()


import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid.parasite_axes import SubplotHost


aux_trans = BlendedGenericTransform(Freq2WavelengthTransform(),
IdentityTransform())

fig = plt.figure(2)

ax_GHz = SubplotHost(fig, 1,1,1)
fig.add_subplot(ax_GHz)
ax_GHz.set_xlabel("Frequency (GHz)")

import numpy as np
xvals = np.arange(199.9, 999.9, 0.1)
#make some test data
data = np.sin(0.03*xvals)

ax_mm = ax_GHz.twin(aux_trans)
ax_mm.set_xlabel('Wavelength (mm)')
ax_mm.set_viewlim_mode("transform")
ax_mm.axis["right"].toggle(ticklabels=False)

ax_GHz.plot(xvals, data)
ax_GHz.set_xlim(200, 1000)

plt.draw()
plt.show()




On Wed, May 26, 2010 at 7:24 AM, Sarah Graves <sf...@cam.ac.uk> wrote:
> Hi,
>
> I've made a matplotlib plot with frequency  on the x-axis, and I would
> like to add an additional x-axis at the top that is measured in
> wavelength , i.e. wavelength = 3e8 / frequency
>
> Is there anyway to do this transformation automatically in matplotlib?
>
> I tried to give a transformation argument to the ax.twin() axes_grid
> command, as shown in the axes_grid parasite_simple2.py example,  but
> I've not managed to get this to work with a transformation more
> complicated than a scaling by a constant factor. I tried looking at the
> matplotlib.transforms documentation but I couldn't see a way to do this
> transformation there. I'm not sure I understood it very well though. I
> can't simply use the twiny( ) command and manually set the limits as the
> wavelength ticks will not occur at the points corresponding to the
> correct frequency.
>
> At the moment I am using the twin() command, and then I  manually choose
> a sensible set of tickvalues  I want in wavelength units,  calculate the
> corresponding frequency values, and then set the tick locations to be
> the frequency values and the tick labels to be the wavelength values.
>
> Thanks,
> Sarah
>
> Example code:
> import numpy as np
> import matplotlib
> from mpl_toolkits.axes_grid1.parasite_axes import SubplotHost
> import matplotlib.pyplot as plt
> #create xaxis range of values -- 200 -- 1000 Ghz
> xvals = np.arange(199.9, 999.9, 0.1)
> #make some test data
> data = np.sin(0.03*xvals)
> #set up the figure
> fig = plt.figure()
> ax = SubplotHost(fig, 111)
> fig.add_subplot(ax)
> ax2 = ax.twin()
> #plot data
> ax.plot(xvals, data)
> ax.set_xlim(200.0, 1000.0)
> #set up ax2 with chosen values
> wavelength_labels = np.array([0.4, 0.6, 0.8,1.0,1.2, 1.4]) #in mm
> frequency_points = 3e2/wavelength_labels #in GHz
> ax2.set_xticks(frequency_points)
> ax2.set_xticklabels(wavelength_labels)
> ax2.set_xlabel('Wavelength (mm)')
> ax.set_xlabel('Frequency (GHz)')
> plt.show()
>
>
>
>
>
> ------------------------------------------------------------------------------
>
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to