SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1927|回复: 9
打印 上一主题 下一主题

关于sas作图的难题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-7-4 08:08:13 | 只看该作者

关于sas作图的难题

data a;
input index $ start end high low;
cards;
a 10 12 13 9;
b 13 9 14 8;
run;
我想应用上面的数据做类似于excel 中的K线图,以sart和end做箱体,以high low分别作上下影线,start 大于end 和start 小于end 箱体用不同的颜色。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-7-4 08:24:51 | 只看该作者

Re: 关于sas作图的难题

我想应用proc boxplot;但是它是针对一组数字,自动计算画图的,我如何指定最大值,最小值呢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-7-11 14:20:55 | 只看该作者

Re: 关于sas作图的难题

我的确也只是用proc boxplot来画盒须图,但是如楼上所说,采用的数据是原始的一组数字,它会帮我计算min,max,Q1-Q3等并在图上体现。
楼主的需求我一时没想到好的办法,可以试试看菜单Solutions->Reporting->Graph-N-Go来实现。我个人对此问题表示关注,会再想想程序方式。
[code:373l8q5c]data Times;
   informat day date7. ;
   format   day date7. ;
   input day @ ;
   do flight=1 to 25;
      input delay @ ;
      output;
      end;
datalines;
16DEC88   4  12   2   2  18   5   6  21   0   0
          0  14   3   .   2   3   5   0   6  19
          7   4   9   5  10
17DEC88   1  10   3   3   0   1   5   0   .   .
          1   5   7   1   7   2   2  16   2   1
          3   1  31   5   0
18DEC88   7   8   4   2   3   2   7   6  11   3
          2   7   0   1  10   2   3  12   8   6
          2   7   2   4   5
19DEC88  15   6   9   0  15   7   1   1   0   2
          5   6   5  14   7  20   8   1  14   3
         10   0   1  11   7
20DEC88   2   1   0   4   4   6   2   2   1   4
          1  11   .   1   0   6   5   5   4   2
          2   6   6   4   0
21DEC88   2   6   6   2   7   7   5   2   5   0
          9   2   4   2   5   1   4   7   5   6
          5   0   4  36  28
22DEC88   3   7  22   1  11  11  39  46   7  33
         19  21   1   3  43  23   9   0  17  35
         50   0   2   1   0
23DEC88   6  11   8  35  36  19  21   .   .   4
          6  63  35   3  12  34   9   0  46   0
          0  36   3   0  14
24DEC88  13   2  10   4   5  22  21  44  66  13
          8   3   4  27   2  12  17  22  19  36
          9  72   2   4   4
25DEC88   4  33  35   0  11  11  10  28  34   3
         24   6  17   0   8   5   7  19   9   7
         21  17  17   2   6
26DEC88   3   8   8   2   7   7   8   2   5   9
          2   8   2  10  16   9   5  14  15   1
         12   2   2  14  18
;
run;

data Weather;
   informat day date7. ;
   format   day date7. ;
   length reason $ 16 ;
input day flight reason & ;
datalines;
16DEC88  8   Fog
17DEC88  18  Snow Storm
17DEC88  23  Sleet
21DEC88  24  Rain
21DEC88  25  Rain
22DEC88  7   Mechanical
22DEC88  15  Late Arrival
24DEC88  9   Late Arrival
24DEC88  22  Late Arrival
;
run;

data Times;
   merge Times Weather;
   by day flight;
run;

symbol1 v=plus     c=salmon;
symbol2 v=square   c=vigb;
symbol3 v=triangle c=vig;
title 'Box Plot for Airline Delays';
proc boxplot data=Times;
   plot delay*day = ncancel /
       cboxes       = dagr
       cboxfill     = ywh
       cframe       = vligb
       nohlabel
       symbollegend = legend1;
   legend1 label   = ('Cancellations:')
           cborder = black cframe=ligr;
   label delay = 'Delay in Minutes';
run;[/code:373l8q5c]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-7-11 15:05:38 | 只看该作者

Re: 关于sas作图的难题

