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

6 views (last 30 days)
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

Accepted Answer

Voss
Voss on 6 Aug 2023
Edited: Voss on 6 Aug 2023
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');

More Answers (0)

Categories

Find more on Graphics Object Properties in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!