【问题标题】:Bar Graph by Month - SAS EG按月排列的条形图 - SAS EG
【发布时间】:2013-11-06 15:59:30
【问题描述】:

我正在尝试在 SAS Enterprise Guide 中创建条形图。该图是按月划分的储蓄。 输入数据是

Ref      Date       Savings
A      03JUN2013      1000
A      08JUN2013      2000
A      08JUL2013      1500
A      08AUG2013      300
A      08NOV2013      100
B      09DEC2012      500
B      09MAY2013      400
B      19MAY2013      5999
B      09OCT2013      511
C      15OCT2013      1200
C      01NOV2013      1500

我要做的第一步是将日期转换为月份。我使用 PROC MEANS 按 Ref 计算每月的总节省。 然后我创建一个条形图。我得到的问题是条形图没有按应有的顺序排列。就像是 AUG13 JUl13 JUN13 .. 等等,而不是 JUN JUL AUG。

PROC SQL;
   CREATE TABLE SAVINGS_11 AS 
   SELECT 
      PUT(DATE,monname3.) AS MONTH,
          (DATE) FORMAT=MONNAME3. AS MONTH1,
      MONTH(DATE) AS MONTH2,
      PUT(DATE,MONYY5.) AS MONTH3,
      (DATE) FORMAT=MONYY5. AS MONTH4,
          DATE, 
          REF,  
          SAVINGS

      FROM INPUT;
QUIT;

/* -------------------------------------------------------------------
   Sort data set
   ------------------------------------------------------------------- */
PROC SORT
    DATA=SAVINGS_11(KEEP=SAVINGS MONTH MONTH1 MONTH2 MONTH3 MONTH4 REF)
    OUT=SORT1;
    BY REF;
RUN;
/* -------------------------------------------------------------------
   Run the Means Procedure
   ------------------------------------------------------------------- */
TITLE;
TITLE1 "Summary";
TITLE2 "Results";
FOOTNOTE;
PROC MEANS DATA=SORT1
    NOPRINT
    CHARTYPE
    NOLABELS
    NWAY

        SUM NONOBS  ;
    VAR SAVINGS;
    CLASS MONTH /   ORDER=DATA ASCENDING;
    BY REF;
    ID MONTH1 MONTH2 MONTH3 MONTH4;

OUTPUT  OUT=MEANSUMMARY
        SUM()=

    / AUTONAME AUTOLABEL  WAYS INHERIT
    ;
RUN;
/* -------------------------------------------------------------------
   End of task code.
   ------------------------------------------------------------------- */
RUN; QUIT;
TITLE; FOOTNOTE;

PROC SORT
    DATA=MEANSUMMARY(KEEP=MONTH MONTH2 "SAVINGS_Sum"n REF)
    OUT=SORT2
    ;
    BY REF MONTH2;
RUN;
Axis1
    STYLE=1
    WIDTH=1
    MINOR=NONE


;
Axis2
    STYLE=1
    WIDTH=1


;
TITLE;
TITLE1 "Bar Chart";
FOOTNOTE;
PROC GCHART DATA=SORT2
;
    VBAR 
     MONTH
 /
    SUMVAR="SAVINGS_Sum"n
    CLIPREF
FRAME   LEVELS=ALL
    TYPE=SUM
    INSIDE=SUM
    COUTLINE=BLACK
    RAXIS=AXIS1
    MAXIS=AXIS2
;
    BY REF;
/* -------------------------------------------------------------------
   End of task code.
   ------------------------------------------------------------------- */
RUN; QUIT;
TITLE; FOOTNOTE;

无论我使用什么格式,最终结果都不是按顺序排列的。请帮忙。

【问题讨论】:

  • 这与SQL无关,所以我删除了那个标签。

标签: sas enterprise-guide


【解决方案1】:

您的问题是将日期值转换为字符变量。 MONTH 至少应该是格式化的日期变量,而不是字符变量;所以这一行:

PUT(DATE,monname3.) AS MONTH,

应该是

DATE AS MONTH FORMAT=monname3.,

大多数过程(如 PROC MEANS 和 PROC GPLOT)将尊重格式并按相同格式的值分组。我不完全理解为什么你有 5 个月的变量都包含同一事物的不同版本,所以也许有更好的方法来做你在这里做的事情。

特别是,如果您有 SAS 9.2 或更高版本,SGPLOT 可能会为您完成整个过程,而无需任何汇总步骤。

【讨论】:

  • 你太棒了乔!我将格式更改为 DATE AS MONTH FORMAT=monname3.,它起作用了。我有五个月变量的原因只是为了测试它们中的每一个,看看什么是有效的。谢谢你 !我还将使用 PROC GPLOT
  • 很高兴它有帮助。 SGPLOT 与 GPLOT 不同,因为它的价值。 SG(anything) 是新的 ODS 图形程序,除其他外,它会很高兴地在 plot 语句中汇总数据。
【解决方案2】:

除了上面提到的 Joe 之外,如果您希望能够在 x 轴上查看他们进行储蓄的每个参考的所有月份,您还需要在您的 VBAR 语句中包含关键字 DISCRETE (注意:如果某些引用在某些月份没有任何节省,这将生成警告消息。

您可以尝试以下代码,我相信它会产生您所追求的输出:

PROC SQL;
   CREATE TABLE DATA_TO_PLOT AS 
   SELECT 
      REF
      ,INPUT(PUT(date,YYMMN6.),YYMMN6.) FORMAT =DATE9. AS MONTH
      ,SUM(Savings) AS MONTHLY_SAVINGS
      FROM INPUT
    GROUP BY 1,2
    ORDER BY 1,2 ;
QUIT;

Axis1 STYLE=1 WIDTH=1 MINOR=NONE;
Axis2 STYLE=1 WIDTH=1;
TITLE;
TITLE1 "Bar Chart";

PROC GCHART DATA=DATA_TO_PLOT;
VBAR MONTH 
 /  SUMVAR=MONTHLY_SAVINGS
    CLIPREF
FRAME    TYPE=SUM
    COUTLINE=BLACK
    RAXIS=AXIS1
    MAXIS=AXIS2
INSIDE=SUM
    DISCRETE
;
    FORMAT MONTH MONYY7.;
    BY Ref;
RUN; QUIT;

【讨论】:

  • 肯定会添加的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2020-02-28
相关资源
最近更新 更多