2017-09-02 3 views
2

J'essaie de mettre en évidence la zone d'intersection de deux graphiques en escalier. J'ai été en mesure de sélectionner les points à l'intérieur de la zone d'intersection et je voulais créer la forme remplie avec la commande patch, ce qui n'a pas fonctionné. Cependant, certains points doivent encore être exclus et le point d'intersection doit être ajouté.Comment puis-je mettre en surbrillance la zone de chevauchement dans un graphique en escalier?

Une autre idée était de créer deux graphiques de la région, qui ressemblent à des graphiques d'escalier avec:

x = pc_bh(1, :); 
y = pc_bh(2, :); 
x = [x; x]; 
y = [y; y]; 
area(x([2:end end]),y(1:end)) 
hold on; 
x = pc_bh(3, :); 
y = pc_bh(4, :); 
x = [x; x]; 
y = [y; y]; 
area(x([2:end end]),y(1:end)) 

et les entrecroisent, qui ne fonctionne pas non plus.

est ici le résultat souhaité:

enter image description here

est ici un terrain avec des marqueurs sur les points à l'intérieur de la zone d'intersection:

enter image description here

Le code pour les marqueurs est assez simple:

pointsA = []; 
pointsB = []; 
lowerLimit = pc_bh(3, 1); 
upperLimit = pc_bh(1, 11); 

for entry=2:11 
    if pc_bh(1, entry) >= lowerLimit && pc_bh(1, entry) <= upperLimit 
     pointsA = vertcat(pointsA, [pc_bh(1, entry), pc_bh(2, entry)]); 
     pointsA = vertcat(pointsA, [pc_bh(1, entry), pc_bh(2, entry) + 1/10]); 
    end 
    if pc_bh(3, entry) >= lowerLimit && pc_bh(3, entry) <= upperLimit 
     pointsB = vertcat(pointsB, [pc_bh(3, entry), pc_bh(4, entry)]); 
      pointsB = vertcat(pointsB, [pc_bh(3, entry), pc_bh(4, entry) - 1/9]); 
    end 
end 
plot(pointsA(:, 1), pointsA(:, 2), 'xr'); 
plot(pointsB(:, 1), pointsB(:, 2), 'xb'); 

L'ensemble de données est une matrice 4 x 11 où la première/deuxième rangée contient les valeurs x/y pour le premier graphique et la troisième/quatrième rangée les valeurs x/y pour le second graphique.

Ceci est le jeu de données utilisé:

0.99754 0.99754 0.99772 0.99790 0.99808 0.99821 0.99842 0.99870 0.99886 0.99900 0.99918 
1  0.9  0.8  0.7  0.6  0.5  0.4  0.3  0.2  0.1  0 
0.99873 0.99873 0.99899 0.99918 0.99928 0.99945 0.99969 0.99973 0.99987 0.99993 0.99993 
0  0.11111 0.22222 0.33333 0.44444 0.55555 0.66666 0.77777 0.88888 1  1 

Répondre

2

La difficulté provient du fait que chaque parcelle stairstep est évaluée à un ensemble différent de valeurs de x. Essentiellement, vous devez interpoler la valeur de chaque tracé d'escalier aux valeurs x correspondantes de l'autre afin que vous puissiez comparer les valeurs y aux mêmes points pour voir lequel est le minimum. Normal interpolation se heurte à des problèmes car vous devez avoir des valeurs x répétées dans un tracé d'escalier. Une alternative est d'utiliser la fonction histcounts pour trouver pour chaque parcelle les étapes auxquelles leurs points tombent pour l'autre parcelle. Voici une fonction stairarea qui illustre ce, en deux ensembles de x et les données y en entrée et la création d'un terrain à l'aide stairs et area:

function stairarea(x1, y1, x2, y2) 

    % Find overlap of curve 1 on curve 2: 
    [~, ~, index] = histcounts(x1, x2); 
    xi = x1(index > 0); 
    yi = min(y1(index > 0), y2(index(index > 0))); 

    % Find overlap of curve 2 on curve 1: 
    [~, ~, index] = histcounts(x2, x1); 
    xi = [xi x2(index > 0)]; 
    yi = [yi min(y2(index > 0), y1(index(index > 0)))]; 

    % Sort and create stairstep data for overlapping points: 
    [xi, index] = sort(xi); 
    yi = yi(index); 
    [xi, yi] = stairs(xi, yi); 

    % Create plot: 
    area(xi, yi, 'FaceColor', 'y', 'EdgeColor', 'none'); 
    hold on; 
    stairs(x1, y1, 'b'); 
    stairs(x2, y2, 'r'); 

end 

Et vous pouvez utiliser avec vos données d'échantillon comme ceci:

pc_bh = [0.99754 0.99754 0.99772 0.99790 0.99808 0.99821 0.99842 0.99870 0.99886 0.99900 0.99918; ... 
     1  0.9  0.8  0.7  0.6  0.5  0.4  0.3  0.2  0.1  0; ... 
     0.99873 0.99873 0.99899 0.99918 0.99928 0.99945 0.99969 0.99973 0.99987 0.99993 0.99993; ... 
     0  0.11111 0.22222 0.33333 0.44444 0.55555 0.66666 0.77777 0.88888 1  1]; 
stairarea(pc_bh(1, :), pc_bh(2, :), pc_bh(3, :), pc_bh(4, :)); 

Et vous obtiendrez ce complot:

enter image description here

0

Une autre façon est pour convertir les escaliers en polygones et utiliser des opérateurs set à l'aide de polybool/polyxpoly

function patch = sorted2patch(st) 
    patch=kron(st,[1 1]); 
    patch(2,3:2:size(patch,2)-1)=patch(2,2:2:size(patch,2)-1);  
    if skewness(st(1,:)) > 0 
     patch(2,1)=patch(2,end); 
    else 
     patch(1,1)=patch(1,end); 
    end  
end 

pc_bh = [0.99754 0.99754 0.99772 0.99790 0.99808 0.99821 0.99842 0.99870 0.99886 0.99900 0.99918; ... 
1  0.9  0.8  0.7  0.6  0.5  0.4  0.3  0.2  0.1  0; ... 
0.99873 0.99873 0.99899 0.99918 0.99928 0.99945 0.99969 0.99973 0.99987 0.99993 0.99993; ... 
0  0.11111 0.22222 0.33333 0.44444 0.55555 0.66666 0.77777 0.88888 1  1]; 
patch1=sorted2patch(pc_bh(1:2,:)); 
patch2=sorted2patch(pc_bh(3:4,:)); 
[xand,yand]=polybool('and',patch1(1,:),patch1(2,:),patch2(1,:),patch2(2,:)); 
figure, stairs(pc_bh(1,:),pc_bh(2,:),'r'), 
hold on, 
stairs(pc_bh(3,:),pc_bh(4,:),'b') 
patch(xand,yand,'y')