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 :

Placements divers sur un graphique. [Débutant]


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Placements divers sur un graphique.
    Bonjour à tous,

    J'ai quelques soucis avec une représentation graphique. Je dispose de deux courbes (valeurs_Imp1_normale et valeurs_Imp1) que je plot et de deux droites horizontale (y=seuil1 et y=seuil2) que je plot aussi sur les deux graph. Je souhaiterais pouvoir mettre un texte sur les droites seuil1 et seuil2 (qui sont représentées en rouge) et je voudrais que ce texte soit rouge également. Voici le code :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    figure(1)
     
    subplot(2,1,1)
    plot(valeurs_Imp1_normale)
    hold on
    plot([0 90000], [seuil1 seuil1],'r')
    hold on
    text(85000,seuil1-2,'seuil1')
    hold on
    plot([0 90000], [seuil2 seuil2],'r')
    hold on
    text(85000,seuil2+2,'seuil2')
    hold on
    title('Impédance typique normale')
    xlabel('indices')
    ylabel('valeurs impédances')
    subplot(2,1,2)
    plot(valeurs_Imp1)
    hold on
    plot([0 90000], [seuil1 seuil1],'r')
    hold on
    text(85000,seuil1-2,'seuil1')
    hold on
    plot([0 90000], [seuil2 seuil2],'r')
    hold on
    text(85000,seuil2+2,'seuil2')
    hold on
    title('Impédance après calcul itératif des seuils')
    xlabel('indices')
    ylabel('valeurs impédances')
    Cependant comme cela le texte est noir et il n'est pas bien placé comme en atteste la figure suivante :



    Donc comment le mettre en rouge et juste un peu au-dessus des droites rouges ?

    De plus je voudrais faire la chose suivante mais j'ignore si c'est possible simplement : je voudrais mettre en surbrillance, pour la première courbe par exemple, toute la partie du plan inférieure à la droite seuil1 dans une certaine couleur et de même toute la partie du plan supérieure au seuil2 dans une autre couleur. Pour être précis, je voudrais simplement changer la couleur du fond blanc des courbes : vert pour la partie inférieure à seuil1 et jaune pour celle supérieure à seuil2 par exemple. Est-ce réalisable ?

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    pour mettre en rouge, il suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text(85000,seuil1-2,'seuil1','Color','r')
    pour ce qui est de la position, une petite lecture de l'aide me fait dire que les deux premiers arguments de la fonction text sont les positions x et y du texte. Il faut donc que tu remplaces seuil1-2 par une autre valeur, genre seuil1+3 ou je ne sais pas , à tester.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Tu peux aussi te servir de la propriété VerticalAlignment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text(...,...,...,'verticalalignment','bottom')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    Pour tn autre requête, regarde ce que peut donner la fonction area(). en adaptant un peu je pense que ca peut marcher pas mal avec ce que tu veux.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Dombrai, effectivement j'ai seulement du ajuster un peu mieux les ordonnées pour obtenir la position voulue. Je ne connaissais pas la fonction area mais après avoir consulté l'aide, cette fonction semble faire un plot sur une partie d'une courbe, par exemple valeurs_Imp1 dans mon exemple. En fait le souci c'est que finalement ce que je veux faire est indépendant des courbes : j'ai par exemple besoin de colorer d'une certaine couleur le fond blanc pour tout ce qui est au-dessus du seuil2 et de même en dessous du seuil1. A la limite je n'ai pas besoin de compliquer la question avec mes courbes : je veux simplement partager le plan en plusieurs zones de couleurs différentes.

    J'ai toutefois essayer quelque chose comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    area(valeurs_Imp1(find(valeurs_Imp1>seuil1)),'g')
    Mais cela ne colorie pas en vert les valeurs de valeurs_Imp1 supérieures au seuil1. Cela revient au même que de faire plot à la place de area sauf qu'avec area la zone concernée est en quelque sorte zoomée. Bref, quoi qu'il en soit ce que je veux faire ne dépend que de seuil1 et seuil2 et non des courbes.

    Merci Dut, je me suis finalement débrouillé avec l'ajustement des ordonnées. Saurais-tu en revanche comment colorer le plan de trois manières différentes comme je l'expose un peu plus haut dans ce message ?

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    faut que tu fasses ton aera par sur tes valeurs impedance_trucmuche mais uniquements sur tes valeurs seuil.

    voici par exemple un joli petit drapeau allemand

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    figure(2001)
    Y = [1 1 1;
        1 1 1;
        1 1 1];
    X = [0 0 0;
        50 50 50;
        100 100 100;];
    h = area(X,Y);
    set(h(1),'facecolor',[255/256 255/256 52/256]);
    set(h(2),'facecolor',[1 0 0]);
    set(h(3),'facecolor',[0 0 0]);
    voila, en modifiant un peu (tu mets tes valeurs seuil1 et seuil2 dans la matrice Y par exemple), tu devrai pouvoir t'en tirer

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci beaucoup Dombrai pour ce bel effort. Je comprends le principe derrière cette fonction, en revanche en ayant simplement copier coller le code et en l’exécutant je n'obtiens pas de drapeau mais une une figure intégralement noire. C'est embêtant car voir le résultat m'aiderait à comprendre le travail de la fonction set, fonction qui, apparemment, chez moi est à l'origine de ce fond noir que j'ai. En fait il semble bien que la dernière ligne ne mets pas h(3) à 0 mais l'ensemble de la figure et les deux autres lignes de set ne font rien (en tout cas chez moi).

    EDIT:

    En y réfléchissant, la tâche est encore plus ardue puisque j'ai besoin que la partie de courbe bleue reste visible (éventuellement dans une autre couleur). Pour résumé, la figure se présente sous la forme suivante :



    J'ai besoin de mettre dans une couleur tout ce qui est au-dessus de seuil gaz, dans une autre ce qui est entre seuil2 et seuil gaz et enfin dans une dernière couleur ce qui est en dessous de seuil1, tout cela en ne sacrifiant pas la courbe bleue. Bref, à moins que vous voyiez une solution, je vais essayer de me pencher sur autre chose, à savoir rajouter des lignes verticales pour délimiter les domaines qui m'intéresse.

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bon j'ai réussi à afficher des lignes verticales comme suit avec les plots situés en [40000 40000]:

    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
    23
    figure(2)
    plot(valeurs_Imp1_normale)
    hold on
    plot([0 90000], [seuil1 seuil1],'r')
    hold on
    text(85000,seuil1-400,'seuil1','Color','r')
    hold on
    plot([0 90000], [seuil2 seuil2],'r')
    hold on
    text(85000,seuil2+400,'seuil2','Color','r')
    hold on
    plot([0 90000], [5001 5000],'r')
    hold on
    text(85000,5000+400,'seuil gaz','Color','r')
    hold on
    plot([40000 40000],[5000 15000],'g')
    hold on
    plot([40000 40000],[seuil2 5000],'c')
    hold on
    plot([40000 40000],[-5000 seuil1],'m')
    title('Impédance typique normale et domaines')
    xlabel('indices')
    ylabel('valeurs impédances')
    Cependant je voudrais mettre ces trois lignes verticales en gras et même en gras pointillé. Ce que j'appelle "gras" c'est augmenter la grosseur du trait. Mais quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot([40000 40000],[5000 15000],'g','-')
    ne marche pas. Comment pourrais-je donc mettre en pointillée ces lignes et augmenter leur grosseur ? Voici l'allure pour vous rendre compte (il s'agit des lignes verticales verte, bleu cyan et mauve) :



    En fait l'idéal serait de mettre des traits avec des flèches au bout pour délimiter les trois domaines mais est-ce possible ?

    Enfin je souhaiterais colorer en vert la partie de la courbe bleue située entre seuil1 et seuil2. J'ai essayé quelque chose comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A=find(valeurs_Imp1_normale>=seuil1 & valeurs_Imp1_normale<=seuil2);
    plot(valeurs_Imp1_normale(A),'g')
    Mais cela ne fonctionne pas sur la figure précédente puisque seule une partie de la courbe bleue est colorée. En fait la courbe bleue contient environ 80000 valeurs et dans le A j'en trouve beaucoup moins ce qui explique peut-être le problème.

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    La solution que je t'avais proposé precedemment marche tres bien, il faut juste que tu l'adaptes.

    essaye de mettre ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Y = [seuil1 seuil2-seuil1 5000-seuil2 10000;
        seuil1 seuil2-seuil1 5000-seuil2 10000];
    X = [0 0 0 0;
        90000 90000 90000 90000;];
    h = area(X,Y);
    set(h,'basevalue',-5000)
    set(h(1),'facecolor',[242/256 247/256 155/256]);%jaune pale
    set(h(2),'facecolor',[1 0 0]);%vert pale
    set(h(3),'facecolor',[0.8 0.8 0.8]);%bleu pale
    set(h(4),'facecolor',[0.4 0.5 0.5]);%coouleur moche
     
    hold on
    avant tes plots.

    chez moi ca marche nickel
    Images attachées Images attachées  

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Je te remercie beaucoup Dombrai pour ton aide car j'avoue que je ne saurais pas bien faire cela tout seul. J'ai donc essayé d'utiliser ce que tu préconises avec le code suivant :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    figure(2)
    Y = [seuil1 seuil2-seuil1 5000-seuil2 10000;
        seuil1 seuil2-seuil1 5000-seuil2 10000];
    X = [0 0 0 0;
        90000 90000 90000 90000;];
    h = area(X,Y);
    set(h,'basevalue',-5000)
    set(h(1),'facecolor',[242/256 247/256 155/256]);%jaune pale
    set(h(2),'facecolor',[1 0 0]);%vert pale
    set(h(3),'facecolor',[0.8 0.8 0.8]);%bleu pale
    set(h(4),'facecolor',[0.4 0.5 0.5]);%coouleur moche
    hold on
    plot(valeurs_Imp1_normale,'b')
    hold on
    hold on
    plot([0 90000], [seuil1 seuil1],'m','linewidth',2)
    hold on
    text(85000,seuil1-400,'{\bfseuil1}','Color','m')
    hold on
    plot([0 90000], [seuil2 seuil2],'c','linewidth',2)
    hold on
    text(85000,seuil2+400,'{\bfseuil2}','Color','c')
    hold on
    plot([0 90000], [5001 5000],'g','linewidth',2)
    hold on
    text(85000,5000+400,'{\bfseuil gaz}','Color','g')
    hold on
    hold on
    text(84000,seuil2-260,'{\bfDomaine}','Color','k')
    text(82000,seuil2-560,'{\bfLigne de base}','Color','k')
    text(82000,seuil2-860,'{\bfentre les seuils}','Color','k')
    text(20020,seuil2-2100,'{\bfDomaine}','Color','m')
    text(20020,seuil2-2400,'{\bfLiquide (<seuil1)}','Color','m')
    text(20020,seuil2+3500,'{\bfDomaine}','Color','c')
    text(20020,seuil2+3200,'{\bfMelange (>seuil2 & <seuil gaz)}','Color','c')
    text(20020,seuil2+8500,'{\bfDomaine}','Color','g')
    text(20020,seuil2+8200,'{\bfGazeux (>seuil gaz)}','Color','g')
    title('Impédance typique normale et domaines')
    xlabel('indices')
    ylabel('valeurs impédances')
    J'ai un peu modifié ce que je voulais faire et j'ai trouvé comment mettre en gras certaines choses. Voici le résultat :



    Tout serait parfait si on parvenait à modifier les couleurs : vert clair en haut, bleu clair à la place du gris, blanc à la place du rouge et enfin rose tout en bas. Il faut donc modifier les vecteurs des set mais je ne comprends pas bien comment tu as définit les couleurs dedans. Enfin si on pouvais modifier aussi la couleur de la courbe bleue (en l'occurence valeurs_Imp1_normale) ce serait fantastique : qu'elle soit de la même couleur que les rectangles colorés mais cela je n'y arrive vraiment pas. Il faudrait pourtant juste dire, par exemple pour la partie du bas que toute la partie de valeurs_Imp1_normale inférieure à seuil1 est rose mais apparemment ce n'est pas simple.

  11. #11
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    Ce que tu rentres dans la propriété facecolor c'est les coordonées d'une couleur en système RVB, codées entre 0 et 1 pour chacune des coordonnées Rouge, Vert et Bleu.

    Pour rentrer les valeurs qui t'interessent, va sur le magnifique logiciel dénommé Paint, puis utilise la palette de couleurs : Paint te fourni les coordonées RVB de la couleur que tu as choisie codee entre 0 et 255. divise simplement ces coefficients par 255 et tu es bon.

    Je pense que même sur internet tu doit pouvoir trouver des nuanciers qui te donnent les coordonnées RVB d'une couleur choisie

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Dombrai merci beaucoup pour tes clarifications, je commence à comprendre. Je me suis servis de cette très bonne page pour remplir les vecteurs de couleurs : Table RGB et avec le code suivant j'obtiens la figure ci-dessous :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    figure(2)
    Y = [seuil1 seuil2-seuil1 5000-seuil2 10000;
        seuil1 seuil2-seuil1 5000-seuil2 10000];
    X = [0 0 0 0;
        90000 90000 90000 90000;];
    h = area(X,Y);
    set(h,'basevalue',-5000)
    set(h(1),'facecolor',[255/256 187/256 255/256]);%rose
    set(h(2),'facecolor',[1 1 1]);%blanc
    set(h(3),'facecolor',[127/256 255/256 212/256]);%bleu cyan
    set(h(4),'facecolor',[127/256 255/256 0]); %vert
    hold on
    plot(valeurs_Imp1_normale,'b')
    hold on
    hold on
    plot([0 90000], [seuil1 seuil1],'k','linewidth',2)
    hold on
    text(85000,seuil1-400,'{\bfseuil1}','Color','k')
    hold on
    plot([0 90000], [seuil2 seuil2],'k','linewidth',2)
    hold on
    text(85000,seuil2+400,'{\bfseuil2}','Color','k')
    hold on
    plot([0 90000], [5001 5000],'k','linewidth',2)
    hold on
    text(85000,5000+400,'{\bfseuil gaz}','Color','k')
    hold on
    hold on
    text(82000,seuil2-320,'{\bfLigne de base}','Color','k')
    text(82000,seuil2-620,'{\bfentre les seuils}','Color','k')
    text(20020,seuil2-2100,'{\bfDomaine}','Color','k')
    text(20020,seuil2-2400,'{\bfLiquide (<=seuil1)}','Color','k')
    text(20020,seuil2+3500,'{\bfDomaine}','Color','k')
    text(20020,seuil2+3200,'{\bfMelange (>=seuil2 & <=seuil gaz)}','Color','k')
    text(20020,seuil2+8500,'{\bfDomaine}','Color','k')
    text(20020,seuil2+8200,'{\bfGazeux (>seuil gaz)}','Color','k')
    title('Impédance typique normale et domaines')
    xlabel('indices')
    ylabel('valeurs impédances')


    Bref, cela me convient. La seule que je voudrais faire c'est changer la couleur de la courbe bleu (valeurs_Imp1_normale) entre les 4 domaines, en la mettant dans une couleur avoisinante du fond. C'est juste pour rendre plus "chic". Mais là rien à faire je n'y arrive pas. Dombrai tu aurais peut-être une idée miracle ? Le problème, comme je l'ai souligné plus saut, si par exemple je recherche les indices de valeurs_Imp1_normale <= à seuil1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=find(valeurs_Imp1_normale<=seuil1)
    J'obtiens certes les abscisses dont les ordonnées sont dans le domaine mauve les ordonnées étant valeurs_Imp1_normale(A) mais un plot de cette quantité dans une autre couleur (en rouge par exemple) ne marche pas car on obtient ceci :



    Je sais qu'il y a probablement un conflit d'échelles mais je ne vois pas comment le résoudre.

  13. #13
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    il faut appliquer ton filtre sur les abscisses et sur les ordonnées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(A,valeurs_Imp1_normale(A),'b')
    d'ailleurs tu n'as pas une base de temps à mettre en abscisse plutot que des indices ?

    enfin le find est inutile, A=valeurs_Imp1_normale<=seuil1 fait le même filtrage, en indexage logique plutôt que linéaire

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci le_fab ; en bas j'appelle "indice" des temps en fait. Il s'agit du nombre de points du vecteurs valeurs_Imp1_normale.

    J'ai donc essayé ce que tu proposes. Si je fais cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A=(valeurs_Imp1_normale<seuil1);
    A1=valeurs_Imp1_normale(A);
    Puis un plot(A,A1,'r') cela ne marche pas comme A possède 81691 élements et A1 2037 et donc j'obtiens une erreur m'indiquant que les abscisses et ordonnées doivent être en même nombre.. Si je conserve le find, la courbe obtenue passe par les points atteints par la courbe bleue mais ce n'est pas la courbe bleue qui a été mise en rouge. Voici le résultat :



    Comme tu voix la partie de la courbe bleue sous seuil1 est toujours là et la courbe rouge relie simplement les points de la courbe bleue entre eux. Bref, peut-être faudrait-il tracer dès le départ la courbe bleue de 4 couleurs différentes selon les domaine ? Mais je ne sais pas comment faire.

  15. #15
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    j'ai peut-être une idée, mais c'est pas très propre, voire même carrément cra-cra.
    teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Val_ind = zeros(1,numel(valeurs_Imp1_normale);
    A=(valeurs_Imp1_normale<seuil1);
    for i = 1:numel(valeurs_Imp1_normale)
        if all(A-i)~=0
            Val_ind(i) = seuil1;
        else
            Val_ind(i) = Valeurs(i);
        end
    end
    plot(Val_ind,'r');
    En gros c'est à peu pres la même chose que ce que le fab t'as proposé, sauf que je force les valeurs qui ne sont pas dans ton find a être égale à seuil1, et avec le nombre de points que tu as, je pense que ca peut faire illusion

    mais bon, hein, c'est pas joli-joli.

  16. #16
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    en général je fait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(A,valeurs_Imp1_normale(A),'b.')
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(A,valeurs_Imp1_normale(A),'b.','markersize',1)
    mais c'est vrai que si ton signal est très discontinu ca peut ne pas être terrible
    la solution ci dessus peut le faire aussi
    et sans boucle cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A=(valeurs_Imp1_normale<seuil1);
    val_ind = ones(size(valeurs_Imp1_normale))*seuil1;
    val_ind(A) = valeurs_Imp1_normale(A);

  17. #17
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci pour vos efforts le_fab et Dombrai.

    J'ai suivi le code de le_fab puisqu'il s'agit de la même idée que Dombrai sans boucle et dans mon code je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A=(valeurs_Imp1_normale<seuil1);
    val_ind = ones(size(valeurs_Imp1_normale))*seuil1;
    val_ind(A) = valeurs_Imp1_normale(A)
    plot(A,val_ind(A),'r.')
    Sans le find le problème reste le même : A est de la taille de valeurs_Imp1_normale tandis que val_ind est de la taille des points qui sont en dessous de seuil1 et le plot ne marche pas. En rajoutant un find, j'obtiens malheureusement sensiblement la même chose qu'au dessus, à savoir la courbe rouge qui relie les points de celle en bleue. Donc, effectivement, le résultat est sensiblement le même que la première version de le_fab. Le code complet est le suivant :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    figure(2)
    Y = [seuil1 seuil2-seuil1 5000-seuil2 10000;
        seuil1 seuil2-seuil1 5000-seuil2 10000];
    X = [0 0 0 0;
        90000 90000 90000 90000;];
    h = area(X,Y);
    set(h,'basevalue',-5000)
    set(h(1),'facecolor',[255/256 187/256 255/256]);%rose
    set(h(2),'facecolor',[1 1 1]);%blanc
    set(h(3),'facecolor',[127/256 255/256 212/256]);%bleu cyan
    set(h(4),'facecolor',[127/256 255/256 0]); %vert
    hold on
    plot(valeurs_Imp1_normale,'b')
    hold on
    hold on
    plot([0 90000], [seuil1 seuil1],'k','linewidth',2)
    hold on
    text(85000,seuil1-400,'{\bfseuil1}','Color','k')
    hold on
    plot([0 90000], [seuil2 seuil2],'k','linewidth',2)
    hold on
    text(85000,seuil2+400,'{\bfseuil2}','Color','k')
    hold on
    plot([0 90000], [5001 5000],'k','linewidth',2)
    hold on
    text(85000,5000+400,'{\bfseuil gaz}','Color','k')
    hold on
    plot(A,val_ind(A),'r.')
    hold on
    text(82000,seuil2-320,'{\bfLigne de base}','Color','k')
    text(82000,seuil2-620,'{\bfentre les seuils}','Color','k')
    text(20020,seuil2-2100,'{\bfDomaine}','Color','k')
    text(20020,seuil2-2400,'{\bfLiquide (<=seuil1)}','Color','k')
    text(20020,seuil2+3500,'{\bfDomaine}','Color','k')
    text(20020,seuil2+3200,'{\bfMelange (>=seuil2 & <=seuil gaz)}','Color','k')
    text(20020,seuil2+8500,'{\bfDomaine}','Color','k')
    text(20020,seuil2+8200,'{\bfGazeux (>seuil gaz)}','Color','k')
    title('Impédance typique normale et domaines')
    xlabel('indices')
    ylabel('valeurs impédances')
    Les hold on doivent certainement fausser le résultat.

    Bref je pense qu'il faut procéder autrement. Si vous voulez on peut oublier le contexte dans lequel je travaille. A mon avis, il faudrait déjà pouvoir représenter une courbe donnée de plusieurs couleurs différentes car c'est cela le fond du problème.

    Le truc c'est que, si par exemple je me donne une courbe représentée par un vecteur A et que je veux la tracer (plot(A)), il semble difficile d'adapter le tracé en fonction des abscisses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    close all
     
    A=[10 12 -5 6 9 20];
    figure
    plot(A(1:3),'r')
    hold on
    plot(A(4:end),'b')
    Ceci ne va pas tracer l'allure de A en rouge entre les abscisses 1 et 3, puis en bleu entre 4 et la fin. C'est au contraire deux courbes distinctes qui sont tracées ! Je pense que le problème vient du hold on et du fait qu'on trace effectivement deux courbes qui se superposent mais ce n'est pas ce que je cherchais à faire. De plus, faire cela est hors sujet en ce qui concerne mon problème qui consiste à faire la même chose mais par rapport aux ordonnées : tracer une courbe d'une couleur différente en fonction des ordonnées.

    Il faudrait donc plutôt, dès le départ tracer mon valeurs_Imp1_normale en rouge pour les ordonnées entre min(valeurs_Imp1_normale) et seuil1, puis en noir entre seuil1 et seuil2, en bleu entre seuil2 et seuil gaz et enfin en vert au-delà de seuil gaz. Ensuite je peux compléter avec les droites horizontales, couleurs de fonds, textes ect. Donc le problème : comment tracer dès le départ la courbe valeurs_Imp1_normale de quatre couleurs différentes ?

    EDIT:

    Je commence à voir le fond du problème : si par exemple je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A=[10 12 -5 6 9 20 -8 14 16 5 9 5 47 85 21 4 6];
    plot(A)
    A est un signal discret constitué de 17 valeurs : A(1)=10, A(2)=12 etc. Si je veux le colorer de trois façons différentes, par exemple pour ce qui est en-dessous de y=0 en rouge, entre y=0 et y=20 en bleue et au-dessus de y=20 en vert, je peux faire grossièrement comme suit :

    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
    A=[10 12 -5 6 9 20 -8 14 16 5 9 5 47 85 21 4 6];
     
    x=[1:length(A)];
     
    figure();
    for i = 1 : length(A)
        if A(i) < 0
            plot(x(i),A(i),'ro-');
            hold on;
        elseif A(i)>0 && A(i)< 20
            plot(x(i),A(i),'o-');
            hold on;
        else
            plot(x(i),A(i),'go-');
            hold on;
        end
    end
    MAIS, MATLAB ne restitue dans la couleur désirée que les 17 points du signal A et ne les "relie pas". Vous comprenez ? Qui a raison en fait ? Quand on fait plot(A) on obtient une vraie courbe continue et pas seulement ses 17 points alors qu'avec le code précédent on obtient une courbe discrète et non continue. Je pense donc que le conflit vient de là.

  18. #18
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Pour ceux qui cela intéresserait des éléments de réponses sont fournis sur cette page. En tout cas, on peut colorer de différentes couleurs les points formant une courbe mais il faut ensuite les relier ensuite pour faire faire "illusion" de continuité. Je n'ai pas vraiment réussi malgré les conseils donnés sur la page précédente mais il y a pas mal d'idées.

  19. #19
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Pour ma part, j'utiliserais cette solution : Comment tracer une ligne dont la couleur varie ? et celle-ci tracé conditionnel, comment faire ? comme base de départ
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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

Discussions similaires

  1. Zoom sur un graphique
    Par MeDioN dans le forum 2D
    Réponses: 9
    Dernier message: 16/01/2006, 11h42
  2. [MFC Visual C++]conseil sur affichage graphiques
    Par C++beginner dans le forum MFC
    Réponses: 6
    Dernier message: 10/01/2006, 06h47
  3. [VB.Net] Comment effacer des traits sur un graphique ?
    Par bert24 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/09/2005, 14h20
  4. [CR 8.5] Attribution couleur sur un graphique
    Par Silvinho42 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 30/06/2005, 15h00
  5. Demandes d'informations divers sur SGBD
    Par AlexB59 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 26/05/2005, 12h41

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