2017-12-02 3 views
1

特定のデータセットに新しい関数を適用する際に問題があるようです。ポリゴンにユーザー定義関数を適用して、特定のデータセットの円を繰り返し描くR

私は引数として半径rだけでなく中心のx座標xとy座標yをとり、(x + r sin(ti))に頂点を持つポリゴンを描画する関数 "circle"を定義しました。 ; y + rcos(ti))ここで、tiは0から2までの長さ100のシーケンスです。円に追加された引数はポリゴンに渡されます。

関数は次のようになります。それはまた、X、Y及びRは、長さのベクトルである場合に動作するように私は、機能を変更した

circle<-function(x,y,r,...) {  
ti<-seq(0,(2*pi),length.out = 100)   
polygon(x + r *sin(ti),y+r*cos(ti),...) 
} 

> 1.それはこのようになります

:だから、

circle<-function(x,y,r,...) { 
ti<-seq(0,(2*pi),length.out = 100) 
data.fun<-as.data.frame(cbind(x,y,r)) 
for (i in 1:nrow(data.fun)) { 
polygon(x[i] + r[i] *sin(ti),y[i]+r[i]*cos(ti),...) 
    } 

} 

は、私が使用している場合:

plot(c(-3,3), c(-3,3), type="n") 
circle(c(0,2), c(0,0), c(1, 0.5)) 

小さな円のある円を右に描画します。

ただし、与えられたデータセットに関数を適用し、x、y、rの列名を使用しようとすると機能しません。

データは次のようになります。

head(health) 
Country  Region Population LifeExpectancy HealthExpenditure 
Albania  Europe  3204284  76.90095  2.202286 
Algeria Middle East 35468208  72.85254  1.981556 
Angola  Africa  19081912  50.65366  1.461099 
Argentina Latin America 40412376  75.63215  7.592994 
Armenia Europe  3092072  73.78356  1.337856 
Australia East Asia 22065300  81.69512  51.735024 

私は($ 100の内)医療費に対するplotof余命を作成する必要があります。プロットは、 sqrt(母集団[i])/ 10000の(HealthExpenditure [i] LifeExpectancy [i])に描かれた の円で構成され、それぞれの円の塗りつぶし色は はその地域を示す必要があります。

しかし、私は

circle(HealthExpenditure,LifeExpectancy,(sqrt(Population)/1000)), 

機能が動作しないをしようとしたとき。 私はまた、列名をデフォルト値として関数を再定義しようとしましたが、成功しませんでした。

上記の列名に関数を適用し、国の円を1つずつプロットするにはどうすればよいですか? (私はMASSのeqscplot関数を使用しようとしています)

答えて

1

mapplyを同じ長さのベクトルに渡って繰り返し実行します(複数適用)。この方法では、定義された関数の内部でforループを実行する必要はありません。同様mapplyを使用し、実際のデータフレームについて

circle <- function(x, y, r,...) {  
    ti <- seq(0, (2*pi), length.out = 100)   
    polygon(x + r *sin(ti), y+r*cos(ti),...) 
} 

df <- data.frame(x=c(0,2), y=c(0,0), z=c(1, 0.5)) 

plot(c(-3,3), c(-3,3), type="n") 
mapply(circle, df$x, df$y, df$z) 

forループバージョンに、正確に掲示試み、circle(c(0,2), c(0,0), c(1, 0.5))として元バージョンを使用して出力以下。そしてもちろんそれに応じて、DF、プロットの大きさとデータフレーム名を調整します

df <- read.table(text='Country  Region Population LifeExpectancy HealthExpenditure 
Albania  Europe  3204284  76.90095  2.202286 
Algeria "Middle East" 35468208  72.85254  1.981556 
Angola  Africa  19081912  50.65366  1.461099 
Argentina "Latin America" 40412376  75.63215  7.592994 
Armenia Europe  3092072  73.78356  1.337856 
Australia "East Asia" 22065300  81.69512  51.735024', header=TRUE) 

# COLOR FILL AND COLOR BORDER ADDED 
circle <- function(x, y, r, c,...) {  
    ti <- seq(0, (2*pi), length.out = 100)   
    polygon(x + r *sin(ti), y+r*cos(ti),col=c,border=c,...) 
} 
# RANDOMLY SAMPLE FROM palette() 
color_list <- sample(rep(palette(), nrow(df)), nrow(df), replace=TRUE) 

plot(c(0,100), c(0,100), type="n") 
output <- mapply(circle, df$HealthExpenditure, df$LifeExpectancy, (sqrt(df$Population)/1000), color_list) 

Circle Polygon Plot

+0

はお返事パフェをいただき、ありがとうございます。私はこの解決策を試しましたが、残念ながらコマンドはすべての行に対してNULLを返し、プロットには何も表示されません。私はまだ何が間違っているのか分からない。 – red22

+0

私はプロットのx座標とy座標のみを調整した投稿データを使用して更新を表示します。私は別のベクトルとして渡す色を追加します。あなたは 'mapply'を* output *のようなオブジェクトに割り当てて、NULLからの印刷を避けることができます。 – Parfait

関連する問題