IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Adapter une matrice pour créer un graphe "nuage de point"


Sujet :

MATLAB

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut Adapter une matrice pour créer un graphe "nuage de point"
    Bonjour à tous,

    J'essaye en vain de créer un graphe type" nuage de point" à partir d'une matrice extraite d'un fichier texte.
    Je vais vous expliquer ce que j'ai et ce que je veux avec des extraits de mon code et le fichier texte utilisé dans l'exemple (en pièce jointe).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    % Choix du fichier de débit à utiliser  :
    FichierTexte = 'FichierTexte.txt'
     
     
    %%                   ETAPE 1 : Importation des données                   %%              
     
    % Ouverture du fichier texte dans lequel il y a les valeurs.
    fid=fopen(FichierTexte,'r'); % 'r' = open file for reading
     
    % Lecture d'un texte formaté. 
    m=textscan(fid,'%f %f %f %f','delimiter','/\t');
     
    % Fermeture du fichier après lecture.
    fclose(fid);
     
     
    % Ma matrice est composée de 4 colonnes :
    JJ=m{1}; % La colonne 1 de ma matrice m contient les jours "JJ".
    MM=m{2}; % La colonne 2 de ma matrice m contient les mois "MM".
    YY=m{3}; % La colonne 3 de ma matrice m contient les années "YY".
    Deb=m{4}; % La colonne 4 de ma matrice m contient les valeurs "Deb".

    Dans un premiers temps, j'ai tracé un graphe avec en abscisse les dates JJ/MM/YY et en ordonnée les valeurs "Deb".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %%                   ETAPE 2 : Sélection des données                     %% 
     
    % La variable "dat" correspond à la combinaison de YY, MM et JJ.
    dat=datenum(YY,MM,JJ);
     
     
    %%                   ETAPE 3 : Création des graphes                      %%              
     
    % Graphe des valeurs en fonction des dates.
    plot(dat,Deb,'LineWidth',2,'Color',[.2 .4 .7]) % Voir l'aide de PLOT.
    datetick
    Maintenant, je voudrais, avec les mêmes données tracer un graphe tel que pour chaque jour JJ/MM (indépendamment de l'année YY) représenté en abscisse (soit 365 ou 366 jours dans l'année), je représente les valeurs Deb en ordonnées. Ce qui implique d'avoir plusieurs valeurs "Bed" pour un même jour "JJ/MM".

    Mais je n'y arrive pas. J'ai essayé plusieurs choses :

    1) j'ai adapté le précédant code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %%                   ETAPE 2 : Sélection des données                     %%              
     
    % La variable "dat" correspond à la combinaison de MM et JJ.
    dat=datenum(MM,JJ) %Variable utilisée pour tracer le graphe des valeurs en fonction du jour.
     
     
    %%                   ETAPE 3 : Création des graphes                      %%              
     
    % Graphe des valeurs en fonction du jour JJ/MM indépendamment de l'année.
    plot(dat,Deb,'o') % Voir l'aide de PLOT.
    datetick
    J'obtiens le bon type de graphe MAIS je n'ai pas une redistribution de mes valeurs "Deb" en fonction du jour identifié par JJ/MM mais seulement en fonction du mois (Concrètement, j'ai 12 colonnes de valeurs "Deb" au lieu de 365 ...).


    2) Avec 'datenum' ça ne marche pas ... alors j'ai essayé sans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    % La variable "dat" correspond à la combinaison de MM et JJ.
    dat=JJ&'/'&MM; % Variable utilisée pour tracer le graphe des débits annuels
    Et ça ne marche toujours pas. La seule valeurs qui ressort est 1 ! ... C'est pire que 1)


    Savez-vous comment faire ?

    Merci d'avance pour votre participation !!

    Fichiers attachés Fichiers attachés

  2. #2
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    re salut !

    Peut-être que j'ai trop détaillé ma question ....

    Comment faire un graphe avec :
    - En ordonnée : les valeurs Deb
    - En abscisse : les dates au format JJ/MM allant du 1er janvier au 31 décembre. Sans faire apparaître l'année
    --> Sachant que j'ai plusieurs valeurs Deb pour une même date ... ? (Cf. FichierTexte.txt en pièce jointe)


    Merci à tous !

    Fichiers attachés Fichiers attachés

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Au contraire, mieux vaut une question bien détaillée, aussi longue soit-elle

    Voici une solution avec le couple unique - accumarray :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [years,~,ic]= unique(YY);
     
    hold all
    accumarray(ic(:), (1:numel(YY)).', [numel(years) 1], ...
        @(idx) plot(datenum([zeros(size(idx)),MM(idx),JJ(idx)]),Deb(idx)));
    datetick('x', 'dd/mm')
    legend(num2str(years))
    Je mets ici les données des années à zéros dans datenum afin de revenir à chaque fois au début.

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Merci Winjerome !

    Est-ce que tu pourrais m'expliquer comment fonctionne ton code ? J'ai regardé dans l'aide de Matlab mais je ne comprends pas tout. Je voudrais pouvoir, par la suite, changer les lignes en cercle "o" (ou autre) et contrôler ce qui apparaît dans la légende (je veux juste un nuage de point unicolore, les années ne doivent pas intervenir dans la légende).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [years,~,ic]= unique(YY);
    Je ne comprends pas le détail de cette ligne. Il me semble qu'elle me permet d'identifier YY comme étant l'année unique pour toute mes données mais je ne sais pas ce que signifie ic ... et ~ signifie "non" ?

    Dans l'aide Matlab :
    % [C,IA,IC] = UNIQUE(A) also returns index vectors IA and IC such that
    % C = A(IA) and A = C(IC)
    --> IA ? IC ? je ne comprends pas.



    Dans l'aide Matlab :
    % holds the plot and the current color and linestyle so
    % that subsequent plotting commands will not reset the color and
    % linestyle.

    Cela signifie que je ne peux pas modifier la présentation du graphe ? Ou qu'il faut que je trouve une commande pour le faire avant ? Quel intérêt ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    accumarray(ic(:), (1:numel(YY)).', [numel(years) 1], ...
        @(idx) plot(datenum([zeros(size(idx)),MM(idx),JJ(idx)]),Deb(idx)));
    Dans l'aide de Matlab :
    %NUMEL Number of elements in an array or subscripted array expression.
    % N = NUMEL(A) returns the number of elements, N, in array A.

    Donc, si je suis à peu près, accumarray permet de grouper/juxtaposer/assembler (...) les colones (":") de "ic", en fonction de l'année YY : chaque année YY génèrera une nouvelle colonne dans l'array ? Ce n'est pas clair pour moi. Et qu'est-ce que "@(idx)" ? Je ne trouve rien à ce sujet ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    datetick('x', 'dd/mm')
    legend(num2str(years))
    Ca je comprends. datestick permet de choisir le format de date de l'axe des abscisses et legend(num2str(years)) permet de mettre en place la légende des années ...

    Merci d'avance pour tes commentaires !

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Pour enlever la légende des années, j'ai supprimé la ligne "legend(num2str(years))"

    Pour enlever les lignes, et mettre des "o" à la place, et engardant une couleur pas année (sans légende), j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [years,~,ic]= unique(YY);
     
    hold all
    accumarray(ic(:), (1:numel(YY)).', [numel(years) 1], ...
        @(idx) plot(datenum([zeros(size(idx)),MM(idx),JJ(idx)]),Deb(idx)),'o');
    datetick('x', 'dd/mm')
    Mais il n'y a plus qu'une ligne qui apparait ... et pas de "o" :/ Je ne pige rien

    Je viens de rajouter un exemple de ce que je dois faire en pièce jointe ca devrait être plus clair que des mots mal choisi !
    Images attachées Images attachées  

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [years,~,ic]= unique(YY);
    Cette ligne retient dans years les valeurs uniques contenues dans YY, autrement dit dans notre cas, les années/valeurs [1980 1981 1982 1983 1984].
    Le deuxième argument (IA dans la doc), je n'en ai pas besoin, je mets donc le caractère spécial ~ pour dire à MATLAB que je ne m'en sert pas, ce qui me permet de prendre le troisième argument ic, vecteur d'indices qui permettent de faire l'opération inverse : YY = years(ic), et qui va me servir dans la fonction accumarray qui peut se résumer plus lisiblement à cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for k = 1:numel(years)
        idx = find(ic==k); % On trouve les indices qui correspondent à l'année years(k)
        % find est ici inutile, mais c'est pour garder la cohérence avec mon code précédent
        % Et on les utilisent pour retrouver les dates et données de cette année : 
        dates = datenum( [zeros(size(idx)) MM(idx) JJ(idx)] );
        donnees = Deb(idx);
        plot(dates, donnees)
    end
    Dans ic, les années/valeurs correspondant à years(1) sont toutes à 1, celles correspondant à years(2) sont toutes à 2, etc. La fonction accumarray utilise ce fait pour faire des regroupements de toutes les valeurs vecteur d'indices (1:numel(YY)).' correspondant à ic == 1, puis ic == 2, etc. en exécutant la fonction anonyme (avec le symbole @) que j'ai passée sur ces indices regroupés.

    Permet, dans un premier temps de superposer les prochaines courbes qui seront tracées, mais aussi de faire varier à chaque nouveau tracé sa couleur. Pour en savoir plus, tu peux regarder ce sujet de la FAQ : Comment associer une couleur unique à chaque courbe tracée ?

    Pour ce qui est du tracé que tu cherches à obtenir, c'est dans les propriétés des objets Line que tu crées qu'il faut regarder, autrement dit, dans les paramètres que tu donnes à la fonction plot.
    Concernant ton dernier code, attention à l'endroit où tu places ,'o' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @(idx) plot(datenum([zeros(size(idx)),MM(idx),JJ(idx)]),Deb(idx)),'o');
    là c'est un paramètre de acccumarray et non plot : une parenthèse trop loin

    Par contre, un objet Line ne peut avoir qu'une seule couleur, si tu veux donc ce trait noir, il faudra un second appel à plot. Une astuce pour permettre une deuxième appel dans la fonction anonyme peut-être de les grouper dans un tableau de cellules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        @(idx) { plot(...)   plot(...)}
    Je te laisse regarder les propriétés que tu peux régler en tapant docsearch('line properties'), 'LineWidth' entre autres.

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup pour tes explications
    Elles m'ont bien aidées.

    J'ai trouvé comment obtenir ce que je veux du coup, il m'a fallu utiliser "scatter" (qui veut dire "nuage de points") au lieu de plot.
    Du coup, tout le reste me permet d'obtenir automatiquement une couleur par année, sans forcément afficher la légende sur le graphe (en vrai j'ai une 20aine d'années ....).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    hold all % holds the plot and the current color and linestyle so
    %   that subsequent plotting commands will not reset the color and
    %   linestyle.
     
    accumarray(ic(:), (1:numel(YY)).', [numel(years) 1], ... % ACCUMARRAY construct an array by accumulation
         @(idx) scatter(datenum([zeros(size(idx)),MM(idx),JJ(idx)]),Deb(idx)));
     %En fait il faut utiliser la fonction scatter au lieu de plot, car scatter
     %trace les nuages de points alors que plot fait des lignes.
    Maintenant je n'ai plus qu'à créer une matrice pour ne garder que la valeur max pour chaque jour de l'année pour tracer la courbe "MAX" idem pour min et Moy .... Mais ca c'est un autre sujet

    Encore merci !!

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. librairie pour créer des graphes
    Par hogan dans le forum Windows Forms
    Réponses: 7
    Dernier message: 25/08/2009, 16h14
  2. Réponses: 2
    Dernier message: 04/10/2007, 00h48
  3. Réponses: 4
    Dernier message: 21/06/2007, 01h11
  4. Réponses: 4
    Dernier message: 17/04/2007, 19h04
  5. Réponses: 9
    Dernier message: 16/02/2007, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo