为什么SGPLOT会忽略我的'MarkerSymbol`选择?

时间:2013-05-10 13:00:24

标签: sas

我正在使用VLine创建一个Proc SgPlot图,其中包含4组数据。这是我创建情节的代码。 (当然,我已经对变量名称进行了通用化。)这包含在宏中,但我认为这没有任何区别。

proc sgplot data=mydata;
    vline NominalTime / Response=responseVariable Group=MyGroups stat=mean markers;
    format MyGroups MyGroups.;
    Where scaleNum=&scaleNum;
run;

我正在使用Proc Template来自定义线条颜色,LineStyles和MarkerSymbols。模板代码如下:

proc template;
    define style Styles.MyNewStyle;
        parent = styles.HTMLBlue;
        style GraphBackground / 
            backgroundcolor=white;
        style GraphData1 from GraphData1 / 
            markersymbol = "circle"
            color = CXFFB44B 
            contrastcolor = CXFFB44B
            ;
        style GraphData2 from GraphData2 / 
            markersymbol = "circle"
            color = white 
            contrastcolor=CX000000
            ;
        style GraphData3 from GraphData3 / 
            markersymbol = "Square"
            color = CXD33183 
            contrastcolor=CXD33183
            ;
        style GraphData4 from GraphData4 / 
            markersymbol = 'Square'
            linestyle = 2
            color = white 
            contrastcolor=CX555555
            ;
        style GraphFonts from GraphFonts /
            'GraphDataFont' = ("Arial",11pt)
            'GraphValueFont' = ("Arial",11pt)
            'GraphLabelFont' = ("Arial",11pt,bold)
            'GraphFootnoteFont' = ("Arial",8pt)
            'GraphTitleFont' = ("Arial",12pt,bold);
        end;
run;

当然,我使用ods html来改变输出样式:

ods html style=MyNewStyle;

以下是问题的关键所在:使用指定的颜色生成绘图,但是对于组2到4的分配不正确markersymbollinestyle。另有说明,{{1我在markersymbol中指定的linestyle用于绘图中的所有行,无论以后的赋值如何。为什么会这样?

2 个答案:

答案 0 :(得分:3)

理解这种行为的关键是从SAS 9.3开始,HTML目标默认使用HTMLBlue样式。这种风格是"颜色优先"样式,只有颜色首先旋转。有12种定义的颜色。因此,前12个组值获得这12种颜色中的一种,具有第一个标记符号和线条图案。在前12组之后,接下来的12组获得第二个标记符号和线条图案,再次使用12种颜色。

使用HTMLBlue,其他标记和线条图案将仅显示在前12个组值之后。

大多数其他样式的属性优先级为"无"。这意味着所有三个属性同时旋转。因此,第一组值获得颜色1,符号1和模式1.第二组值获得颜色2,符号2和模式2,依此类推。

使用SAS 9.4,在样式定义和ODS GRAPHICS语句中引入了选项ATTRPRIORITY来控制此行为。现在,您可以使用此选项使任何样式按您希望的方式旋转属性。要使HTMLBlue的行为类似于LISTING,请使用ODS图形选项ATTRPRIORITY = none。

答案 1 :(得分:1)

这可以按预期工作:

proc template;
    define style Styles.MyNewStyle;
        parent = styles.HTMLBlue;
        style GraphBackground / 
            backgroundcolor=white;
        style GraphData1 from GraphData1 / 
            markersymbol = "circle"
            color = CXFFB44B 
            contrastcolor = CXFFB44B
            ;
        style GraphData2 from GraphData2 / 
            markersymbol = "circle"
            color = white 
            contrastcolor=CX000000
            ;
        style GraphData3 from GraphData3 / 
            markersymbol = "Square"
            color = CXD33183 
            contrastcolor=CXD33183
            ;
        style GraphData4 from GraphData4 / 
            markersymbol = 'Square'
            linestyle = 2
            color = white 
            contrastcolor=CX555555
            ;
        style GraphFonts from GraphFonts /
            'GraphDataFont' = ("Arial",11pt)
            'GraphValueFont' = ("Arial",11pt)
            'GraphLabelFont' = ("Arial",11pt,bold)
            'GraphFootnoteFont' = ("Arial",8pt)
            'GraphTitleFont' = ("Arial",12pt,bold);
        end;
run;

data mydata;
do mygroups = 1 to 4;
do nominaltime=1 to 20;
responsevariable = mygroups*nominaltime;
output;
end;
end;
run;

ods html style=mynewstyle;

proc sgplot data=mydata;
    vline NominalTime / Response=responseVariable Group=MyGroups stat=mean markers;
*    format MyGroups MyGroups.;
*    Where scaleNum=&scaleNum;
run;
ods html close;

如果这对您的系统有效,那么您的MyGroups就会出现问题。我怀疑格式或价值观。 MyGroups本身具有什么价值 - 1-4或MyGroups的其他东西。格式转换为1-4?

如果这对您的系统不起作用,请提供更多系统详细信息 - 9.3,9.2等?