In the spirit of Pi Day, and motivated by the great holiday posts by @tc, I thought I'd post a challenge for the graphics gurus. While writing a Pi Day blog post about how Isaac Newton approximated pi to 16 decimals places, I needed to create a diagram that shows the geometry that Newton used in the calculation. I was in a hurry, so I used PowerPoint to create the image.
My challenge: Can you create the image by using PROC SGPLOT (or the GTL)?
I'll give you a hint: Archimedes knew that you could approximate a circle to any accuracy by using a polygon with many sid...
To keep it simple, you do NOT have to use the square-root symbol in your plot; use 'sqrt(3)' instead.
Here's the figure from my Pi Day post. Good luck!
/*I forgot the vertical symbol*/
data have;
id1=1;
do theta=0 to constant('pi') by 0.01;
x=0.5*cos(theta)+0.5; y=0.5*sin(theta);output;
end;
id2=1;
do theta=0 to (2/3)*constant('pi') by 0.01;
_x=0.5*cos(theta)+0.5; _y=0.5*sin(theta);output;
end;
_x=0.25;_y=0;output;
x1=0.5; y1=0.66;output;
x1=1.32; y1=0;output;
x2=0.5; y2=0;datalabel='C';output;
x2=0; y2=0;datalabel='O';output;
x2=0.25;y2=0;datalabel='A';output;
x3=0.25;y3=sqrt(3)/4;datalabel='B';output;
id3=1;x4=0.3;y4=0.05;output;
id3=1;x4=0.3;y4=0;output;
id3=2;x4=0.3;y4=0.05;output;
id3=2;x4=0.25;y4=0.05;output;
run;
%sganno
data sganno;
%SGARROW( X1=0, Y1=0,X2=0,Y2=100,DIRECTION= "OUT",X1SPACE="DATAVALUE",Y2SPACE="WALLPERCENT",
X2SPACE="DATAVALUE",Y1SPACE="DATAVALUE",LINECOLOR="blue" ,SHAPE="BARBED" )
%SGARROW( X1=0, Y1=0,X2=100,Y2=0,DIRECTION= "OUT",X1SPACE="DATAVALUE",Y2SPACE="DATAVALUE",
X2SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",LINECOLOR="blue" ,SHAPE="BARBED" )
%SGTEXT( LABEL="O",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0, Y1=0, WIDTH=12)
%SGTEXT(LABEL="0", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0,Y1=-0.05,WIDTH=12)
%SGTEXT( LABEL="A",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.25, Y1=0, WIDTH=12)
%SGTEXT(LABEL="1/4", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.25,Y1=-0.05,WIDTH=12)
%SGTEXT( LABEL="C ",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.5, Y1=0, WIDTH=12)
%SGTEXT(LABEL="1/2", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.5,Y1=-0.05,WIDTH=12)
%SGTEXT(LABEL="M", ANCHOR="BOTTOM" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.125,Y1=0.1,WIDTH=12,FILLCOLOR="white")
%SGTEXT(LABEL="r = 1/2", ANCHOR="BOTTOMLEFT" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.4,Y1=0.2,WIDTH=12)
%SGTEXT( LABEL="x",ANCHOR="TOP" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=95, Y1=0, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="y",ANCHOR="RIGHT" , X1SPACE="DATAVALUE",Y1SPACE="WALLPERCENT",TEXTSIZE= 12,X1=0, Y1=90, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="3/4 ",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=0, Y1=0.433, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="(*ESC*){unicode '221A'x}",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=-3, Y1=0.433, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="(*ESC*){unicode '2013'x}",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=-1.7, Y1=0.448, WIDTH=12,FILLTRANSPARENCY=1)
run;
proc sgplot data=have noborder aspect=0.5 sganno=sganno noautolegend pad=(left=40);
polygon id=id1 x=x y=y/fillpattern nofill fillpatternattrs=(color=brown);
polygon id=id2 x=_x y=_y/fill fillattrs=(color=white);
series x=x y=y/smoothconnect lineattrs=(color=blue thickness=2);
scatter x=x1 y=y1/markerattrs=(size=0);
scatter x=x3 y=y3/markerattrs=(symbol=circlefilled)
datalabel=datalabel datalabelpos=topleft datalabelattrs=(size=12);
scatter x=x2 y=y2/markerattrs=(symbol=circlefilled) ;
vector x=x3 y=y3/xorigin=0.5 yorigin=0 noarrowheads lineattrs=(color=blue thickness=2);
dropline x=x3 y=y3/dropto=x lineattrs=(pattern=solid color=blue thickness=2) ;
dropline x=x3 y=y3/dropto=y lineattrs=(pattern=shortdash color=blue thickness=2) ;
series x=x4 y=y4/group=id3 lineattrs=(pattern=solid color=blue thickness=2) ;
yaxis offsetmin=0.01 offsetmax=0 label='y' display=none min=-0.006 ;
xaxis offsetmin=0.01 offsetmax=0 label='x' display=none;
run;
Rick,
Finally, I got it worked . It is really uneasy. Have fun with the following code.
data have;
id1=1;
do theta=0 to constant('pi') by 0.01;
x=0.5*cos(theta)+0.5; y=0.5*sin(theta);output;
end;
id2=1;
do theta=0 to (2/3)*constant('pi') by 0.01;
_x=0.5*cos(theta)+0.5; _y=0.5*sin(theta);output;
end;
_x=0.25;_y=0;output;
x1=0.5; y1=0.66;output;
x1=1.32; y1=0;output;
x2=0.5; y2=0;datalabel='C';output;
x2=0; y2=0;datalabel='O';output;
x2=0.25;y2=0;datalabel='A';output;
x3=0.25;y3=sqrt(3)/4;datalabel='B';output;
run;
%sganno
data sganno;
%SGARROW( X1=0, Y1=0,X2=0,Y2=100,DIRECTION= "OUT",X1SPACE="DATAVALUE",Y2SPACE="WALLPERCENT",
X2SPACE="DATAVALUE",Y1SPACE="DATAVALUE",LINECOLOR="blue" ,SHAPE="BARBED" )
%SGARROW( X1=0, Y1=0,X2=100,Y2=0,DIRECTION= "OUT",X1SPACE="DATAVALUE",Y2SPACE="DATAVALUE",
X2SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",LINECOLOR="blue" ,SHAPE="BARBED" )
%SGTEXT( LABEL="O",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0, Y1=0, WIDTH=12)
%SGTEXT(LABEL="0", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0,Y1=-0.05,WIDTH=12)
%SGTEXT( LABEL="A",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.25, Y1=0, WIDTH=12)
%SGTEXT(LABEL="1/4", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.25,Y1=-0.05,WIDTH=12)
%SGTEXT( LABEL="C ",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.5, Y1=0, WIDTH=12)
%SGTEXT(LABEL="1/2", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.5,Y1=-0.05,WIDTH=12)
%SGTEXT(LABEL="M", ANCHOR="BOTTOM" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.125,Y1=0.1,WIDTH=12,FILLCOLOR="white")
%SGTEXT(LABEL="r = 1/2", ANCHOR="BOTTOMLEFT" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.4,Y1=0.2,WIDTH=12)
%SGTEXT( LABEL="x",ANCHOR="TOP" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=95, Y1=0, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="y",ANCHOR="RIGHT" , X1SPACE="DATAVALUE",Y1SPACE="WALLPERCENT",TEXTSIZE= 12,X1=0, Y1=90, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="3/4 ",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=0, Y1=0.433, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="(*ESC*){unicode '221A'x}",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=-3, Y1=0.433, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="(*ESC*){unicode '2013'x}",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=-1.7, Y1=0.448, WIDTH=12,FILLTRANSPARENCY=1)
run;
proc sgplot data=have noborder aspect=0.5 sganno=sganno noautolegend pad=(left=40);
polygon id=id1 x=x y=y/fillpattern nofill fillpatternattrs=(color=brown);
polygon id=id2 x=_x y=_y/fill fillattrs=(color=white);
series x=x y=y/smoothconnect lineattrs=(color=blue thickness=2);
scatter x=x1 y=y1/markerattrs=(size=0);
scatter x=x3 y=y3/markerattrs=(symbol=circlefilled)
datalabel=datalabel datalabelpos=topleft datalabelattrs=(size=12);
scatter x=x2 y=y2/markerattrs=(symbol=circlefilled) ;
vector x=x3 y=y3/xorigin=0.5 yorigin=0 noarrowheads lineattrs=(color=blue thickness=2);
dropline x=x3 y=y3/dropto=x lineattrs=(pattern=solid color=blue thickness=2) ;
dropline x=x3 y=y3/dropto=y lineattrs=(pattern=shortdash color=blue thickness=2) ;
yaxis offsetmin=0.01 offsetmax=0 label='y' display=none min=-0.006 ;
xaxis offsetmin=0.01 offsetmax=0 label='x' display=none;
run;
/*I forgot the vertical symbol*/
data have;
id1=1;
do theta=0 to constant('pi') by 0.01;
x=0.5*cos(theta)+0.5; y=0.5*sin(theta);output;
end;
id2=1;
do theta=0 to (2/3)*constant('pi') by 0.01;
_x=0.5*cos(theta)+0.5; _y=0.5*sin(theta);output;
end;
_x=0.25;_y=0;output;
x1=0.5; y1=0.66;output;
x1=1.32; y1=0;output;
x2=0.5; y2=0;datalabel='C';output;
x2=0; y2=0;datalabel='O';output;
x2=0.25;y2=0;datalabel='A';output;
x3=0.25;y3=sqrt(3)/4;datalabel='B';output;
id3=1;x4=0.3;y4=0.05;output;
id3=1;x4=0.3;y4=0;output;
id3=2;x4=0.3;y4=0.05;output;
id3=2;x4=0.25;y4=0.05;output;
run;
%sganno
data sganno;
%SGARROW( X1=0, Y1=0,X2=0,Y2=100,DIRECTION= "OUT",X1SPACE="DATAVALUE",Y2SPACE="WALLPERCENT",
X2SPACE="DATAVALUE",Y1SPACE="DATAVALUE",LINECOLOR="blue" ,SHAPE="BARBED" )
%SGARROW( X1=0, Y1=0,X2=100,Y2=0,DIRECTION= "OUT",X1SPACE="DATAVALUE",Y2SPACE="DATAVALUE",
X2SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",LINECOLOR="blue" ,SHAPE="BARBED" )
%SGTEXT( LABEL="O",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0, Y1=0, WIDTH=12)
%SGTEXT(LABEL="0", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0,Y1=-0.05,WIDTH=12)
%SGTEXT( LABEL="A",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.25, Y1=0, WIDTH=12)
%SGTEXT(LABEL="1/4", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.25,Y1=-0.05,WIDTH=12)
%SGTEXT( LABEL="C ",ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.5, Y1=0, WIDTH=12)
%SGTEXT(LABEL="1/2", ANCHOR="TOP" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.5,Y1=-0.05,WIDTH=12)
%SGTEXT(LABEL="M", ANCHOR="BOTTOM" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.125,Y1=0.1,WIDTH=12,FILLCOLOR="white")
%SGTEXT(LABEL="r = 1/2", ANCHOR="BOTTOMLEFT" , DRAWSPACE= "DATAVALUE" ,TEXTSIZE= 12,X1=0.4,Y1=0.2,WIDTH=12)
%SGTEXT( LABEL="x",ANCHOR="TOP" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=95, Y1=0, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="y",ANCHOR="RIGHT" , X1SPACE="DATAVALUE",Y1SPACE="WALLPERCENT",TEXTSIZE= 12,X1=0, Y1=90, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="3/4 ",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=0, Y1=0.433, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="(*ESC*){unicode '221A'x}",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=-3, Y1=0.433, WIDTH=12,FILLTRANSPARENCY=1)
%SGTEXT( LABEL="(*ESC*){unicode '2013'x}",ANCHOR="RIGHT" , X1SPACE="WALLPERCENT",Y1SPACE="DATAVALUE",TEXTSIZE= 12,X1=-1.7, Y1=0.448, WIDTH=12,FILLTRANSPARENCY=1)
run;
proc sgplot data=have noborder aspect=0.5 sganno=sganno noautolegend pad=(left=40);
polygon id=id1 x=x y=y/fillpattern nofill fillpatternattrs=(color=brown);
polygon id=id2 x=_x y=_y/fill fillattrs=(color=white);
series x=x y=y/smoothconnect lineattrs=(color=blue thickness=2);
scatter x=x1 y=y1/markerattrs=(size=0);
scatter x=x3 y=y3/markerattrs=(symbol=circlefilled)
datalabel=datalabel datalabelpos=topleft datalabelattrs=(size=12);
scatter x=x2 y=y2/markerattrs=(symbol=circlefilled) ;
vector x=x3 y=y3/xorigin=0.5 yorigin=0 noarrowheads lineattrs=(color=blue thickness=2);
dropline x=x3 y=y3/dropto=x lineattrs=(pattern=solid color=blue thickness=2) ;
dropline x=x3 y=y3/dropto=y lineattrs=(pattern=shortdash color=blue thickness=2) ;
series x=x4 y=y4/group=id3 lineattrs=(pattern=solid color=blue thickness=2) ;
yaxis offsetmin=0.01 offsetmax=0 label='y' display=none min=-0.006 ;
xaxis offsetmin=0.01 offsetmax=0 label='x' display=none;
run;
@Ksharp posted a very nice program. Anyone want to solve it without using the annotation facility?
Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.
If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.