15

円形のプロットを作成しようとしていますが、ある時点で立ち往生しています。

dat1 <- data.frame (xvar = 1:10, y = 6, ymin = 4, ymax = 4.5)

このデータを使用して、ggplot2で円形のリボンプロットを作成できます

require(ggplot2) 
 ggplot(dat1, aes(x=xvar, y=y)) +  geom_ribbon(aes(ymin=ymin, ymax=ymax),
  col = "blue", fill = "blue2") + ylim (c(0,6)) + coord_polar()

しかし、もっと欲しいです。

次のデータを使用して、リボンのセグメントをさまざまな色とラベルで塗りつぶしたいと思います。

 filld <- data.frame (start = c(1, 4, 6, 7.5, 8, 9), end = c(4, 6, 7.5, 8, 9, 10),
                         label = c("A", "B", "C", "A", "C", "D"))
  filld
##    start  end label
## 1   1.0  4.0     A
## 2   4.0  6.0     B
## 3   6.0  7.5     C
## 4   7.5  8.0     A
## 5   8.0  9.0     C
## 6   9.0 10.0     D

リボンは、ラベル変数によって異なる色で塗りつぶされます。たとえば、セグメントAは1から始まり、4で終わります。次に、セグメントBは6で始まり、6で終わり、異なる色で塗りつぶされます。同じラベルのセグメント(AやCなど)は線で接続されます。

結果のプロットは次のようになります。

4

3 に答える 3

19

次に例を示します。

filld$p <- rowMeans(subset(filld, select = c(start, end)))
ggplot(filld, aes(xmin = start, xmax = end, ymin = 4, ymax = 5, fill = label)) + 
  geom_rect() + 
  geom_segment(data = subset(filld, label %in% label[duplicated(label)]),
               aes(x = p, y = 0, xend = p, yend = 4, colour = label),
               size = 2, show_guide = FALSE) +
  geom_text(aes(x = p, y = 4.5, label = label), colour = "white", size = 10) +
  coord_polar() + 
  scale_y_continuous(limits = c(0, 5))

更新しました

私はお勧めしませんが、次のようなものです:

filld <- data.frame (start = c(1, 4, 6, 7.5, 8, 9), end = c(4, 6, 7.5, 8, 9, 10),
                     label = c("A", "B", "C", "A", "C", "D"))
filld$p <- rowMeans(subset(filld, select = c(start, end)))
filld <- merge(filld, ddply(filld, .(label), summarize, p2 = mean(p)))

lnd <- subset(filld, label %in% label[duplicated(label)])
lnd <- ddply(lnd, .(label), function(x) {
  x <- seq(x$p[1], x$p[2], length = 100)
  y <- 4.5 + ((x - mean(x))^2 - (x[1]-mean(x))^2) / (x[1]-mean(x))^2 * 3 + sin(x*3*pi) * 0.1
  data.frame(x, y)
})


p <- ggplot(filld, aes(xmin = start, xmax = end, ymin = 4, ymax = 5, colour = label, fill = label)) + 
  geom_line(aes(x, y, xmin = NULL, ymin = NULL, xmax = NULL, ymax = NULL), data = lnd, size = 2) +
  geom_rect() + 
  geom_text(aes(x = p, y = 4.5, label = label), colour = "white", size = 10) +
  coord_polar() + 
  scale_y_continuous(limits = c(0, 5))
p

おそらく、あなたが望むものはggplot2の範囲を超えています.

于 2012-07-25T02:39:01.383 に答える
8

ggbioを見てください。このパッケージは、ggplot2 とグラフィックスの文法をシーケンス データ (バイオインフォマティクス) に拡張しますが、問題を解決するようです (たとえば、こちらを参照してください)。パッケージのソース コードを調べると、より一般的なソリューションにたどり着くことがあります。

于 2012-07-25T09:59:18.963 に答える
6

yminなどを追加してdを埋めます

fd <- data.frame(filld, ymin = 4, y =6, ymax = 4.5)

次に、美学としてgeom_rectカラムと一緒に使用しますlabelfillcolour

 ggplot(fd, aes(x=start,xmin = start, xmax = end, y=y)) +  
   geom_rect(aes(ymin=ymin, ymax=ymax, fill = label )) + 
   ylim (c(0,6)) + 
   coord_polar() 

次の行を追加します。

## calculate the midpoint for each segment
fd$xmid <- apply(fd[,1:2],1,mean)
## get the replicate id for the labels (what occurence is this)
library(plyr)
library(reshape2)
fd1 <- ddply(fd, .(label), mutate, id = 1:length(xmid))
## reshape to wide, subsetting only with more than one rep
.lines <- na.omit(dcast(fd1, label~id, value.var = 'xmid'))
## add a mid point between the mid points
.lines$mid <- apply(.lines[,2:3],1,mean)
## reshape to long, and add some y values 
ld <- data.frame(arrange(melt(.lines,value.name = 'x'), label, x), y = rep(c(4,3,4),2))

ggplot(fd) +  
  geom_rect(aes(x=start,xmin = start, xmax = end, y=y,ymin=ymin, ymax=ymax, fill = label )) + 
  ylim (c(0,6)) + 
  coord_polar() + geom_path(data = ld, aes(x=x,y=y,colour = label))

線は醜いですが、そこにあります!

于 2012-07-25T01:23:47.180 に答える