# Aligning a linear and non-linear x-axis

16 views (last 30 days)

Show older comments

I have a spectroscopy plot of two curves, one relating to wavelength and one to wave number.

Wavenumber = 1/wavelegnth, so the relation is non linear. I want to align the top x-axis with bottom x-axis so that the peaks of the two curves are displayed in line with each other. Is this possible?

This is my current code:

t = tiledlayout(1,1);

ax1 = axes(t);

plot(ax1,wl1,sol1,'-r','LineWidth',3)

ax1.XAxisLocation = 'bottom';

ax1.YAxisLocation = 'left';

ax1.XColor = 'r';

ax1.YColor = 'r';

set(ax1, 'xlim',[300 400])

xlabel('wavelength (nm)',FontSize=18)

ylabel('Absorption',FontSize=18)

hold on

ax2 = axes(t);

plot(ax2,wn1,sol1_adj,'-k','LineWidth',3)

set(ax2, 'xlim',[250000 333333])

ax2.XAxisLocation = 'top';

ax2.YAxisLocation = 'right';

ax2.Color = 'none';

ax1.Box = 'off';

ax2.Box = 'off';

xlabel('wavenumber(m^-^1)',FontSize=18)

ylabel('Absorption',FontSize=18)

set(gca, 'XDir','reverse')

ax1.FontSize = 16;

ax2.FontSize = 16;

##### 2 Comments

William Rose
on 19 Feb 2024

### Answers (1)

Cris LaPierre
on 19 Feb 2024

Edited: Cris LaPierre
on 19 Feb 2024

The axes you are plotting into are linear, so I think the best solution would be to plot both plots using wavelength, and then convert the labels of to top x axis to wavenumber using xticklabels. Note that xticklabels displays the label as a string, not a numeric, so you need to format your number so that it appears as you want. I use sprintf below for that purpose.

If you are particular about which wavenumbers are shown, you can set the tick locations using xticks. Just remember to set the tick location using wavelength, not wavenumber.

The code might look like this. The first part just reproduces the issue.

BTW, one of your axes is off by a factor of 10 based on the equation you have shared.

x1 = (300:10:400)*1e-9;

x2 = 1./x1;

y=rand(1,length(x1));

% current aproach to show the issue

t = tiledlayout(1,1);

ax1 = axes(t);

plot(ax1,x1,y,'-r')

xlabel('Wavelength (m)')

ax1.XColor = 'r';

ax1.YColor = 'r';

ax2 = axes(t);

plot(ax2,x2,y,'k')

ax2.XAxisLocation = 'top';

ax2.YAxisLocation = 'right';

ax2.Color = 'none';

ax1.Box = 'off';

ax2.Box = 'off';

xlabel('Wavenumber (m^{-1})')

ax1.XAxis.Exponent = -9;

ax2.XAxis.Exponent = 4;

Now here is the same plot but with the proposed solution

figure

t = tiledlayout(1,1);

ax1 = axes(t);

plot(ax1,x1,y,'-r')

xlabel('Wavelength (m)')

ax1.XColor = 'r';

ax1.YColor = 'r';

ax2 = axes(t);

plot(ax2,x1,y,'--k')

ax2.XAxisLocation = 'top';

ax2.YAxisLocation = 'right';

ax2.Color = 'none';

ax1.Box = 'off';

ax2.Box = 'off';

xlabel('Wavenumber (m^{-1})')

% desired wavenumber tick locations

wvnum = (3.3:-0.1:2.5)*1e6 % 1/m

% corresponding wavelength

wvlg_nmTk = 1./wvnum % nm

ax1.XAxis.Exponent = -9;

xticks(ax2,wvlg_nmTk);

xticklabels(ax2,sprintf('%3.0f\n',wvnum/1e4)); % display in meters

##### 0 Comments

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!