Brilliant, that worked perfectly!

Thanks very much,
Sarah

Jae-Joon Lee wrote:
> 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