2 van 3

Re: Csv file importeren in matlab

Geplaatst: wo 17 aug 2011, 01:53
door Wouter_Masselink
Dit lijkt niet te werken. Ik heb het gedeelte onder mijn

Code: Selecteer alles

%Create graphs
verwijderd en vervanger voor jou suggestie. De output die ik dan krijg is identiek aan de output die mijn code geeft met de bijkomstigheid dat er een tweede figuur weergegeven wordt. Dit figuur bevat twee identieke assen (0-1) en geen datapunten.

Uit je suggestie blijkt dat ik een extra variabele (k) moet creƫren en deze is afhankelijk van de Data1 en 2. Ik ga hier verder mee aan de slag.

Re: Csv file importeren in matlab

Geplaatst: wo 17 aug 2011, 09:44
door Bart
Wat ik begreep is dat je Data1(:, 1) tegen Data2(:, 1) wilt plotten en vervolgens Data1(:, 2) tegen Data2(:, 2) etc...

Ik maak dus een for loop over de elementen van de tweede dimensie van Data1 en maak daar figuren van

Re: Csv file importeren in matlab

Geplaatst: do 18 aug 2011, 02:17
door Wouter_Masselink
Niet helemaal. De output van Data1(1,1) moet tegen Data1(1,1) geplot worden en Data1(2,1) tegen Data 2(2,1) etc. Dat zou gedaan moeten kunnen worden met de code:

Code: Selecteer alles

X = Data1{:,1};

Y = Data2{:,1};
Aangezien ik meer dan 2 variabelen heb wil ik dus meerdere verschillende grafieken maken. In een plot moet elk geplot punt dus een identificatie krijgen. Zelfs zat ik te denken aan een mogelijkheid om de locatie van de datapunten in de kolom van Data1(:,1) te tellen. Er zou dus een soort tel functie moeten zijn die nagaat waar elk datapunt in Data 1(:,1) of Data2(:,1) zich bevindt. Dit zou een simpele integer op moeten leveren die vervolgens naast elk datapunt weergegeven dient te worden.

Ik kan me dus voorstellen dat ik dit moet benaderen als een extra dimensie waarbij de locatie van de datapunten in kolom 1 van Data1 als output worden verkregen. Vervolgens dient dit op een eenvoudige manier weergegeven te worden in een grafiek. Zelf zat ik te denken aan een nummering aangezien ik niet met heel veel datapunten te maken heb (20-30). Als mensen andere ideen hebben om dit weer te geven, alle ideen zijn welkom.

Re: Csv file importeren in matlab

Geplaatst: do 18 aug 2011, 08:39
door Bart
Wouter_Masselink schreef:Niet helemaal. De output van Data1(1,1) moet tegen Data1(1,1) geplot worden en Data1(2,1) tegen Data 2(2,1) etc. Dat zou gedaan moeten kunnen worden met de code:

Code: Selecteer alles

X = Data1{:,1};

Y = Data2{:,1};
Tot zover juist en duidelijk
Aangezien ik meer dan 2 variabelen heb wil ik dus meerdere verschillende grafieken maken. In een plot moet elk geplot punt dus een identificatie krijgen. Zelfs zat ik te denken aan een mogelijkheid om de locatie van de datapunten in de kolom van Data1(:,1) te tellen. Er zou dus een soort tel functie moeten zijn die nagaat waar elk datapunt in Data 1(:,1) of Data2(:,1) zich bevindt. Dit zou een simpele integer op moeten leveren die vervolgens naast elk datapunt weergegeven dient te worden.
Hier raak ik je kwijt.

Meer dan twee variabelen, er is dus ook een Data3 en Data4??

En waarom moet elk punt een identificatie krijgen? Dan wil je dus kennelijk geen scatter plot.

Re: Csv file importeren in matlab

Geplaatst: vr 19 aug 2011, 04:08
door Wouter_Masselink
Er is inderdaad een Data3 en 4 en 5 en 6 en 7. een heel waslijst aan variabelen. Elk datapunt stelt een object voor. En van elk object wil ik tussen de grafieken kunnen vergelijken wat hun gedrag is. Hiervoor wil ik een unieke identificatie code voor elk object hebben. Deze moet afhankelijk zijn van hun plaats in de kolom. Data1(1:1) krijgt bijvoorbeeld de code '1' mee en Data1(2:1) krijgt code '2' mee. Deze codes moeten naast de punten in de scatterplot weergegeven worden. Als je een andere manier weet dan houdt ik me natuurlijk ook aanbevolen.

beetje oftopic:

Op een later tijdstip wil ik ook nog het gedrag van deze objecten door de tijd begrijpen. Hiervoor moet ik datasubsets uit deze csv files halen om dit vervolgens tot 1 object over tijd te krijgen. Door voor elk tijdspunt een scatterplot te maken van alle objecten en deze vervolgens achter elkaar af te spelen kan ik het gedrag van deze objecten over tijd proberen te begrijpen. Dat is nu echter nog niet relevant.

Re: Csv file importeren in matlab

Geplaatst: vr 19 aug 2011, 11:50
door DePurpereWolf
Ik begrijp ook niet echt wat je wil. Als je gewoon verschillende scatterplots wilt vergelijken dan plot je gewoon meerdere scatterplots in een grafiek, en verander de kleur van de punten voor elke reeks.

Maar iets zegt me dat dat niet is waarnaar je op zoek bent.

Re: Csv file importeren in matlab

