# Aligning a linear and non-linear x-axis

43 Ansichten (letzte 30 Tage)
Theo McCarthy am 19 Feb. 2024
Kommentiert: Cris LaPierre am 22 Jul. 2024 um 12:40
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);
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 KommentareKeine anzeigenKeine ausblenden
Matt J am 19 Feb. 2024
Can't run your code. No input variables are provided.
William Rose am 19 Feb. 2024
Is there a factor-of-ten error in one of the x-axis scales? Consider the wavenumber and wavelength for the right-most peak in the figure you provided. The black (wavenumber) peak is at about 2.65e5 m^-1. This corresponds to 3.77e-6 m = 3770 nm. But the red (wavelength) peak is at about 377 nm.

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

Cris LaPierre am 19 Feb. 2024
Bearbeitet: Cris LaPierre am 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
wvnum = 1×9
1.0e+06 * 3.3000 3.2000 3.1000 3.0000 2.9000 2.8000 2.7000 2.6000 2.5000
% corresponding wavelength
wvlg_nmTk = 1./wvnum % nm
wvlg_nmTk = 1×9
1.0e-06 * 0.3030 0.3125 0.3226 0.3333 0.3448 0.3571 0.3704 0.3846 0.4000
ax1.XAxis.Exponent = -9;
xticks(ax2,wvlg_nmTk);
xticklabels(ax2,sprintf('%3.0f\n',wvnum/1e4)); % display in meters
##### 2 KommentareKeine anzeigenKeine ausblenden
Anna am 22 Jul. 2024 um 5:18
Hi Cris,
I need to create a following graph:
• bottom x-axis with wavenumber in cm^{-1} (non-linear scale)
• top x-axis with wavelength in nm (linear scale)
• the starting wavelength is 400 nm and end point is 800 nm
• the corresponding wavenumbers are 1e7/wavelength in cm^{-1}.
Cris LaPierre am 22 Jul. 2024 um 12:40
Can you share what you have coded so far?

Melden Sie sich an, um zu kommentieren.

### Kategorien

Mehr zu 2-D and 3-D Plots finden Sie in Help Center und File Exchange

R2023b

### Community Treasure Hunt

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

Start Hunting!

Translated by