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

ODS et reporting Discussion :

[SGPLOT] Bien afficher ses légendes avec l'option GROUP et un DATTRMAP [ODS]


Sujet :

ODS et reporting

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut [SGPLOT] Bien afficher ses légendes avec l'option GROUP et un DATTRMAP
    Bonjour à tout le monde,

    Je réalise mes PROC SGPLOT en faisant un appel de series/scatter/etc pour chaque groupe que je souhaite représenter sur mon graphique. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROC SGPLOT;
    SERIES X = numero Y = moyenne_gr1 / lineattrs=(...) name="a";
    SERIES X = numero Y = moyenne_gr2 / lineattrs=(...) name="b";
     
    keylegend "a" "b" / position=...;
    RUN;
    Aujourd'hui j'aimerai plutôt passer par l'option GROUP qui permet de tracer autant de lignes que de groupes (plus pratique).
    Pour définir les couleurs de mes traits, les styles, les symboles pour les scatters, etc, je me sers d'un DATTRMAP.

    Mon problème intervient au moment de fixer la légende. J'ai l'impression que le DATTRMAP ne fonctionne plus.

    VOilà mon cide :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    data _donnees;
    input id visite valeur grp grp2;
    cards;
    1	1	50	1	1
    1	2	55	1	1
    1	3	50	1	1
    1	4	25	1	1
    2	1	25	2	2
    2	2	25	2	2
    2	3	29	2	2
    2	4	20	2	2
    3	1	85	1	3
    3	2	67	1	3
    3	3	90	1	3
    3	4	75	1	3
    4	1	15	2	3
    4	2	29	2	1
    4	3	18	2	2
    4	4	35	2	1
    ;
    run;
     
     
    proc sort data=_donnees;                                                                                                                    
    by visite grp;                                                                                                                              
    run;                                                                                                                                    
     
    proc means data=_donnees noprint;                                                                                                           
    by visite grp;                                                                                                                             
    var valeur; 
    output out=_out median=mediane q1=quartile1	q3=quartile3
    ;			 
    run;
     
    data _dattrmap;
    length id $15. markercolor $15. fillcolor $15.	linecolor $15. markersymbol $15.;
    /* Groupe */
    id="GRP";	value="1";	linecolor="green";	fillcolor="green";	markercolor="green";		markersymbol="circlefilled"; output;
    id="GRP";	value="2";	linecolor="blue";	fillcolor="blue";	markercolor="blue";			markersymbol="starfilled"; output;
    run;
     
     
    /* PROC SGPLOT sans rien */
    proc sgplot data=_out dattrmap=_dattrmap;
    xaxis type=linear;
    yaxis min=0 max=100;
    scatter x=visite y=mediane 	/ 	yerrorlower=quartile1                                                                                          
                               		yerrorupper=quartile3 
    								group = grp attrid=GRP;
     
    series x=visite y=mediane	/ 	group = grp attrid=GRP;
    run;
    /* Elle fonctionne/ */
     
    /* Je fais un PROC FORMAT pour mes groupes */
    proc format;
    value grpe
    	1	=	"Groupe 1"
    	2	=	"Groupe 2"
    ;
    run;
     
    /* SGPLOT ne fonctionne plus quand j'applique le format */
    proc sgplot data=_out dattrmap=_dattrmap;
    xaxis type=linear;
    yaxis min=0 max=100;
    scatter x=visite y=mediane 	/ 	yerrorlower=quartile1                                                                                          
                               		yerrorupper=quartile3 
    								group = grp attrid=GRP;
     
    series x=visite y=mediane	/ 	group = grp attrid=GRP;
    label grp = "Groupe";
    format grp grpe.;
    run;
    Comme vous pouvez le voir j'ai l'impression que l'application du format supprime tous les effets du DATTRMAP.

    J'ai essayé plein d'autres codes mais je ne veux pas vous submerger avec.
    En gros, j'ai essayé dans le DATTRMAP de faire d'autres ID avec comme VALUES "Groupe 1"/"Groupe 2", mais ça ne fonctionne pas non plus (ma variable est toujours numérique dans la table, je pense que c'est ça). Avec format ou sans format.

    Comme vous faites vos légendes vous ?

    Merci,

    alers


    --
    Ajout :

    Si je comprends bien, le VALUE de DATTRMAP doit être une valeur formattée. Quand je fais une PROC FORMAT pour créer "Groupe 1" et "Groupe 2" et mettre en VALUE "Groupe 1" et "Groupe 2", voilà l'avertissement que j'obtiens :
    "WARNING: Les doublons ne sont pas autorisés dans DiscreteAttrMap:
    G
    "

    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
    data _dattrmap;
    length id $15. markercolor $15. fillcolor $15.	linecolor $15. markersymbol $15.;
    /* Groupe */
    id="GRP";	value="1";	linecolor="green";	fillcolor="green";	markercolor="green";		markersymbol="circlefilled"; output;
    id="GRP";	value="2";	linecolor="blue";	fillcolor="blue";	markercolor="blue";			markersymbol="starfilled"; output;
    /* Groupe */
    id="GRPF";	value="Groupe 1";	linecolor="green";	fillcolor="green";	markercolor="green";		markersymbol="circlefilled"; output;
    id="GRPF";	value="Groupe 2";	linecolor="blue";	fillcolor="blue";	markercolor="blue";			markersymbol="starfilled"; output;
    run;
     
    proc format;
    value grpe
    	1	=	"Groupe 1"
    	2	=	"Groupe 2"
    ;
    run;
     
    proc sgplot data=_out dattrmap=_dattrmap;
    xaxis type=linear;
    yaxis min=0 max=100;
    scatter x=visite y=mediane 	/ 	yerrorlower=quartile1                                                                                          
                               		yerrorupper=quartile3 
    								group = grp attrid=GRPF;
     
    series x=visite y=mediane	/ 	group = grp attrid=GRPF name="a";
    keylegend "a" / position=topleft location=inside noborder;
    format grp grpe.;
    run;

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

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour,

    Alors déjà je vois sur le site de SAS que DATTRMAP et KEYLEGEND sont incompatibles. Y compris en 9.4. C'est dommage, j'espère qu'ils vont faire en sorte que cela fonctionne durant les prochaines mises à jour.

    En revanche ils n'indiquent rien concernant les formats mais ça ne fonctionne toujours pas de mon côté...

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Ton problème est-il résolu? Je t'ai mis ce que j'obtiens en pièce jointe, est-ce que c'est ça que tu souhaites obtenir?
    Images attachées Images attachées  

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

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    Oui c'est exactement ce que je souhaite obtenir. Tu as fait ça avec une PROC TEMPLATE ?

    Merci beaucoup,

    alers

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Non non, j'ai juste modifié ta table Dattrmap, quand tu utilises un format il faut mettre la valeur que tu donnes avec ton format dans ta table dattrmap. Puis l'option keylegend fonctionne très bien même en donnant un dattrmap (Je travail en SAS Studio mais c'est un 9.4)

    Voilà le code que j'ai utilisé :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    data _donnees;
    infile datalines expandtabs;
    input id visite valeur grp grp2;
    cards;
    1	1	50	1	1
    1	2	55	1	1
    1	3	50	1	1
    1	4	25	1	1
    2	1	25	2	2
    2	2	25	2	2
    2	3	29	2	2
    2	4	20	2	2
    3	1	85	1	3
    3	2	67	1	3
    3	3	90	1	3
    3	4	75	1	3
    4	1	15	2	3
    4	2	29	2	1
    4	3	18	2	2
    4	4	35	2	1
    ;
    run;
     
     
    proc sort data=_donnees;                                                                                                                    
    by visite grp;                                                                                                                              
    run;                                                                                                                                    
     
    proc means data=_donnees noprint;                                                                                                           
    by visite grp;                                                                                                                             
    var valeur; 
    output out=_out median=mediane q1=quartile1	q3=quartile3
    ;			 
    run;
     
    proc format;
    value grpe
    	1	=	"Groupe 1"
    	2	=	"Groupe 2"
    ;
    run;
     
     
    data _dattrmap;
    length id $15. markercolor $15. fillcolor $15.	linecolor $15. markersymbol $15.;
    /* Groupe */
    id="GRP";	value="Groupe 1";	linecolor="green";	fillcolor="green";	markercolor="green";		markersymbol="circlefilled"; output;
    id="GRP";	value="Groupe 2";	linecolor="blue";	fillcolor="blue";	markercolor="blue";			markersymbol="starfilled"; output;
    run;
     
     
    proc sgplot data=_out dattrmap=_dattrmap;
    xaxis type=linear;
    yaxis min=0 max=100;
    scatter x=visite y=mediane 	/ 	yerrorlower=quartile1                                                                                          
                               		yerrorupper=quartile3 
    								group = grp attrid=GRP name="a";
     
    series x=visite y=mediane	/ 	group = grp attrid=GRP ;
    label grp = "Groupe";
    format grp grpe.;
    Keylegend "a"  / position=topleft location=inside noborder;
    run;
    Dit moi si ça fonctionne de ton côté !

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

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Salut,

    Ton exemple marche très bien, merci beaucoup. Cela dit je suis perplexe car j'avais bien essayé ça et ça ne marchait pas.

    La seule chose que je vois, c'est que tu as attribué donné à ton ID dans le DATTRMAP la même valeur que le nom de la variable GROUP. Ce que je n'avais pas fait... et en changeant ça dans mon exemple, ça fonctionne.
    Cela fonctionne également si j'ai un DATTRMAP avec un seul ID, et que cet ID n'a pas le même nom que ma variable GROUP.

    Je pensais que l'ID était tout simplement un identifiant que SGPLOT allait chercher pour récupérer les valeurs (couleurs, etc).
    Mais j'ai l'impression que je peux utiliser un ID différent de mon nom de variable mais pas si j'ai déjà un ID équivalent à mon nom de variable. J'ai bien compris ou pas du tout ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    J'espère que j'ai bien compris ton interrogation et que je vais pas répondre à côté!

    Il me semble que tu peux mettre n'importe quoi en ID dans ton Dattrmap, y compris un nom de variable déjà utilisé dans group. L'option Attrid permet de demander à SAS de retrouver l'ID dans la table dattrmap uniquement, donc il ne doit pas y avoir de restriction sur le nom.
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    data _donnees;
    infile datalines expandtabs;
    input id visite valeur My_id grp2;
    cards;
    1	1	50	1	1
    1	2	55	1	1
    1	3	50	1	1
    1	4	25	1	1
    2	1	25	2	2
    2	2	25	2	2
    2	3	29	2	2
    2	4	20	2	2
    3	1	85	1	3
    3	2	67	1	3
    3	3	90	1	3
    3	4	75	1	3
    4	1	15	2	3
    4	2	29	2	1
    4	3	18	2	2
    4	4	35	2	1
    ;
    run;
     
     
    proc sort data=_donnees;                                                                                                                    
    by visite My_id;                                                                                                                              
    run;                                                                                                                                    
     
    proc means data=_donnees noprint;                                                                                                           
    by visite My_id;                                                                                                                             
    var valeur; 
    output out=_out median=mediane q1=quartile1	q3=quartile3
    ;			 
    run;
     
    proc format;
    value grpe
    	1	=	"Groupe 1"
    	2	=	"Groupe 2"
    ;
    run;
     
     
    data _dattrmap;
    length id $15. markercolor $15. fillcolor $15.	linecolor $15. markersymbol $15.;
    /* Groupe */
    id="My_id";	value="Groupe 1";	linecolor="green";	fillcolor="green";	markercolor="green";		markersymbol="circlefilled"; output;
    id="My_id";	value="Groupe 2";	linecolor="blue";	fillcolor="blue";	markercolor="blue";			markersymbol="starfilled"; output;
    run;
     
     
    proc sgplot data=_out dattrmap=_dattrmap;
    xaxis type=linear;
    yaxis min=0 max=100;
    scatter x=visite y=mediane 	/ 	yerrorlower=quartile1                                                                                          
                               		yerrorupper=quartile3 
    								group = My_id attrid=My_id name="a";
     
    series x=visite y=mediane	/ 	group = My_id attrid=My_id ;
    label My_id= "Groupe";
    format My_id grpe.;
    Keylegend "a"  / position=topleft location=inside noborder;
    run;
    Dans ce code j'ai juste changé la valeur de la variable qui identifie tes groupes et l'ID du dattrmap pour donner la même valeur et cela fonctionne normalement. Je n'ai pas souvenir d'avoir vu des contraintes spécifiques sur ce sujet (mais je me trompe peut-être)

    Flo00154

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour,

    Je pensais être passé la semaine dernière pour répondre, mais apparemment non. En fait je ne sais vraiment pas ce qui a raté mais en tout cas maintenant cela fonctionne très bien, merci encore !

    Je reviens en revanche car j'ai une autre question. Je souhaiterai savoir s'il est possible, dans le DATTRMAP, de paramétrer les caractéristiques (couleur et pattern surtout) des barres d'erreurs (YERROR XERROR).

    En effet avant quand je décomposais chaque SERIES et SCATTER, j'utilisais ERRORBARATTRS pour indiquer à SAS que je voulais la même couleur et le même pattern que mes lignes SERIES (en j'ai la ligne en DOT, je veux mes barres en DOT, etc).

    Là je ne trouve pas...

    Je comprends sûrement mal la page de SAS dédiée aux DATTRMAP :
    http://support.sas.com/documentation...d9hhdh2ksj.htm
    Je ne connaissais pas l'existance des STYLE (pour LINE et MARKER) et je ne sais pas comment on peut les remplir. Serait-ce la clef de mon problème ?
    Et surtout, ils indiquent que"si" on utilise un LINESTYLE on peut utiliser un LINECOLOR/PATTERN sauf que j'utilise déjà ces deux variables sans LINESTYLE. D'où mon étonnement.

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Oui tu peux changer la couleur de tes barres Xerror et Yerror. Pour le faire je suppose qu'il existe plusieurs solutions mais je te propose celle-ci qui donne ceci :

    Nom : SGPlot22.png
Affichages : 1395
Taille : 13,4 Ko

    Le code 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
     
    data _donnees;
    infile datalines expandtabs;
    input id visite valeur My_id grp2;
    cards;
    1	1	50	1	1
    1	2	55	1	1
    1	3	50	1	1
    1	4	25	1	1
    2	1	25	2	2
    2	2	25	2	2
    2	3	29	2	2
    2	4	20	2	2
    3	1	85	1	3
    3	2	67	1	3
    3	3	90	1	3
    3	4	75	1	3
    4	1	15	2	3
    4	2	29	2	1
    4	3	18	2	2
    4	4	35	2	1
    ;
    run;
     
     
    proc sort data=_donnees;                                                                                                                    
    by visite My_id;                                                                                                                              
    run;                                                                                                                                    
     
    proc means data=_donnees noprint;                                                                                                           
    by visite My_id;                                                                                                                             
    var valeur; 
    output out=_out median=mediane q1=quartile1	q3=quartile3
    ;			 
    run;
     
    proc format;
    value grpe
    	1	=	"Groupe 1"
    	2	=	"Groupe 2"
    ;
    run;
     
     
    data test;
    set _out;
    p = my_id;
    run;
     
    data _dattrmap;
    length id $15. markercolor $15. fillcolor $15.	linecolor $15. markersymbol $15.;
    /* Groupe */
    id="My_id";	value="Groupe 1";	linecolor="green";	fillcolor="green";	markercolor="green";		markersymbol="circlefilled"; output;
    id="My_id";	value="Groupe 2";	linecolor="blue";	fillcolor="blue";	markercolor="blue";			markersymbol="starfilled"; output;
     
    id="again";	value="Groupe 1";	linecolor="yellow";	fillcolor="yellow";	markercolor="yellow";			markersymbol="starfilled"; output;
    id="again";	value="Groupe 2";	linecolor="red   ";	fillcolor="red   ";	markercolor="red";			markersymbol="starfilled"; output;
    run;
     
     
    proc sgplot data=test dattrmap=_dattrmap;
    xaxis type=linear;
    yaxis min=0 max=100;
    highlow x=visite high=quartile3 low=quartile1 / lowcap=serif highcap=serif group=p attrid=again;
     
    scatter x=visite y=mediane 	/group = My_id attrid=My_id name="a";
     
    series x=visite y=mediane	/ 	group = My_id attrid=My_id ;
    label My_id= "Groupe"
    	  quartile3="Médiane";
    format My_id p grpe.;
    Keylegend "a"  / position=topleft location=inside noborder;
    run;

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Je lisais justement ce matin un document sur l'utilisation de deux ATTRID différents dans une même PROC SGPLOT mais je ne voyais pas comment l'utiliser avec mes YERROR étant donné que j'avais déjà un ATTRID pour SCATTER.

    En revanche je ne connaissais pas HIGHLOW, qui semble-t-il fait exactement la même chose. Et là, ça change tout !

    Merci beaucoup ça va énormément m'aider !

    alers

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/02/2013, 10h05
  2. PROC SGPANEL et problème de barres d'erreur avec l'option GROUP
    Par AnalytX dans le forum ODS et reporting
    Réponses: 4
    Dernier message: 05/07/2012, 14h37
  3. Microsoft affiche ses ambitions sur le Web avec IE9
    Par Mejdi20 dans le forum Communiqués
    Réponses: 0
    Dernier message: 19/03/2010, 08h13
  4. Adsense ne s'affiche pas bien sur mes pages avec IE
    Par Petsdater dans le forum Publicité
    Réponses: 0
    Dernier message: 17/08/2009, 20h04
  5. afficher tableau avec bouton option
    Par angel84 dans le forum VB.NET
    Réponses: 0
    Dernier message: 12/02/2009, 15h12

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