40

以下のようなプロットを作成したいと思います。

ここに画像の説明を入力

パッケージのradarchart関数を使用できることはわかっています。極座標を使用して、そうすることができるのfmsbだろうか?ggplot2ありがとう。

4

5 に答える 5

10

まず、いくつかのパッケージをロードします。

library(reshape2)
library(ggplot2)
library(scales)

リンク先のレーダーチャートの例のデータは次のとおりです。

maxmin <- data.frame(
  total  = c(5, 1),
  phys   = c(15, 3),
  psycho = c(3, 0),
  social = c(5, 1),
  env    = c(5, 1)
)
dat <- data.frame(
  total  = runif(3, 1, 5),
  phys   = rnorm(3, 10, 2),
  psycho = c(0.5, NA, 3),
  social = runif(3, 1, 5),
  env    = c(5, 2.5, 4)
)

それらをggplotに適したものにするには、少し操作が必要です。

それらを正規化し、id 列を追加して、長い形式に変換します。

normalised_dat <- as.data.frame(mapply(
    function(x, mm)
    {
      (x - mm[2]) / (mm[1] - mm[2])
    },
    dat,
    maxmin
))

normalised_dat$id <- factor(seq_len(nrow(normalised_dat)))
long_dat <- melt(normalised_dat, id.vars = "id")

ggplot はまた、最初と最後の要素が一致するように値をラップします。これを避けるために、因子レベルを追加します。これはもはや真実ではありません。

level(long_dat$variable) <- c(levels(long_dat$variable), "")

これがプロットです。まったく同じではありませんが、これで始められるはずです。

ggplot(long_dat, aes(x = variable, y = value, colour = id, group = id)) +
  geom_line() +
  coord_polar(theta = "x", direction = -1) +
  scale_y_continuous(labels = percent)

ここに画像の説明を入力coord_polarを使用すると、線が湾曲 することに注意してください。直線が必要な場合は、別の手法を試す必要があります。

于 2012-03-08T11:18:08.607 に答える
4

非極座標バージョンを探している場合は、次の関数が役立つと思います。

###################################
##Radar Plot Code
##########################################
##Assumes d is in the form:
# seg  meanAcc sdAcc   meanAccz sdAccz meanSpd   sdSpd   cluster
# 388  -0.038   1.438   -0.571  0.832  -0.825   0.095       1
##where seg is the individual instance identifier
##cluster is the cluster membership
##and the variables from meanACC to sdSpd are used for the clustering
##and thus should be individual lines on the radar plot
radarFix = function(d){
  ##assuming the passed in data frame 
  ##includes only variables you would like plotted and segment label
  d$seg=as.factor(d$seg)
  ##find increment
  angles = seq(from=0, to=2*pi, by=(2*pi)/(ncol(d)-2))
  ##create graph data frame
  graphData= data.frame(seg="", x=0,y=0)
  graphData=graphData[-1,]



  for(i in levels(d$seg)){
    segData= subset(d, seg==i)
    for(j in c(2:(ncol(d)-1))){
      ##set minimum value such that it occurs at 0. (center the data at -3 sd)
      segData[,j]= segData[,j]+3

      graphData=rbind(graphData, data.frame(seg=i, 
                                            x=segData[,j]*cos(angles[j-1]),
                                            y=segData[,j]*sin(angles[j-1])))
    }
    ##completes the connection
    graphData=rbind(graphData, data.frame(seg=i, 
                                          x=segData[,2]*cos(angles[1]),
                                          y=segData[,2]*sin(angles[1])))

  }
  graphData

}

クラスターまたはグループごとにプロットする場合は、次を使用できます。

radarData = ddply(clustData, .(cluster), radarFix)
ggplot(radarData, aes(x=x, y=y, group=seg))+
  geom_path(alpha=0.5,colour="black")+
  geom_point(alpha=0.2, colour="blue")+
  facet_wrap(~cluster)

これは、次のデータ サンプルで機能するはずです。

   seg  meanAccVs sdAccVs meanSpd sdSpd cluster
  1470     1.420   0.433  -0.801 0.083       1
  1967    -0.593   0.292   1.047 0.000       3
  2167    -0.329   0.221   0.068 0.053       7
  2292    -0.356   0.214  -0.588 0.056       4
  2744     0.653   1.041  -1.039 0.108       5
  3448     2.189   1.552  -0.339 0.057       8
  7434     0.300   0.250  -1.009 0.088       5
  7764     0.607   0.469  -0.035 0.078       2
  7942     0.124   1.017  -0.940 0.138       5
  9388     0.742   1.289  -0.477 0.301       5

レーダープロット

于 2012-05-30T16:28:02.233 に答える
2

これは、ほとんどggplotでそれを行う答えです。

私はここに例を置く以上のことは主張しません。これはハドリーがここで示したものに基づいていますhttps://github.com/hadley/ggplot2/issues/516

私がしたことは、代わりに deployer/tidyr を使用し、簡単にするために 3 台の車のみを選択することだけでした。

まだ保留中の問題は、1) 最後のポイントと最初のポイントが接続されていないことです。coord_polar が従来の x 軸のラッピングとして表示される場合、これは明らかです。それらを接続する理由はありません。しかし、レーダー チャートは通常このように表示されます。2) そのためには、これら 2 点の間に手動でセグメントを追加する必要があります。少し操作し、さらにいくつかのレイヤーを追加する必要があります。時間があれば取​​り組んでみます

library(dplyr);library(tidyr);library(ggplot2)
#make some data
data = mtcars[c(27,19,16),]
data$model=row.names(data)

#connvert data to long format and also rescale it into 0-1 scales
data1 <- data %>% gather(measure,value,-model) %>% group_by(measure) %>% mutate(value1=(value-min(value))/(max(value)-min(value)))

is.linear.polar <- function(coord) TRUE
ggplot(data1,aes(x=measure,y=value1,color=model,group=model))+geom_line()+coord_polar()
于 2015-04-09T18:14:58.723 に答える