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

3 Ansichten (letzte 30 Tage)
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

Akzeptierte Antwort

Voss
Voss am 6 Aug. 2023
Bearbeitet: Voss am 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');

Weitere Antworten (0)

Kategorien

Mehr zu Lighting, Transparency, and Shading finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by