以下のようなプロットを作成したいと思います。
パッケージのradarchart
関数を使用できることはわかっています。極座標を使用して、そうすることができるのfmsb
だろうか?ggplot2
ありがとう。
以下のようなプロットを作成したいと思います。
パッケージのradarchart
関数を使用できることはわかっています。極座標を使用して、そうすることができるのfmsb
だろうか?ggplot2
ありがとう。
まず、いくつかのパッケージをロードします。
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
を使用すると、線が湾曲
することに注意してください。直線が必要な場合は、別の手法を試す必要があります。
非極座標バージョンを探している場合は、次の関数が役立つと思います。
###################################
##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
これは、ほとんど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()