Geplaatst: zo 21 aug 2011, 15:38
door Wouter_Masselink
Inderdaad, daar ben ik niet naar op zoek. Ik heb voor elk object een aantal verschillende metingen met een totaal van ongeveer 20-30 objecten. Deze metingen wil ik met elkaar vergelijken, hierbij wil ik de mogelijkheid hebben om een specifiek object dat is geplot geidentificeerd kan worden als dit specifieke object in verschillende scatterplots. Om dit te realiseren zou je bijvoorbeeld Data1 nemen en afhankelijk van de locatie tot Data(0,1) in de oorsponkelijke lijst krijgt elk object een specifieke code aangewezen. Deze code zou vervolgens naast het punt in de scatterplot van dit object weergegeven moeten worden.

Elk punt moet dus in principe een data label krijgen.

Re: Csv file importeren in matlab

Geplaatst: zo 21 aug 2011, 20:31
door Bart

Code: Selecteer alles

for k = 1 : size(Data1, 1)

  text(Data1(k, 1), Data2(k, 1), 'Punt 1', 'EdgeColor', 'k', 'FaceColor', [0.8 0.8 1]);

end

Re: Csv file importeren in matlab

Geplaatst: ma 22 aug 2011, 04:50
door Wouter_Masselink
Kan je de rest van de code plaatsen waar dit tussen zou moeten staan? Op het moment krijg ik namelijk een error in

Code: Selecteer alles

text(Data1(k, 1), Data2(k, 1), 'Punt 1', 'EdgeColor', 'k', 'FaceColor', [0.8 0.8 1]);

Re: Csv file importeren in matlab

Geplaatst: ma 22 aug 2011, 08:02
door Bart

Code: Selecteer alles

figure();



X = Data1(:, 1);

Y = Data2(:, 1);



scatter(X, Y);



axis ([0,250,0,1])

xlabel({'Total track length (um)'},'FontSize',16);

ylabel('Straightness','FontSize',16);

title({'Overview of cell migratory behaviour'},'FontSize',20);



for k = 1 : length(X)

  text(X(k), Y(k), 'Punt 1', 'EdgeColor', [0 0.5 0], 'BackgroundColor', [0.7 0.9 .7]);

end

Re: Csv file importeren in matlab

Geplaatst: ma 22 aug 2011, 09:04
door Wouter_Masselink
En dit geeft bij mij een error in

Code: Selecteer alles

scatter(X, Y);
Ik ga er nog eens grondig overheen en kom hier later nog op terug.

Re: Csv file importeren in matlab

Geplaatst: ma 22 aug 2011, 09:11
door Drieske
Zijn je data van dezelfde size? Mogelijk een overbodige vraag, maar beter op veilig spelen ;) .

If so: wat is je (exacte) error?

Re: Csv file importeren in matlab

Geplaatst: di 23 aug 2011, 03:19
door Wouter_Masselink
Zowel het format als het aantal waarnemingen is identiek voor alle Data's.

Code: Selecteer alles

??? Error using ==> plot

Not enough input arguments.

Error in ==> test at 50

plot(X, Y);
Dit terwijl X en Y weldegelijk gedefinieerd zijn

Code: Selecteer alles

X = 

[22x1 double]

Y = 

[22x1 double]
EDIT: Hij doet 't! Er was een stuk terug een foutje in m'n code geslopen. Het enige probleem dat ik nu heb is dat de labels allemaal dezelfde naam hebben ('punt 1'). Het moet echter een nummering zijn afhankelijk van de volgorde van de datapunten in de orginele csv files. Ik zal laten weten hoe dit vordert.

Re: Csv file importeren in matlab

Geplaatst: di 23 aug 2011, 08:17
door Bart
"punt 1" was een voorbeeld. Je zou vooraf een cell array (met dezelfde lengte als X) kunnen maken met daarin de verschillende strings

Code: Selecteer alles

S = {'punt 1', 'punt 2', 'punt 3'};
en vervolgens

Code: Selecteer alles

text(X(k), Y(k), S{k}, 'EdgeColor', [0 0.5 0], 'BackgroundColor', [0.7 0.9 .7]);
Of je maakt de string dynamisch, bijvoorbeeld:

Code: Selecteer alles

for k = 1 : length(X)

  s = sprintf('punt %d', k);

  text(X(k), Y(k), s, 'EdgeColor', [0 0.5 0], 'BackgroundColor', [0.7 0.9 .7]);

end

Re: Csv file importeren in matlab

Geplaatst: di 23 aug 2011, 11:35
door Wouter_Masselink
Hij doet 't.

Ik heb in het volgende ervan gemaakt

Code: Selecteer alles

for k = 1 : length(X)

 text(X(k), Y(k), num2str(k), 'EdgeColor', [0 0.5 0], 'BackgroundColor', [0.7 0.9 .7]);

end
Dit geeft echter een aanzienlijk trage respons waarbij de datalabels ook veelal overlappen. Dit maakt het, zeker bij een toename van het aantal datapunten waarschijnlijk onwerkbaar. Dit heb ik gelukkig op een andere manier weten op te lossen. Door de datacursor mode aan te zetten en vervolgens de DataIndex te laden bereik ik exact hetzelfde door simpelweg op het punt te klikken zonder risico's op vastlopers.

Code: Selecteer alles

function output_txt = myfunction(obj,event_obj)

% Display the position of the data cursor

% obj		  Currently not used (empty)

% event_obj	Handle to event object

% output_txt   Data cursor text string (string or cell array of strings).

pos = get(event_obj,'Position');

index = get(event_obj,'DataIndex');

output_txt = {['X: ',num2str(pos(1),4)],...

['Y: ',num2str(pos(2),4)], ['Index: ', num2str(index)]};

% If there is a Z-coordinate in the position, display it as well

if length(pos) > 2

output_txt{end+1} = ['Z: ',num2str(pos(3),4)];

end