我也尝试过,没成功。
1.将横排的数据,一个一个读入,并且变量只有index和value,value读取start,end,high,low,,并且按照涨跌分别放到两个集合里面。
2.因为最大最小值是两个极限值,它们是不变的,所以不需要指定,按照boxplot自动能画出的。
问题关键:1.股票涨要用红色,否者用绿色。2.使用start,end作为箱体。
我尝试过将分开的数据集合用boxplot自动画,可是它是画按照正态假设的标准的Q25和Q75,如果他能用数据中第二第三个大小的值作为选项,问题就解决了。
想法对每一个index唯一的读取它第二第三个大小的值,编写宏对数据处理,加入n个虚拟值,它们在最大最小值中间使得处理后的q75=max(start,end),vq25=min(start,end)再画图就是箱体值。
然后对涨跌的数据集合分别用cboxfill = red,cboxfill = green就可以了。
问题困难:如果要将涨跌的在同一张图片里面画有点困难,因为没有 if 涨 thencboxfill     = red elsecboxfill     = green的语句。想到将它分成两个变量value和value2然后用overlay但是好像不支持overlay,而且横轴不一样。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-7-11 18:07:23 | 只看该作者

Re: 关于sas作图的难题

谢谢大家对我的问题的关注,现在问题已经解决,稍晚一点,我将程序发上来,请大家讨论\完善!~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-7-11 21:36:44 | 只看该作者

Re: 关于sas作图的难题

data Shangzhenzhishu;
input date yymmdd10. Oppr      Hipr      Lopr      Clpr vol;
format date yymmdd10.;
cards;
1990-12-19     96.05     99.98     95.79     99.98    126000
1990-12-20    104.30    104.39     99.98    104.39    19700
1990-12-21    109.07    109.13    103.73    109.13    2800
1990-12-24    113.57    114.55    109.13    114.55    3200
1990-12-25    120.09    120.25    114.55    120.25    1500
1990-12-26    125.27    125.27    120.25    125.27    10000
1990-12-27    125.27    125.28    125.27    125.28    6600
1990-12-28    126.39    126.45    125.28    126.45    10800
1990-12-31    126.56    127.61    126.48    127.61    7800
;
run;
   data candles;
   length color function style $8;
   retain xsys ysys '2' style 'solid' size 1;
   set Shangzhenzhishu;
   if clpr>oppr then color='red';
   else color='green';
   /*Draw the open/close box */
  
   function='move'; xsys='2'; ysys='2'; x=date; y=clpr; output;
   function='poly'; xsys='7'; ysys='2'; x=+1; y=clpr; output;
   function='polycont'; y=oppr; output;
   function='polycont'; x=-1; y=oppr; output;
   function='polycont'; y=clpr; output;
   function='polycont'; x=+0.5; y=clpr; output;
   /*Draw high to close and low to open */
   if clpr ge oppr then do;
   function='move'; xsys='2'; ysys='2'; x=date; y=clpr; output;
   function='draw'; xsys='2'; ysys='2'; x=date; y=hipr; output;
   function='move'; xsys='2'; ysys='2'; x=date; y=oppr; output;
   function='draw'; xsys='2'; ysys='2'; x=date; y=lopr; output;
   end;
   /* Draw high to open and low to close */
   if clpr le oppr then do;
   function='move'; xsys='2'; ysys='2'; x=date; y=oppr; output;
   function='draw'; xsys='2'; ysys='2'; x=date; y=hipr; output;
   function='move'; xsys='2'; ysys='2'; x=date; y=clpr; output;
   function='draw'; xsys='2'; ysys='2'; x=date; y=lopr; output;
   end;
   run;
   symbol1 i=none v=none r=2;
   axis1 minor=none offset=(5,5)pct;
   axis2 label=('Price') minor=none;
   title1 '上证综合指数k线图';
   /* PROC GPLOT is used as a 'holding' area for the annotate, plus,
   gplot */
   /* generates the axes. Had to do an overlay plot so that the vertical */
   /* axis had the complete range of the data, ie., high to low. */
   proc gplot data=Shangzhenzhishu;
   plot hipr*date lopr*date / overlay haxis=axis1 vaxis=axis2 anno=candles;
   run;
   quit;

