Contour plot in topdown view van 3D-array (Matlab)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • wph
  • Registratie: Juli 2002
  • Laatst online: 07-07 09:53
Voor mijn scriptie wil ik in Matlab een plot maken bestaande uit een (x,y,z)-array van stroomsnelheden van bovenaf bekeken met daarin contourlijnen.

Hiervoor heb ik een script geschreven, zie hieronder. Het script haalt uit een matrix de stroomsnelheden op een bepaald tijdstip T. Vervolgens wordt een plot gemaakt die van bovenaf wordt bekeken. De contourlijnen staan echter op hoogte z=0 en worden bedekt door de colormap van de surf functie wanneer deze boven z=0 uitkomt. Wat ik wil is dat de tekst en waardes van de contourplot altijd zichtbaar zijn. Ik heb het al deels opgelost door de plot van de surf functie semi-transparant te maken, maar dat is niet echt een nette oplossing.

Is er een mogelijkheid om de z-waarde van de contour plot op een andere hoogte te plotten?
Of gebruik ik de verkeerde functies?

(nb. met de functie contour3 lukt het ook niet, dan worden de contourlijnen op hun respectievelijke hoogte geplot en dat levert hetzelfde probleem op)

edit: sorry voor mijn wat vage topictitel, ik wilde deze nog veranderen, maar dat kan je dus blijkbaar niet zelf :|


clear all;
close all;
clc;
data=importdata('depth averaged velocity 2010 referentie.mat');
[tt,m,n]=size(data.XComp);
T = input('Choose Timepoint T:');
zx=data.XComp(T,:,:); % picks flow velocity at t=T from flow velocity matrix
zy=data.YComp(T,:,:);
zx=reshape(zx,m,n);
zy=reshape(zy,m,n);
hold on
surf(data.X,data.Y,zy,'FaceAlpha',0.5);
view(2);
shading flat
colormap(flipud(colormap));
[c,h]=contour(data.X,data.Y,zy,'k');
clabel(c,h);
hold off

[ Voor 5% gewijzigd door wph op 11-12-2012 17:54 ]


Acties:
  • 0 Henk 'm!

Anoniem: 98590

En wat is er mis met alleen van contour() te plotten?

Acties:
  • 0 Henk 'm!

  • wph
  • Registratie: Juli 2002
  • Laatst online: 07-07 09:53
Anoniem: 98590 schreef op dinsdag 11 december 2012 @ 18:29:
En wat is er mis met alleen van contour() te plotten?
Dat er behoorlijk wat nuances verloren gaan. Nu kan je het aantal contourlijnen natuurlijk wel verhogen, maar daar wordt het niet echt beter van. Plus natuurlijk het esthetische aspect, het ziet er mooier uit.

Hieronder heb ik 4 verschillende plots toegevoegd. De contour plot zelf is natuurlijk niet echt duidelijk. Contourf wil op een of andere manier niet alle gebieden vullen. Daaronder de beste poging, semi-transparant en als laatste het probleem, contourlijnen en labels gaan verloren als de colormap er overheen valt.

Afbeeldingslocatie: http://dl.dropbox.com/u/26248241/contour.jpg
Afbeeldingslocatie: http://dl.dropbox.com/u/26248241/contourf.jpg
Afbeeldingslocatie: http://dl.dropbox.com/u/26248241/transparant.jpg
Afbeeldingslocatie: http://dl.dropbox.com/u/26248241/contourweg.jpg

[ Voor 47% gewijzigd door wph op 11-12-2012 20:01 ]


Acties:
  • 0 Henk 'm!

Anoniem: 98590

Probeer in de plaats van waar je nu hebt staan
code:
1
2
3
[c,h]=contour(data.X,data.Y,zy,'k');
clabel(c,h);
hold off

Dit eens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
a = get(gca, 'ZLim');
zpos = a(2);

% Get D contour data
[c, hh] = contour3(gca, X, Y, Z, 'k');

% size zpos to match the data
for i = 1 : length(hh)
    zz = get(hh(i), 'ZData');
    set(hh(i), 'ZData', zpos * ones(size(zz)));
end

clabel(c, hh);
hold off;

Dit is een licht aangepaste versie van de code die door MATLAB zelf wordt gebruikt in de functie surfc.

(Uiteraard even de variabelen X, Y en Z vervangen door de variabelen die jij voor je data gebruikt)

[ Voor 8% gewijzigd door Anoniem: 98590 op 12-12-2012 16:47 ]


  • wph
  • Registratie: Juli 2002
  • Laatst online: 07-07 09:53
Anoniem: 98590 schreef op woensdag 12 december 2012 @ 16:45:
Probeer in de plaats van waar je nu hebt staan
code:
1
2
3
[c,h]=contour(data.X,data.Y,zy,'k');
clabel(c,h);
hold off

Dit eens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
a = get(gca, 'ZLim');
zpos = a(2);

% Get D contour data
[c, hh] = contour3(gca, X, Y, Z, 'k');

% size zpos to match the data
for i = 1 : length(hh)
    zz = get(hh(i), 'ZData');
    set(hh(i), 'ZData', zpos * ones(size(zz)));
end

clabel(c, hh);
hold off;

Dit is een licht aangepaste versie van de code die door MATLAB zelf wordt gebruikt in de functie surfc.

(Uiteraard even de variabelen X, Y en Z vervangen door de variabelen die jij voor je data gebruikt)
Dank u, ik zal eens testen hoe dit werkt.

Heb het probleem eigenlijk zelf ook al opgelost, ik had de functie pcolor helemaal over het hoofd gezien, deze werkt ook prima met 3D arrays ipv 2D en deze geeft eigenlijk hetzelfde weer als surf van bovenaf bekeken. Pcolor + contour + quiver en ik heb het plaatje wat ik wil. Dus ja weer wat geleerd :+

[ Voor 7% gewijzigd door wph op 13-12-2012 16:52 ]