Display sum of areas of different categories for multiple polygons in a legend

2 ビュー (過去 30 日間)
Louis Helledie
Louis Helledie 2023 年 8 月 6 日
コメント済み: Voss 2023 年 8 月 7 日
I have drawn multiple polygons representing different view-out categories, and have calculated the area of each individual polygon. Now i want to display the sum of the areas for each category. I have 7 categories (Other, Sky, Building, Traffic, Car, Ground and Greenery) but many of the polygons belongs to the same category (Building, Car and Greenery).
Is there a way to easily show the sum of the areas for each category in a legend on the plot? If I run the code now, it will just give me the area for each polygon instead of the area for the category, see image below.
figure;
imagesc([-pi, pi], [-1, 1], bg_img);
V = readtable('polygons_brogade_foraar.csv');
V = table2array(V);
hold on;
polygons = {
'Other', [-pi 1; -pi -1; pi -1; pi 1], 'white';
'Sky', [V(:,1) V(:,2)], '#4DBEEE';
'Building 1', [V(:,3) V(:,4)], '#A2142F';
'Building 2', [V(:,5) V(:,6)], '#A2142F';
'Traffic', [V(:,7) V(:,8)], '#0072BD';
'Car 1', [V(:,9) V(:,10)], '#EDB120';
'Car 2', [V(:,11) V(:,12)], '#EDB120';
'Car 3', [V(:,13) V(:,14)], '#EDB120';
'Ground', [V(:,15) V(:,16)], '#D95319';
'Greenery 1', [V(:,17) V(:,18)], '#77AC30';
'Greenery 2', [V(:,19) V(:,20)], '#77AC30';
'Greenery 3', [V(:,21) V(:,22)], '#77AC30';
'Greenery 4', [V(:,23) V(:,24)], '#77AC30';
'Greenery 5', [V(:,25) V(:,26)], '#77AC30';
};
Q = polyshape(zeros(0,2));
n = size(polygons, 1);
A = zeros(1, n);
P = cell(1, n);
for k = n:-1:1
Pk = polyshape(polygons{k, 2});
A(k) = area(subtract(Pk, Q));
P{k} = Pk;
Q = union(Q, Pk);
end
for k = 1:n
plot(P{k}, 'FaceAlpha', 1, 'FaceColor', polygons{k, 3});
end
for k = 1:n
fprintf('Addition area polygon %d = %.2f\n', k, A(k));
end
legendStrings = cell(n, 1);
for k = 1:n
legendStrings{k} = sprintf('%s (Area: %.2f)', polygons{k, 1}, A(k));
end
legend(legendStrings, 'Location', 'best');
axis([-pi, pi, -1, 1]);
xticks(-pi:pi/2:pi);
xticklabels({'-\pi', '-\pi/2', '0', '\pi/2', '\pi'});
title('Region of Interests (ROIs) of the 360° Video');
xlabel('Longitude');
ylabel('Latitude');
ax = gca;
set(ax, 'FontSize', 15, 'FontName', 'Bookman Old Style');
Hope I explained it well enough.
Thank you in advance,
Louis H

採用された回答

Voss
Voss 2023 年 8 月 6 日
編集済み: Voss 2023 年 8 月 6 日
figure;
% imagesc([-pi, pi], [-1, 1], bg_img);
% since I don't have your variable bg_img, I set YDir 'reverse' like imagesc does
set(gca(),'YDir','reverse')
V = readtable('polygons_brogade_foraar.csv');
V = table2array(V);
hold on;
polygons = {
'Other', [-pi 1; -pi -1; pi -1; pi 1], 'white';
'Sky', V(:,[1 2]), '#4DBEEE';
'Building 1', V(:,[3 4]), '#A2142F';
'Building 2', V(:,[5 6]), '#A2142F';
'Traffic', V(:,[7 8]), '#0072BD';
'Car 1', V(:,[9 10]), '#EDB120';
'Car 2', V(:,[11 12]), '#EDB120';
'Car 3', V(:,[13 14]), '#EDB120';
'Ground', V(:,[15 16]), '#D95319';
'Greenery 1', V(:,[17 18]), '#77AC30';
'Greenery 2', V(:,[19 20]), '#77AC30';
'Greenery 3', V(:,[21 22]), '#77AC30';
'Greenery 4', V(:,[23 24]), '#77AC30';
'Greenery 5', V(:,[25 26]), '#77AC30';
};
Q = polyshape(zeros(0,2));
n = size(polygons, 1);
A = zeros(1, n);
P = cell(1, n);
for k = n:-1:1
Pk = polyshape(polygons{k, 2});
A(k) = area(subtract(Pk, Q));
P{k} = Pk;
Q = union(Q, Pk);
end
Warning: Boundaries with fewer than 3 points were removed.
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Boundaries with fewer than 3 points were removed.
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
Warning: Boundaries with fewer than 3 points were removed.
[category_names, h_plot_idx, category_idx] = unique( regexprep( polygons(:,1), ' \d+$', ''), 'stable');
category_sums = splitapply(@sum, A(:), category_idx);
h_plot = zeros(1,n);
for k = 1:n
h_plot(k) = plot(P{k}, 'FaceAlpha', 1, 'FaceColor', polygons{k, 3});
end
for k = 1:n
fprintf('Addition area polygon %d = %.2f\n', k, A(k));
end
Addition area polygon 1 = 0.04 Addition area polygon 2 = 4.58 Addition area polygon 3 = 0.77 Addition area polygon 4 = 0.58 Addition area polygon 5 = 0.05 Addition area polygon 6 = 0.00 Addition area polygon 7 = 0.01 Addition area polygon 8 = 0.01 Addition area polygon 9 = 5.97 Addition area polygon 10 = 0.07 Addition area polygon 11 = 0.14 Addition area polygon 12 = 0.15 Addition area polygon 13 = 0.17 Addition area polygon 14 = 0.02
m = numel(category_names);
legendStrings = cell(m, 1);
for k = 1:m
legendStrings{k} = sprintf('%s (Area: %.2f)', category_names{k}, category_sums(k));
end
legend(h_plot(h_plot_idx), legendStrings, 'Location', 'best');
axis([-pi, pi, -1, 1]);
xticks(-pi:pi/2:pi);
xticklabels({'-\pi', '-\pi/2', '0', '\pi/2', '\pi'});
title('Region of Interests (ROIs) of the 360° Video');
xlabel('Longitude');
ylabel('Latitude');
ax = gca;
set(ax, 'FontSize', 15, 'FontName', 'Bookman Old Style');
  2 件のコメント
Louis Helledie
Louis Helledie 2023 年 8 月 7 日
編集済み: Louis Helledie 2023 年 8 月 7 日
That's exactly what I needed. Thank you so much @Voss!
Voss
Voss 2023 年 8 月 7 日
You're welcome!

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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLighting, Transparency, and Shading についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by