2017-01-10 4 views
1

J'essaie d'afficher les marqueurs sur mon graphique en utilisant le langage de modèles graphiques. J'ai essayé d'ajouter les définitions de marqueurs au style, à l'instruction seriesplot dans une instruction d'option markerattrs=, et également en utilisant discreteattrmaps pour le groupe de graphiques. Je n'arrive pas à faire fonctionner ces approches.Affichage des marqueurs sur un graphique de séries à l'aide du GTL

définition Style:

proc template; 
    define style excel; 
    parent=styles.htmlblue; 
    class graph  /attrpriority='none'; 
    style graphdata1/contrastColor=#416FA6; 
    style graphdata2/contrastColor=#A8423F; 
    style graphdata3/contrastColor=#86A44A; 
    style graphdata4/contrastColor=#8064A2; 
    style graphdata5/contrastColor=#DA8137; 
    style graphdata6/contrastColor=#D7E4BD; 
    style graphdata7/contrastColor=#FCD5B5; 
    style graphdata8/contrastColor=#8EA5CB; 
    style graphdata9/contrastColor=#E6B9B8; 
    style graphdata10/contrastColor=#CCC1DA; 
    end; 

run; 

Modèle pour le tableau:

proc template; 
    define statgraph excel_series_trended; 
    dynamic _date _class _metric _title; 
    begingraph; 
     entrytitle halign=center _title; 

     discreteattrmap name="symbols"/ignorecase=true ; 
     value "IBM"/markerattrs=(color=blue symbol=diamondfilled) ; 
     value other/markerattrs=(color=red symbol=circlefilled) ; 
     enddiscreteattrmap ; 

     discreteattrvar attrvar=groupmarkers var=stock attrmap="symbols" ; 

     layout lattice/rowdatarange=data columndatarange=data rowgutter=0 columngutter=0; 

      layout overlay/walldisplay=(fill) 
          yaxisopts=(griddisplay=on gridattrs=(pattern=2 color=Cx999999) linearopts=(viewmin=0)) 
          xaxisopts=(type=discrete ); 
      seriesplot x=_date y=_metric/group=_class markercolorgroup=_class name='series' groupdisplay=overlay connectorder=xaxis lineattrs=(pattern=solid thickness=3); 
      endlayout; 

      sidebar/align=bottom spacefill=false; 
      discretelegend 'series'/opaque=true border=false halign=center valign=center displayclipped=true order=rowmajor; 
      endsidebar; 

     endlayout; 

    endgraph; 
    end; 
run; 

Render le graphique à l'aide du jeu de données sashelp.stocks:

ods html style=excel; 
ods graphics/antialias=on antialiasmax=999999; 
proc sgrender data=sashelp.stocks template=excel_series_trended; 
    where date between '01jan2005'd and '01jun2005'd; 
    dynamic _date="date" _metric="high" _class="stock"; 
run; 

Répondre

1

Vous devez faire deux choses, sans doute.

D'abord, ajoutez display=(markers) à l'instruction seriesplot; cela permet des marqueurs.

Ensuite, ajoutez markersymbolgroup=groupmarkers à cette même instruction pour activer la mappe d'attributs discrets à utiliser pour les marqueurs et remplacez markercolorgroup par la même valeur. Vous ne pouvez pas utiliser une variable dynamique pour les définir, et vous ne devriez pas - vous devez utiliser la valeur discreteattrvar.

code complet:

proc template; 
    define statgraph excel_series_trended; 
    dynamic _date _class _metric _title; 
    begingraph; 
     entrytitle halign=center _title; 

     discreteattrmap name="symbols"/ignorecase=true ; 
     value "IBM"/markerattrs=(color=blue symbol=diamondfilled) ; 
     value other/markerattrs=(color=red symbol=circlefilled) ; 
     enddiscreteattrmap ; 

     discreteattrvar attrvar=groupmarkers var=stock attrmap="symbols" ; 

     layout lattice/rowdatarange=data columndatarange=data rowgutter=0 columngutter=0; 

      layout overlay/walldisplay=(fill) 
          yaxisopts=(griddisplay=on gridattrs=(pattern=2 color=Cx999999) linearopts=(viewmin=0)) 
          xaxisopts=(type=discrete ); 
      seriesplot x=_date y=_metric/group=_class name='series' 
              markersymbolgroup=groupmarkers markercolorgroup=groupmarkers 
              groupdisplay=overlay connectorder=xaxis lineattrs=(pattern=solid thickness=3) 
              display=(markers); 
      endlayout; 

      sidebar/align=bottom spacefill=false; 
      discretelegend 'series'/opaque=true border=false halign=center valign=center displayclipped=true order=rowmajor; 
      endsidebar; 

     endlayout; 

    endgraph; 
    end; 
run; 
+1

Pour votre information, la façon dont je résolu ce problème (comme je ne l'avais pas rappelé la réponse non plus) était de courir 'sgplot' et utilisez l'option 'tmplout' pour voir ce que SGPLOT ferait. – Joe

+0

Merci Joe. Je ne suis pas très familier avec sgplot et je n'ai pas réalisé qu'il avait cette option. Bon à savoir. –

+0

Ouais, c'est super pratique car j'ai souvent eu du mal à trouver comment faire quelque chose en GTL que SGPLOT a fait facilement. C'est ennuyeux que l'option similaire n'existe pas dans 'SGPANEL'. – Joe

1

Bien que j'ai marqué la réponse de Joe comme accepté, je fini par choisir une solution légèrement différente qui était plus facile à maintenir dans mon projet final.

La partie clé de la syntaxe qui me manquait était l'option display=(markers) sur seriesplot (comme Joe l'a souligné). Une fois que cela a été ajouté, je suis en mesure de contrôler le symbole de marqueur en spécifiant simplement dans le style:

proc template; 
    define style excel; 
    parent=styles.htmlblue; 
    class graph  /attrpriority='none'; 
    style graphdata1/contrastColor=#416FA6 markersymbol='circlefilled'; 
    style graphdata2/contrastColor=#A8423F markersymbol='circlefilled'; 
    style graphdata3/contrastColor=#86A44A markersymbol='circlefilled'; 
    end; 

run; 

Malheureusement le style does not soutien l'option markersize= (malgré ce que dit la documentation). Pour cela, j'ai fini par ajouter l'option markerattrs=(size=_markersize) à l'instruction seriesplot. J'ai fait _markersize une valeur dynamique avec un défaut de 0px, (c'est-à-dire ne pas afficher les marqueurs). Maintenant, le modèle me permet de changer facilement le symbole, et ou la taille des marqueurs:

proc template; 
    define statgraph excel_series_trended; 
    dynamic _date _class _metric _title _markersize=0px; 
    begingraph; 
     entrytitle halign=center _title; 

     layout lattice/rowdatarange=data columndatarange=data rowgutter=0 columngutter=0; 

      layout overlay/walldisplay=(fill) 
          yaxisopts=(griddisplay=on gridattrs=(pattern=2 color=Cx999999) linearopts=(viewmin=0)) 
          xaxisopts=(type=discrete ); 
      seriesplot x=_date y=_metric/display=(markers) group=_class name='series' groupdisplay=overlay connectorder=xaxis 
              lineattrs=(pattern=solid thickness=3) 
              markerattrs=(size=_markersize) 
              ; 
      endlayout; 

      sidebar/align=bottom spacefill=false; 
      discretelegend 'series'/opaque=true border=false halign=center valign=center displayclipped=true order=rowmajor; 
      endsidebar; 

     endlayout; 

    endgraph; 
    end; 
run;