图作好了,大家细看一下,有没有缺点,我们一起完善,把这个问题深入下去啊,希望大家支持!~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-7-12 09:19:28 | 只看该作者

Re: 关于sas作图的难题

楼上的程序很好,效果也很漂亮!先赞一个! <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->

我的思路是
1、将数据组织成开盘价、最高价、最低价、收盘价的形式。
2、如果收盘价&lt;开盘价,则标记成绿色;反之为红色。
3、用macro组织程序实现。
4、proc gplot,i=candle,overlay来画图。

因为没有太多时间,我只写了原型程序:
[code:pr5r2xum]data test;
date='01jul08'd; y1=2; output; /* open */
date='01jul08'd; y1=4; output; /* high */
date='01jul08'd; y1=1; output; /* low */
date='01jul08'd; y1=3; output; /* close */
date='02jul08'd; y2=3; output;
date='02jul08'd; y2=4; output;
date='02jul08'd; y2=1; output;
date='02jul08'd; y2=2; output;
format date yymmdd10&#46;;
run;

symbol1 c=red i=candle;
symbol2 c=green i=candle;

proc gplot data=test;
plot y1*date y2*date/ overlay;
run; quit;[/code:pr5r2xum]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2008-7-12 16:23:08 | 只看该作者

Re: 关于sas作图的难题

data Shangzhenzhishu;
input date1 yymmdd10. Oppr Hipr Lopr Clpr vol;
format date1 yymmdd10.;
cards;
1990-12-19 96.05 99.98 95.79 99.98 126000
1990-12-20 104.30 104.39 99.98 104.39 19700
1990-12-21 109.07 109.13 103.73 109.13 2800
1990-12-24 113.57 114.55 109.13 114.55 3200
1990-12-25 120.09 120.25 114.55 120.25 1500
1990-12-26 125.27 125.27 120.25 125.27 10000
1990-12-27 125.27 125.28 125.27 125.28 6600
1990-12-28 126.39 126.45 125.28 126.45 10800
1990-12-31 126.56 127.61 126.48 127.61 7800
;
run;
data test;
set Shangzhenzhishu;
if Oppr&lt;Clpr then do;
date=date1; y1=Oppr; output; /* open */
date=date1; y1=Hipr; output; /* high */
date=date1; y1=Lopr; output; /* low */
date=date1; y1=Clpr; output; /* close */
end;
if Oppr&gt;=Clpr then do;
date=date1; y2=Oppr; output;
date=date1; y2=Hipr; output;
date=date1; y2=Lopr; output;
date=date1; y2=Clpr; output;
end;
format date yymmdd10.;
run;

symbol1 c=red i=candle;
symbol2 c=green i=candle;
axis1 minor=none offset=(5,5)pct;
axis2 label=(&quot;Price&quot;) minor=none;
title1 &quot;上证综合指数k线图&quot;;
proc gplot data=test;
plot y1*date=1 y2*date=2 / overlay haxis=axis1 vaxis=axis2 ;
run; quit;
我按照您的想法写了,如果能调整一下graphic设置就好了,比如里面能填充颜色,放大那就更好了。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
楼主能解释一下语句吗?那个annote以及里面的用法,您是如何实现填充颜色的?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2008-7-12 18:35:40 | 只看该作者

Re: 关于sas作图的难题

if clpr&gt;oppr then color='red';
else color='green';
这2句是控制颜色的
x=+1
x=-1
是控制cadle的宽度的
其他的我有详细的电子版,把邮箱告诉我,我传给你啊!~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2008-7-12 18:40:44 | 只看该作者

Re: 关于sas作图的难题

<!-- e --><a href="mailto:huangruzhen2704@sina.com">huangruzhen2704@sina.com</a><!-- e -->
谢谢了。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 21:58 , Processed in 0.067721 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表