Two x-axis for the same contourf plot

조회 수: 26 (최근 30일)
Henrik Lassen
Henrik Lassen 2020년 7월 30일
댓글: Henrik Lassen 2020년 7월 31일
I have a data set for which I make a 2D contourf plot. I have two x-axis which i would like to use at the same time (Energy and Wavelength).
The code producing the two above plots are:
figure
contourf(flipud(y(1).energy), degrees5, log10(conx_spectrum), 500, 'edgecolor', 'none')
colormap(jet)
title('Full excitation laser dependence')
xlim([1.1515 3.52759]);
xlabel('Energy [eV]')
ylabel(['Angle of polariser [' char(176) ']'])
figure
contourf(flipud(y(1).wavelength), degrees5, log10(conx_spectrum), 500, 'edgecolor', 'none')
colormap(jet)
title('Full excitation laser dependence')
xlim([351.47 1076.72]);
xlabel('Wavelength [nm]')
ylabel(['Angle of polariser [' char(176) ']'])
Is there a way, where i can have the Energy axis at the bottom, and Wavelength axis at the top?
Of course the wavelength axis at the top would have to have the same ticks as the energy, therefore being strectched.
Thank you.

채택된 답변

Adam Danz
Adam Danz 2020년 7월 31일
편집: Adam Danz 2020년 7월 31일
Matab does not currently offer a second x axis.
You can create two duplicate axes and place the x-ticks of the bottom axis on top. Then, scale the second set of x-values to align with the ticks of the first set of x-values.
Here's a demo. The order of many of these steps is important. See footnotes for other important details.
% Produce figure with 2 overlapping axes
fig = figure();
ax0 = axes();
ax0.Position(3:4) = ax0.Position(3:4) * .95; % [1]
ax = copyobj(ax0, fig);
% Plot contour on top axes (demo data)
x = linspace(-2*pi,2*pi);
y = linspace(0,4*pi);
[X,Y] = meshgrid(x,y);
Z = sin(X) + cos(Y);
co = contourf(ax,X,Y,Z,10); % [2]
% Set x axis ticks, limit, xlabel, and any
% other properties of the main axis here. [3]
ax.XTick = -6:2:6;
ax.XLim = ax.XLim; % Important to set xlim
xlabel(ax, 'Wavelength [nm]')
% Link the 2 axes [4]
linkaxes([ax0,ax],'y')
linkprop([ax,ax0], {'position','xScale','units',...
'box','boxstyle','DataAspectRatio','FontName',...
'FontSize','xlim','xtick'});
% Set the bottom axis x-axis to the top and remove its y axis
ax0.XAxisLocation = 'top';
ax0.YTick = [];
% Compute the x ticks for the 2nd x-axis on top by
% scaling the 2nd x-values to the first x-values.
x2Limits = [1, 3.5]; % The [min, max] values of the second x-axis (Energy) [5]
x2LimScaled = (x2Limits-x2Limits(1))*range(ax.XLim) + ax.XLim(1);
X1TickNorm = (ax.XTick - ax.XLim(1)) / range(ax.XLim);
X2Tick = (X1TickNorm * range(x2LimScaled)) + x2LimScaled(1);
% Sanity check: number of x2 ticks equals number of x1 ticks
assert(isequal(numel(X2Tick),numel(ax.XTick)), 'Tick lenghts between the two x axes are not equal.')
set(ax0, 'XTickLabel', compose('%.1f',X2Tick)) %[6]
xlabel(ax0, 'Energy [eV]')
Footnotes
[1] Reduce the size of the axes to make room for the upper x-axis label added at the end.
[2] The axes will look ugly for now but will be fixed later.
[3] It's important to set all axis properties before linking the axes.
[4] If any properties are added or removed to linkprop(), test it thoroughly.
[5] You'll need to compute these values. They are the x-axis limits of your second contour plot.
[6] compose('%.1f, __) sets tick labels to 1 decimal place. Adjust as needed.
  댓글 수: 1
Henrik Lassen
Henrik Lassen 2020년 7월 31일
Thank you very much for the detailed explanation.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Contour Plots에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by