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