1

木の年輪をプロットし、その面積を計算しようとしています。しかし、実際には、すべてのリングが円のように対称な半径を持つわけではないことに気付きました。4つの半径のデータ測定値があり、この例のようにすべての無線の各ポイントに続いてリング(または同様の形状)をプロットしたいと思います(この図はPowerPointでベクトルを使用して手動で作成されました):

ここに画像の説明を入力

circles問題は、RI で、関数からのオプションを使用してこれらのリングをプロットする可能性しか見つからなかったことです。次のsymbols()グラフが得られました。 ここに画像の説明を入力

この R スクリプトを使用して:

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)

楕円を描画する関数 ( elliplotellipseellipseplotcarなど) を含むいくつかのパッケージをチェックしましたが、それらの関数が好きではありません。私はこれらのパッケージを使用することに興味はありません。逆に、独自のコードを書きたいと思っています。

私の考えは、4つの半径のデータ値を使用して、リングの実際の形状に最もよく合う形状をプロットすることです。楕円、楕円などにすることができます.

円では、1 つのラジオのデータのみを使用しています (私の例では、すべての半径の平均)。長軸 (A+B) と短軸 (C+D) の少なくとも 2 つの値を使用できるため、楕円の方が適しています。しかし、4 つの半径 (A、B、C、D) またはそれ以上の半径の値を使用する形状を描画するのは素晴らしいことです。

ここでは、男がR スクリプトを使用して非常に素晴らしい超楕円を描き、別の人がRリングのような楕円を描きました。

ただし、特定の問題に対してそれらのメソッドを使用する方法がわかりません。

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

あなたの助けやそれを行うための指示をいただければ幸いです。

アップデート:

生徒に木の成長を説明するのに非常に役立ちました。ただし、ほとんどの熱帯の木は非常に不規則な形をしており、ラジオ「E」を追加して、このスキームのように異なる位置にある半径軸を使用して、この別の形を描くことができるかどうかを知りたいと思っています。

不規則な茎の形

どの方向も私にとって非常に役立ちます。

4

1 に答える 1

1

A と B が y 軸上にあり、C と D が x 軸上にある場合、楕円のパラメーターを計算することは難しくありません。以前optim()はパラメーターを取得していました (注: このアプローチには、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()
楕円のパラメータの計算; 長半径と短軸、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])

ここに画像の説明を入力

于 2016-10-23T08:44:04.253 に答える