Отображение маркеров на графике серии с использованием GTL

Я пытаюсь заставить маркеры отображаться на моем графике, используя язык графических шаблонов. Я попытался добавить определения маркера к стилю, к выражению seriesplot внутри markerattrs= Опция оператора, а также использование discreteattrmaps для группы диаграмм. Я не могу заставить ни один из этих подходов работать.

Определение стиля:

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; 

Шаблон для графика:

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;

Визуализируйте график, используя 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;

2 ответа

Решение

Вы должны сделать две вещи, по-видимому.

Сначала добавьте display=(markers) к заявлению серии; это позволяет маркеры.

Во-вторых, добавить markersymbolgroup=groupmarkers к тому же оператору, чтобы позволить использовать карту дискретных атрибутов для маркеров, и изменить markercolorgroup к тому же значению. Вы не можете использовать динамическую переменную для их определения, и вы не должны - вы должны использовать значение discreteattrvar.

Полный код:

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;

Хотя я отметил ответ Джо как принятый, я в итоге выбрал немного другое решение, которое было проще поддерживать в моем конечном проекте.

Ключевой частью синтаксиса, который я пропустил, была display=(markers) вариант на сериале (как указал Джо). Как только это было добавлено, я смог управлять символом маркера, просто указав его в стиле:

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; 

К сожалению, стиль не поддерживает markersize= вариант (несмотря на то, что говорится в документации). Для этого я добавил markerattrs=(size=_markersize) вариант к seriesplot заявление. я сделал _markersize динамическое значение со значением по умолчанию 0px(т.е. не показывать маркеры). Теперь шаблон позволяет мне легко менять символ и / или размер маркеров:

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;
Другие вопросы по тегам