楼主: caibirdcnb
6050 21

[原创博文] 请问SAS能做面积图吗?如果可以,如何实现,谢谢! [推广有奖]

  • 0关注
  • 37粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

楼主
caibirdcnb 发表于 2011-10-19 23:55:29 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请问SAS能做面积图吗?如果可以,如何实现,谢谢!

如下图所示是我目前用SAS作出的图。其中叠加的柱状图表示各种废品类型,折线(Y2轴)表示某个关键参数。X轴是时间什么的。
Snap2.jpg

这样我虽然能看出废品总和的变化趋势,和每天各类废品的组成,但是,很难看出同类废品随着X轴(时间)的变化趋势。
因此,我想修改图标的柱状为面积图,折线不变(Y2轴)。例如下面的图形,更容易看出某个废品(例如红色)随着时间的变化趋势。
但我不知道如何使用SAS作出下面的图形,请高手指教,谢谢!
Snap3.jpg
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:如何实现 面积图 如何使用 不知道 柱状图 柱状图 我不知道 如何

Snap2.jpg (19.77 KB)

Snap2.jpg

回帖推荐

bobguy 发表于3楼  查看完整内容

See example below. goptions reset=all border; data stocks; data test; do day=today()-10 to today(); x1=ranuni(123);x2=ranuni(123);x3=ranuni(123); sum1=sum(x1);sum2=sum(x1,x2);sum3=sum(x1,x2,x3); output; end; run; symbol1 interpol=join; axis1 order=(today()-10 to today() by 1) label=none ; axis2 order=(0 to 3 by 0.5) label=no ...

本帖被以下文库推荐

沙发
jingju11 发表于 2011-10-20 05:38:28
It should be Okay to give such plot in SAS. What about stacking band plots?
JingJu

藤椅
bobguy 发表于 2011-10-20 09:03:35
See example below.


  goptions reset=all border;

  data stocks;
  data test;
     do day=today()-10 to today();
            x1=ranuni(123);x2=ranuni(123);x3=ranuni(123);
                sum1=sum(x1);sum2=sum(x1,x2);sum3=sum(x1,x2,x3);
                output;
         end;
run;

  symbol1 interpol=join;

  axis1 order=(today()-10 to today() by 1)
      label=none
      ;
axis2 order=(0 to 3 by 0.5)
      label=none
      ;
proc print;run;
  proc gplot data=test;
   plot (sum1 sum2 sum3)*day / overlay
                             haxis=axis1
                              vaxis=axis2
                              caxis=black
                             areas=3;
   format day date9.;
run;
quit;

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

板凳
caibirdcnb 发表于 2011-10-20 11:11:58
谢谢bobguy,使用areas可以填充面积。
但我一直使用SGPLOT,请问SGPLOT有类似功能吗?我找了帮助很久似乎没有找到。
非常感谢!

报纸
jingju11 发表于 2011-10-21 01:30:48
caibirdcnb 发表于 2011-10-20 11:11
谢谢bobguy,使用areas可以填充面积。
但我一直使用SGPLOT,请问SGPLOT有类似功能吗?我找了帮助很久似乎没 ...
  1. *You should properly manage your date;
  2. data have;
  3. infile datalines;
  4.    input category $@@;
  5.                 do date =1 to 5;
  6.                         input amount@@;
  7.                         output;
  8.                 end;
  9.    datalines;
  10. a 10 5 6 11 4
  11. b 02 2 3 05 7
  12. c 06 4 8 05 3
  13. ;
  14. run;
  15. data have1;
  16.         set have;
  17.         array t[5] _temporary_(5*0);
  18.         lower =t[date];
  19.         upper =lower +amount;
  20.         t[date] =upper;
  21. run;

  22. title 'Longitudinal trends of waste amount by dates';
  23. proc sgplot data=have1;
  24.    band x=date upper=upper lower=lower /
  25.         transparency=.5 group=category;
  26.    xaxis label='date' grid;
  27.    yaxis label='waste (tons)'  grid;
  28.    series x=date y=upper /  lineattrs=(pattern=solid thickness=2px)  
  29.           markerattrs=(symbol=circle) markers group=category;
  30.    
  31. run;
复制代码

地板
jingju11 发表于 2011-10-21 04:20:31
it looks like this.
JingJu

SGPlot.png (33.64 KB)

SGPlot.png

7
caibirdcnb 发表于 2011-10-22 14:08:58
Jingju,非常感谢!
不过我在调试的过程中出现了1个新的问题,我必须把日期转换为1-N才能产生类似数据集have1的结果。
但是我不知道怎么转化下面的格式:想把date转化为date2。(起始日期不固定,日期不连续)
请继续指导,非常感谢!

我原来想使用lag函数,先设定date2=1,接着如果date=lag(date),date2就不变,否则+1,但不成功。
原因似乎是lag在分支语句中,判定上N行仅仅是指该分之内的上N行,而不是整个数据集的上N行。

date       date2
09OCT    1
09OCT    1
09OCT    1
10OCT    2
10OCT    2
11OCT    3
16OCT    4
16OCT    4
17OCT    5


备注:我的数据格式是3列,日期,废品类别,百分比。按日期,按废品类别排序。

8
caibirdcnb 发表于 2011-10-22 14:31:32
实际上,我原来的思路更简单,因为我的数据是按日期,废品类别排序好的,所以我只要写下面程序就可以得到lower和upper,但实际上,由于lag的局限性,这个程序得到的结果是错误的。
  1. data have1;
  2.         set have
  3.         lower=0;
  4.         upper=amount;
  5.         if date = lag(date) then do;
  6.                 lower=lag(upper);
  7.                 upper=lag(upper)+amount;
  8.         end;
  9. run;
复制代码

9
caibirdcnb 发表于 2011-10-22 14:32:26
实际上,我原来的思路更简单,因为我的数据是按日期,废品类别排序好的,所以我只要写下面程序就可以得到lower和upper,但实际上,由于lag的局限性,这个程序得到的结果是错误的。
  1. data have1;
  2.         set have
  3.         lower=0;
  4.         upper=amount;
  5.         if date = lag(date) then do;
  6.                 lower=lag(upper);
  7.                 upper=lag(upper)+amount;
  8.         end;
  9. run;
复制代码

10
jingju11 发表于 2011-10-22 22:05:08
这种转化应该较为简单。不过使得问题稍微麻烦的是,废品里是否有断档的日期。如果有,就不应该用日期的数据中的位置来标记。另外,据我的理解,你的图应该是日期各异的。同一个日期同一个产品的数量应该累加合一。
京剧

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 03:11