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 :

Bandes en arrière plan dont la couleur dépend d'un paramètre


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Bandes en arrière plan dont la couleur dépend d'un paramètre
    Bonjour à toutes et à tous !

    C'est mon premier post sur ce forum (et surement pas le dernier !).
    Je voudrais pouvoir sur un même graphique tracer une courbe, et afficher en arrière plan des bandes dont la couleur représente l'évolution d'un autre paramètre...
    Je pensais essayer avec un plot3 "vu de haut" + tracer les points de ma courbe plus haut que la surface tracée, ou essayer avec des histogrammes successifs + un plot de ma courbe par dessus, mais dans les deux cas, ça me parait un peu capillotracté...


    Y a-t-il une solution plus simple ? Que me conseillez-vous ?

    Merci d'avance !

    Mathieu

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    J'ai du mal à visualiser ce que tu veux : pourrais-tu nous faire un dessin ?

    Et éventuellement nous montrer des bouts de code que tu aurais essayés en expliquant les problèmes rencontrés.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Essai réussi...
    Je vais essayer de préciser ma pensée : Ce que je voudrai, c'est pouvoir afficher un paramètre sous forme de courbe, et en arrière-plan pouvoir coder la couleur en fonction de l'écart-type sur ce paramètre.

    Donc voila le résultat, qui sera effectivement beaucoup plus parlant, mais ça rame encore beaucoup! Alors voila le code, fais à grand coup de truelle... y a-t-il un moyen d'accélerer la chose ?

    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
    41
    42
    43
    44
    45
    46
    47
    48
     
    clc
     
    % Partie calcul 
    data_dir_in = pwd;
    filename_in = sprintf('\\tmp\\param.mat');
    load(fullfile(data_dir_in, filename_in), 'transRatioSigma', 'transRatio');
     
    transRatioSigma2 = sqrt(transRatioSigma)/mean(transRatio);
     
    transRatioSigma3 = zeros(2,length(transRatioSigma2));
    transRatioSigma3(1,:) = transRatioSigma2;
    transRatioSigma3(2,:) = transRatioSigma2;
     
     
     
    %% LA COMMENCE LE PROBLEME
     
    figure('Name','Energie transverse')
    load('backgroundCM', 'mycmap')
     
    [XRange, YRange] = meshgrid(linspace(0, size(transRatioSigma3, 2)/50, size(transRatioSigma3, 2)),...
        [0 1]);
     
    tMin = min(XRange(1,:));
    tMax = max(XRange(1,:));
    aMin = min(YRange(:,1));
    aMax = max(YRange(:,1));
     
    %subplot(3,1,3)
     
    %set(gcf,'CurrentAxes',axes1);
    surf(XRange, YRange, abs(transRatioSigma3(:,:))); shading flat; material([0.4,0.6,0.5,30]);
    set(h,'Colormap',mycmap);
    beta = .5; brighten(beta);
    hold on;
    for k=1:10:length(transRatio)
        plot3(k/50,transRatio(k), 1.1, 'b.');
    end
     
    xlabel('Temps (s)');
    ylim([aMin aMax]); xlim([tMin tMax]); %if ~onlyVectorsFlag, caxis([0 cmax]), end
    view([25 90]);colorbar('location','WestOutside');
     
    plot(transRatioSigma);
    hold off
     
    end
    Et le résultat en pièce jointe



    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Si j'ai bien compris, ton affichage est en 2-D, donc pourquoi utiliser PLOT3 ?
    Si c'est juste un problème de devant/derrière, 2 solutions :
    - tracer en 1er ce qui sera à l'arrière plan (MATLAB fait les tracés les uns par dessus les autres)
    - tracer dans n'importe quel ordre puis organiser à l'aide la fonction UISTACK.

    On peut aussi optimiser.
    Si transRatio est bien un vecteur (taille 1*N ou N*1), on peut par exemple faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    hold on;
    % for k=1:10:length(transRatio)
    %     plot3(k/50,transRatio(k), 1.1, 'b.');
    % end
    k=1:10:length(transRatio);
    plot(k,transRatio(k),'b. ');

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'utilise Plot3 parce que c'est le seul moyen que j'ai trouvé pour faire "l'arrière-plan" en couleur. Il doit y avoir un meilleur moyen, non ?

  6. #6
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    C'est ce que j'ai expliqué dans mon post précédent.
    Par contre tu as aussi l'utilisation du SURF qui est étrange.

    Le truc c'est que ce n'est pas facile de tester sans aucun donnée.
    As-tu moyen de les mettres en pièce jointe ici (dans un .zip ou un .rar) ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Oups...
    Bien sur, voila les fichiers en pièce jointe, avec le code modifié

    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
    41
    42
    43
    44
    45
    46
    47
    function scratch_function()
     
    clc
     
    data_dir_in = pwd;
    filename_in = sprintf('\\tmp\\param.mat');
    load(fullfile(data_dir_in, filename_in), 'transRatioSigma', 'a');
     
    transRatioSigma2 = sqrt(transRatioSigma)/mean(a);
     
     
    %% LA COMMENT LES PROBLEMES
     
    figure('Name','Energie transverse')
     
    transRatioSigma3 = zeros(2,length(transRatioSigma2));
    transRatioSigma3(1,:) = transRatioSigma2;
    transRatioSigma3(2,:) = transRatioSigma2;
    load('backgroundCM', 'mycmap')
     
    [XRange, YRange] = meshgrid(linspace(0, size(transRatioSigma3, 2)/50, size(transRatioSigma3, 2)),...
        [0 1]);
     
    tMin = min(XRange(1,:));
    tMax = max(XRange(1,:));
    aMin = min(YRange(:,1));
    aMax = max(YRange(:,1));
     
    %subplot(3,1,3)
     
    %set(gcf,'CurrentAxes',axes1);
    surf(XRange, YRange, abs(transRatioSigma3(:,:))); shading flat; material([0.4,0.6,0.5,30]);
    set(h,'Colormap',mycmap);
    beta = .5; brighten(beta);
    hold on;
    k=1:10:length(transRatio);
    plot3(k./50,transRatio(k), linspace(1.1, 1.1, length(k)), 'b.');
     
     
    xlabel('Temps (s)');
    ylim([aMin aMax]); xlim([tMin tMax]); %if ~onlyVectorsFlag, caxis([0 cmax]), end
    view([25 90]);colorbar('location','WestOutside');
     
    plot(transRatioSigma);
    hold off
     
    end

    Sinon, il y a erreur dans mon post précédent, c'est "surf" que j'utilise pour faire l'arrière plan, et le "plot3" pour ma courbe. Je vais voir ce que je peux tirer du Uistack.

    Merci !

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Si tu n'arrives pas à joindre les fichiers (car là ils n'y sont pas), au pire tu peux donner toutes les tailles de toutes les variables, en montrant ce que retourne la commande suivante placée à la fin de ton code :

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Désolé, pourtant le forum m'indique que 429 ko sont occupés, ce qui correcpond à la taille du zip. J'ai l'impression d'avoir encore un peu de mal avec les pièces jointes... Voila le résultat du whos

    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
      Name                   Size                Bytes  Class     Attributes
     
      XRange                 2x30001            480016  double              
      YRange                 2x30001            480016  double              
      a                      1x30001            240008  double              
      aMax                   1x1                     8  double              
      aMin                   1x1                     8  double              
      b                      1x30001            240008  double              
      beta                   1x1                     8  double              
      data_dir_in            1x24                   48  char                
      filename_in            1x14                   28  char                
      h                      1x1                     8  double              
      k                      1x3001              24008  double              
      mycmap                64x3                  1536  double              
      tMax                   1x1                     8  double              
      tMin                   1x1                     8  double              
      transRatio             1x30001            240008  double                 
      transRatioSigma3       2x30001            480016  double


    et puis le code correct (erreur précédente)


    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    function scratch_function()
     
    clc
     
    data_dir_in = pwd;
    filename_in = sprintf('\\tmp\\param.mat');
    load(fullfile(data_dir_in, filename_in), 'a', 'b');
     
    transRatio=a;
    transRatioSigma=b;
    transRatioSigma2 = sqrt(transRatioSigma)/mean(transRatio);
     
     
    %% LA COMMENCENT LES PROBLEMES
     
    figure('Name','Energie transverse')
     
    transRatioSigma3 = zeros(2,length(transRatioSigma2));
    transRatioSigma3(1,:) = transRatioSigma2;
    transRatioSigma3(2,:) = transRatioSigma2;
    load('backgroundCM', 'mycmap')
     
    [XRange, YRange] = meshgrid(linspace(0, size(transRatioSigma3, 2)/50, size(transRatioSigma3, 2)),...
        [0 1]);
     
    tMin = min(XRange(1,:));
    tMax = max(XRange(1,:));
    aMin = min(YRange(:,1));
    aMax = max(YRange(:,1));
     
    %subplot(3,1,3)
     
    %set(gcf,'CurrentAxes',axes1);
    surf(XRange, YRange, abs(transRatioSigma3(:,:))); shading flat; material([0.4,0.6,0.5,30]);
    set(h,'Colormap',mycmap);
    beta = .5; brighten(beta);
    hold on;
    k=1:10:length(transRatio);
    plot3(k./50,transRatio(k), linspace(1.1, 1.1, length(k)), 'b.');
     
     
    xlabel('Temps (s)');
    ylim([aMin aMax]); xlim([tMin tMax]); %if ~onlyVectorsFlag, caxis([0 cmax]), end
    view([25 90]);colorbar('location','WestOutside');
     
    plot(transRatioSigma);
    hold off
    whos
    end


    La question est donc : par quoi puis-je remplacer mon surf pour n'utiliser que des objets 2D ?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Code définitif
    Bonjour !

    Voila le code définitif que je vais utiliser, pour ceux que ça interesse :

    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
    41
    42
    43
    function scratch_function()
     
    clc
     
    data_dir_in = pwd;
    filename_in = sprintf('\\tmp\\param.mat');
    load(fullfile(data_dir_in, filename_in), 'a', 'b');
     
    transRatio=a;
    transRatioSigma=b;
    transRatioSigma2 = sqrt(transRatioSigma)/mean(transRatio);
     
    h=figure('Name', 'TransRatio et ecart-type');
     
     
    %%
     
    h=figure('Name','Energie transverse');
     
    transRatioSigma3 = zeros(2,length(transRatioSigma2));
    transRatioSigma3(1,:) = transRatioSigma2;
    transRatioSigma3(2,:) = transRatioSigma2;
    load('backgroundCM', 'mycmap')
     
    [XRange, YRange] = meshgrid(linspace(0, size(transRatioSigma3, 2)/50, size(transRatioSigma3, 2)),...
        [0 1]);
     
    tMin = min(XRange(1,:));
    tMax = max(XRange(1,:));
    aMin = min(YRange(:,1));
    aMax = max(YRange(:,1));
     
    surf(XRange, YRange, abs(transRatioSigma3(:,:))); shading flat; material([0.4,0.6,0.5,30]);
     
    beta = .5; brighten(beta);
    hold on;
    k=1:20:length(transRatio);
    plot3(k./50,transRatio(k), linspace(1.1, 1.1, length(k)), 'b-');
     
     
    xlabel('Temps (s)');
    ylim([aMin aMax]); xlim([tMin tMax]); %if ~onlyVectorsFlag, caxis([0 cmax]), end
    view([25 90]);colorbar('location','WestOutside');

    Ce petit code permet de produire une aide à la visualisation de paramètres, en affichant par exemple la courbe d'une moyenne (paramètre a), et en couleur d'arrière plan l'écart type (paramètre b).

    Le point noir de ce code, c'est qu'il utilise un surf, et donc une fonction 3D, là on il devrait être possible de n'utiliser que du 2D. C'est néanmoins un code assez léger, et à moins d'avoir une illumination, je classe ce post comme résolu.

    Merci à toi, Caro-Line !

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Une solution avec un objet Image en arrière-plan :

    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
    n = 10;
    x = 1:n; 
    y = rand(1,n)*5;
    e = rand(1,n);
     
    ni = 1000;
    xi = linspace(x(1),x(end),ni);
    ei = interp1(x,e,xi,'linear');
     
    figure
    colormap cool
     
    errorbar(y,e)
     
    xl = get(gca,'xlim');
    yl = get(gca,'ylim');
     
    hold on
     
    im = image('xdata',[x(1) x(end)],'ydata',yl, ...
        'cdata',ei,'cdatamapping','scaled','alphadata',.5);
    uistack(im,'bottom')
     
    set(gca,'xlim',xl,'ylim',yl)
    La palette de couleur peut être modifiée , voir la documentation de COLORMAP

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Super ! J'avais pas du tout pensé à créer une image de toute pièce à partir de rien... Effectivement, comme ça, ça devient beaucoup moins lourd et plus facile à implémenter...

    Merci !

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

Discussions similaires

  1. Alterner couleur arrière plan dans un rapport
    Par silversatch62 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 20/07/2006, 12h07
  2. Réponses: 1
    Dernier message: 18/07/2006, 23h43
  3. Modifier la couleur d'arrière plan des dossiers
    Par FRED.G dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 26/04/2006, 14h09
  4. couleur d'arrière plan
    Par PAUL87 dans le forum Access
    Réponses: 4
    Dernier message: 27/12/2005, 12h23
  5. Modifier couleurs arrière-plan dossiers
    Par marcus333 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 16/09/2005, 14h19

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