2016-10-22 12 views
1

私は木のリングをプロットし、その面積を計算しようとしています。しかし、私は、実際には、すべてのリングが円のような対称の半径を持っているわけではないことに気付きました。 (この図では、PowerPointのベクターを用いて手動で行われていた)私は4つの半径のデータ測定値を持っており、私は、この例のように、すべての無線の各点以下の環(又は任意の同様の形状)をプロットしたい:いくつかの点に続いて形(楕円形または楕円形)を描き、その領域を計算する方法は?

enter image description here

data <- data.frame(
a = c(1,4,5,8, 10), 
b = c(1, 3,7,9, 10), 
c = c(2, 6, 8, 9 ,10), 
d = c(1, 3, 4, 7, 9)) 

data$y <- (data$a - data$b)/2 # y position 
data$x <- (data$d - data$c)/2 # x position 
data$z <- rowMeans(data[,1:4]) # radio length 

symbols(x = data$x, y = data$y, circles=data$z, 
     xlim = c(-10, 10)*1.5, ylim = c(-10, 10)*1.5, inches = F, fg = "orange", lwd = 2) 
:このRスクリプトを使用して enter image description here

問題がRIにsymbols()機能からcirclesオプションを使用してこれらのリングをプロットするための唯一の可能性を発見した、と私はこのグラフを得たことです

私は、省略記号(elliplotellipseellipseplotcarなど)を描画する機能を持つパッケージをチェックしましたが、その機能が嫌いです。私はこれらのパッケージを使用することに興味がありません、逆に私は独自のコードを記述したいと思います。

私の考えでは、それは私だけで使用しているサークルでなど

楕円、楕円形とすることができる最高のは、4つの半径の私のデータ値を持つリングの本当の姿を満たしている形状をプロットすることです1つのラジオのデータ(私の例では、すべての半径の平均)。 長軸(A + B)と短軸(C + D)の少なくとも2つの値を使用できるので、楕円の方が良いでしょう。しかし、4つの半径(A、B、C、D)またはそれ以上の半径の値を使用する形を描くのはすばらしいことです。

Here男はR scriptを使用して非常に素晴らしいsuperellipseを描いた、そしてもう一つは、いくつかのellipses likes ringsin Rを描きました。

しかし、自分の特定の問題に自分のメソッドを使用する方法はわかりません。

誰かがRで少なくとも楕円を描画する方法を知っていればいいですね。しかし、4つの半径の値を使用して形状(楕円形、楕円形など)を描き、最終的にその面積を計算する方法を知ることは素晴らしいことです。

私は非常にあなたの助けやそれを行うために指示をいただきたいと思います。

UPDATE:あなたの優秀な答えをcuttlefish44 @

おかげで、それは私の生徒たちに木の成長を説明するのに非常に有用でした。しかし、ほとんどの熱帯の木は非常に不規則な形状を持っているし、今私は、追加のラジオ「E」と、このスキームのように異なる位置で半径軸と、この他の形状を描くことができますかどうかを知るために疑問に思って:

irregular stem shape

どんな方向性であれ私にとって非常に便利です。

答えて

1

y軸上にA & Bがあり、x軸上にC & Dがある場合、楕円のパラメータを計算することは困難ではありません。私はoptim()を使用してparamsを取得しました(注:このアプローチには、2.439826e-12などの小さなエラーがあります)。

データ操作センターの計算座標
# change all data into xy coordinates and make ring-factor 
library(reshape2); library(dplyr) 

data <- data.frame(
    a = c(1, 4, 5, 8, 10), 
    b = c(1, 3, 7, 9, 10) * -1, 
    c = c(2, 6, 8, 9, 10) * -1, 
    d = c(1, 3, 4, 7, 9)) 

data <- t(data) 
colnames(data) <- LETTERS[1:ncol(data)] # ring-factor 
df <- melt(data, value.name = "x")  # change into long-form 

df$y <- df$x        # make xy coordinates 
df[df$Var1=="a"|df$Var1=="b", "x"] <- 0 
df[df$Var1=="c"|df$Var1=="d", "y"] <- 0 
、OX & OY
center <- df %>% group_by(Var2) %>% summarize(sum(x)/2, sum(y)/2) %>% as.data.frame() 
楕円のパラメータの計算。半メジャーと-minor(おそらくいくつかのパッケージは、同様のものを持っている)をプロットする軸、RA & RB
opt.f <- function(par, subset, center) {  # target function 
    ox <- center[[1]]       # par[1] and par[2] are ra and rb 
    oy <- center[[2]] 
    x <- subset$x 
    y <- subset$y 
    sum(abs((x - ox)^2/par[1]^2 + (y - oy)^2/par[2]^2 - 1)) # from ellipse equation 
} 

lev <- levels(df$Var2) 

## search parameters 
res <- sapply(1:length(lev), function(a) 
    optim(c(1,1), opt.f, subset = subset(df, Var2 == lev[a]), 
     center = center[a, 2:3], control = list(reltol = 1.0e-12))) 

res # result. you can get detail by res[,1etc]. values are not 0 but much nearly 0 
機能
radian <- function(degree) degree/180*pi 
plot.ellipse <- function(ox, oy, ra, rb, phi=0, start=0, end=360, length=100, func=lines, ...) { 
    theta <- c(seq(radian(start), radian(end), length=length), radian(end)) 
    if (phi == 0) { 
    func(ra*cos(theta)+ox, rb*sin(theta)+oy, ...) 
    } else { 
    x <- ra*cos(theta) 
    y <- rb*sin(theta) 
    phi <- radian(phi) 
    cosine <- cos(phi) 
    sine <- sin(phi) 
    func(cosine*x-sine*y+ox, sine*x+cosine*y+oy, ...) 
    } 
} 
あなたの優秀な答えを
plot(0, type="n", xlim=c(-10, 10), ylim =c(-10, 10), asp=1, xlab="x", ylab="y", axes = F) 
axis(1, pos=0);axis(2, pos=0, las=2) 
points(df$x, df$y) 
for(a in 1:length(lev)) plot.ellipse(ox = center[a, 2], oy = center[a, 3], 
            ra = res[,a]$par[1], rb = res[,a]$par[2], length=300) 

area <- sapply(res[1,], function(a) pi * a[1] * a[2]) 

enter image description here

+0

感謝を描きます。しかし、私はより多くの不規則な形を描くために新たな問題を抱えています。私は必要なものを説明するために自分の投稿を更新しました。それとも、新しい質問を作成する方がよいと思いますか? –

関連する問題