GPLOT: Bubblesize anhand Datum anpassen

Hallo liebe Redscope Community,

ich kämpfe gerade mit dem Bubble-Statement der Gplot-Prozedur, über das ich Koordinatenpunkte anhand zweier Dimensionen (x_pos, y_pos) im Zeitablauf abtragen will. Hierfür wird der Zeichenbereich, der jeweils von -2 bis +2 reicht, über href bzw. vref Statement am Koordinatenpunkt (0;0) in vier Bereiche aufgeteilt. Über die Bubbels soll nun die Veränderung im Zeitablauf dargestellt werden.

Was ich nicht hinbekomme, ist die Größe dieser Bubbles über die Datumsvariable zu steuern, d.h. ältere Beobachtungen kleiner darzustellen während neuere durch Bubbles mit relativ großem Radius repräsentiert werden. Weder die BSCALE- noch die BSIZE-Option haben bei mir den gewünschten Effekt erzielt.

Ausserdem versuche ich an den Stellen (-1;1), (-1;-1), (1;-1) und (1;1) fixe Referenzpunkte (farbige Bubbles) einzuzeichnen.

Weiss jemand hierfür eine Lösung? Danke schon mal für die Hilfe!

goptions
        
reset=global gunit=pct
         
colors=(CX0000FF CXFF0000 CX008080 CX00FF00
                 CXFF00FF CXFFFF00 CX00FFFF CX800000
                 CX008000 CX800080 CX000080 CX808000
                 CXFFFFFF CX808080 CXC0C0C0 CX7B68EE)
        
noborder
;
axis1 label=(font=swiss 'Value-Dimension' color=black height=2)
      
order=(-2 to 2 by 1)
      
minor=none
      
width=2
      
value=(height=2)
      
color=black;
axis2 label=(font=swiss 'Size-Dimension'  a=-90 r=90 color=black height=2)
      
order=(-2 to 2 by 1)
      
major=(height=1.5)
      
minor=none
      
width=2
      
value=(height=2)
      
color=black;
proc gplot data=file;
      
bubble y_pos * x_pos= date
    /
      
href=0 chref=black lhref=1 haxis=axis1        
      
vref=0 cvref=black lvref=1 vaxis=axis2        
      
bcolor=black
;
   
by id;
run;
quit;

Datumsvariable anpassen

Der Ansatz ist schon richtig. Dass sich die Größe der Bubbles nicht an das Datum anpasst, liegt nur daran, dass die Datumswerte zu wenig unterschiedlich sind. Datumswerte werden als Anzahl Tage seit dem 1. Januar 1960 gespeichert, und der Unterschied zwischen heute (17405) und gestern (17404) ist an der Bubblegröße nicht wahrnehmbar. Daher einfach ein Referenzdatum nehmen und vom Datum abziehen, siehe Beispiel.

Farbige Bubbles kann man am besten mit Annotate einzeichnen.

Ich habe in dem Beispiel ODS verwendet und DEVICE=ACTXIMG, weil es besser aussieht. Die Bubbles werden dann auch gefüllt. Muss man natürlich nicht so machen. Wichtig aber: in der AXIS-Anweisung die Textattribute (angle, rotate, color, height ...) vor das eigentliche Label setzen, sonst wirken sie nicht.

Beispiel (lauffähig auf SAS 9.1.3 SP 4 Windows):

/* Beispieldaten */
data file;
   
informat date date9.;
   
input x_pos y_pos date;
   
/* datediff enthält die Differenz in Tagen zu einem Referenzdatum */
   
datediff = date - '24JUL2007'D;
datalines;
 -1.0 -2.0 27JUL2007
 -0.6 -1.2 03AUG2007
 -0.2 -0.4 11AUG2007
  0.2  0.4 18AUG2007
  0.6  1.2 25AUG2007
  1.0  2.0 01SEP2007
 ;

/* Annotate-Befehle für farbige Referenzpunkte */
data referenz;
   
length function style color $ 8 when $ 1;
   
retain
      
xsys ysys '2'
      
hsys      '4'
      
when      'a'
      
function  'pie'
      
style     'ps'
      
size      0.5
      
angle     0
      
rotate    360
   
;
   color =
'red'   ;  x = -1; y = -1; output;
   color =
'green' ;  x =  1; y =  1; output;
   color =
'blue'  ;  x = -1; y =  1; output;
   color =
'yellow';  x =  1; y = -1; output;
run;
 
/* schönere Ausgabe über HTML mit actximg-Treiber */
ods html file='c:\temp\bubble.html' gpath='c:\temp';
ods listing;
goptions
        
reset=global
        
noborder
        
ftext='Arial' htext=12pt
        
device=actximg
        
xpixels=800 ypixels=800
;
axis1 label=(height=12pt 'Value-Dimension' )
      
order=(-2 to 2 by 1)
      
minor=none
      
color=black
;
axis2 label=(angle=90 'Size-Dimension')
      
order=(-2 to 2 by 1)
      
minor=none
      
color=black
;
proc gplot data=file anno=referenz;
      
bubble y_pos * x_pos = datediff /
      
href=0 chref=black lhref=1 haxis=axis1        
      
vref=0 cvref=black lvref=1 vaxis=axis2        
      
bcolor=black
;
run;
quit;
ods html close;

Vielen Dank, Herr

Vielen Dank, Herr Mangold!
Sie waren mir wie immer eine sehr große Hilfe!

Eine weiterführende Frage habe ich noch:

Gibt es eine Möglichkeit, nur die in dem Referenzfile festgelegten farbigen Bubbles jeweils mit einem Label zu versehen?

Annotate-Label

Ich habe den Teil, der die Annotate-Datei erstellt, angepasst. Die Label-Funktion gibt ein Label aus. Die Position des Labels wird mit Hilfe der Position-Variable eingestellt. Da sich dann immer noch eine Überlappung ergibt, habe ich die Koordinaten leicht korrigiert.

data referenz;
   
length function style color $ 8 when position $ 1;
   
retain
      
xsys ysys '2'
      
hsys      '4'
      
when      'a'
      
angle     0
      
rotate    360
   
;
   x = -
1; y = -1; color = 'red'   ; position = '7';
   
link refpoint; link label;
   x =  
1; y =  1; color = 'green' ; position = '3';
   
link refpoint; link label;
   x = -
1; y =  1; color = 'blue'  ; position = '1';
   
link refpoint; link label;
   x =  
1; y = -1; color = 'yellow'; position = '9';
   
link refpoint; link label;
   
return;

   refpoint:
      function =
'pie' ;
      style    =
'PS';
      size=
0.5;
      
output;
   
return;

   label:
      function =
'label';
      color =
'black';
      style =
'"Arial"';
      size  =
1.0;
      x     = x*
1.05;
      y     = y*
1.05;
      text =
'Referenzpunkt ' !!
             compress(put(x,
2.)) !! '/' !!
             compress(put(y,
2.));
      
output;
   
return;
run;
So sollte das dann aussehen:
Ergebnis