Change format of field contour labels that have been manually added in a tiled layout

1 回表示 (過去 30 日間)
Daniel
Daniel 2024 年 9 月 10 日
移動済み: Voss 2024 年 9 月 10 日
Hi,
Trying to manually add contour labels over a filled contour plot over a narrow range of values.
Matlab returns the error:
Error using hgconvertunits
The reference object is invalid.
Any ideas how I can manually add labels to a tiledlayout?
I also assume there is no workaround for avoiding the contours from striking through the labels when added manually?
Thank you
a = 0.98;
b = 1.02;
Z = round(((b-a).*rand(99,99) + a),2);
XY = [-0.375:.125:.375];
no_levels = 8;
npoints = [99 99]; % define improved resolution
Xfine = linspace(XY(1),XY(end),npoints(1)); % y coords
Yfine = linspace(XY(1),XY(end),npoints(2)); % z coords
[Xfine Yfine] = meshgrid(Xfine,Yfine); % create mesh
tiledlayout(1,2)
for i = 1:2
nexttile(1)
[C,H] = contourf(Xfine,Yfine,Z,no_levels,'-');
% clabel(C,H,'interpreter','latex','FontSize',14);
% H.LevelList = round(H.LevelList,1); % rounds levels to 1st decimal place
clabel(C,H,"manual",'FontSize', 22)
hold on
ylim([-0.5 0.5]);
y = ylim;
yticks([y(1):.25:y(2)])
xticks([-.5:.25:.5])
xlim([-.55 .55])
axis square
end

採用された回答

Mathieu NOE
Mathieu NOE 2024 年 9 月 10 日
why not create explicitely the levels (V array) ?
a = 0.98;
b = 1.02;
Z = peaks(99)/100 + (a+b)/2 ;
XY = [-0.375:.125:.375];
no_levels = 8;
V = round(linspace(min(Z,[],'all'),max(Z,[],'all'),no_levels),2); % create levels explicitely
npoints = [99 99]; % define improved resolution
Xfine = linspace(XY(1),XY(end),npoints(1)); % y coords
Yfine = linspace(XY(1),XY(end),npoints(2)); % z coords
[Xfine, Yfine] = meshgrid(Xfine,Yfine); % create mesh
tiledlayout(1,2)
for i = 1:2
nexttile(1)
[C,H] = contourf(Xfine,Yfine,Z,V);
clabel(C,H,'interpreter','latex','FontSize',10);
hold on
ylim([-0.5 0.5]);
y = ylim;
yticks([y(1):.25:y(2)])
xticks([-.5:.25:.5])
xlim([-.55 .55])
axis square
end
  1 件のコメント
Daniel
Daniel 2024 年 9 月 10 日
移動済み: Voss 2024 年 9 月 10 日
Yes, this seems like a reasonable solution. These things are really not satisfying to work with! Thank you

サインインしてコメントする。

その他の回答 (1 件)

praguna manvi
praguna manvi 2024 年 9 月 10 日
編集済み: praguna manvi 2024 年 9 月 10 日
I also observed the same error at “clabel(C, H, “manual”)” inside tiledLayout. I find that you could use subplot for manual labelling as follows to achieve the same effect for a 1 x 2 layout:
a = 0.98;
b = 1.02;
Z = round(((b-a).*rand(99,99) + a),2);
XY = [-0.375:.125:.375];
no_levels = 8;
npoints = [99 99];
Xfine = linspace(XY(1),XY(end),npoints(1));
Yfine = linspace(XY(1),XY(end),npoints(2));
[Xfine, Yfine] = meshgrid(Xfine,Yfine);
figure;
for i = 1:2
subplot(1, 2, i);
[C,H] = contourf(Xfine,Yfine,Z,no_levels,'-');
clabel(C,H,"manual",'FontSize', 22, "Color", [1, 1, 1]);
hold on;
ylim([-0.5 0.5]);
y = ylim;
yticks([y(1):.25:y(2)]);
xticks([-.5:.25:.5]);
xlim([-.55 .55]);
axis square;
end
Hope this helps!
  1 件のコメント
Daniel
Daniel 2024 年 9 月 10 日
Thank you for your help, Praguna. So many of my plots are in tiled layouts, I actually don't think that it's worth the effort to change everything for a few labels. I'm never content with how they look anyway, manually placed or otherwise. I'll just stick with the colour axis to guide the reader.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeContour Plots についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by