【问题标题】:Circular plot with vectors in RR中带有向量的圆形图
【发布时间】:2018-12-21 21:42:45
【问题描述】:

我正在尝试创建一个圆形图,其中包含来自不同角度的原点的各种大小的向量:类似于下图,尽管它不必相同。我仔细研究了circularcircstats 并学到了很多关于圆形图的知识,但没有找到与我正在寻找的东西完全一样的东西。我想如果必须的话,我可以手工编写一些东西,但似乎比我更有经验的人已经编写了一些代码来做到这一点。


此图来自Schmidt, 2007, Ecology 88(11):2793-2802,图2C。

【问题讨论】:

  • !我认为它可能涉及箭头。圆形!更新关注!
  • 您有一些示例数据可以使用吗?这可能会加快响应速度。附带说明一下,您可以使用 ggplot2coord_polarstat_spoke 轻松完成此操作。
  • @TaliaYoung 我为剧情派对添加了一个新版本。
  • 非常感谢您的所有建议!我很感激!

标签: r plot


【解决方案1】:

grid 包对于组合和排列图形元素非常强大。

library(grid)

结果如下: 一些数据,我想剩下的就是你的价值观

polar <- read.table(text ='
degree value
1    120  0.50
2     30  0.20
3   160  0.20
4     35  0.50
5    150  0.40
6    90  0.14
7    70  0.50
8      20  0.60',header=T)


## function to create axis label
axis.text <- function(col,row,text,angle){
  pushViewport(viewport(layout.pos.col=col,layout.pos.row=row,just=c('top')))
  grid.text(angle,vjust=0) 
  grid.text(text,vjust=2)         
  popViewport()
}

## function to create the arrows, Here I use the data
arrow.custom <- function(polar){
  pushViewport(viewport(layout.pos.col=2,layout.pos.row=2))
  apply(polar,1,function(x){
       pushViewport(viewport(angle=x['degree']))  
          grid.segments(x0=0.5,y0=0.5,x1=0.5+x['value']*0.8,y1=0.5,
          arrow=arrow(type='closed'),gp=gpar(fill='grey'))
       popViewport()
  })
  popViewport()
}


## The global layout 3*3 matrix
lyt=grid.layout(3, 3, 
                   widths= unit(c(4,15,4), "lines"),
                   heights=unit(c(4,15,4), "lines"),
                   just='center')
pushViewport(viewport(layout=lyt,xscale=2*extendrange(polar$value)))
 ## the central part : circles , arrows and axes
pushViewport(viewport(layout.pos.col=2,layout.pos.row=2))
grid.circle(r=c(0.5,0.3),gp = gpar(ltw=c(3,2),col=c('black','grey')))
arrow.custom(polar)
grid.segments(x0=0.5,y0=0,x1=0.5,y=1,gp=gpar(col='grey'))
grid.segments(x0=0,y0=0.5,x1=1,y=0.5,gp=gpar(col='grey'))
popViewport()

## the axis labels 
axis.text(1,2,'Phragmites',expression(270 * degree))
axis.text(3,2,'Spartina',expression(90 * degree))
axis.text(2,1,'Increasing tropic position',expression(0 * degree))
axis.text(2,3,'Decreasing tropic position',expression(180 * degree))

【讨论】:

    【解决方案2】:

    plotrix 包包含一个 polar.plot 函数,似乎可以满足您的需求。不过,我还没有弄清楚如何沿着其中一条边的弧线添加虚线。

    示例:

    library(plotrix)
    
    testlen<-c(rnorm(36)*2+5)
    testpos<-seq(0,350,by=10)
    polar.plot(testlen,testpos,main="Test Polar Plot",lwd=3,line.col=4)
    
    #rotate degree
    oldpar<-polar.plot(testlen,testpos,main="Test Clockwise Polar Plot",
    start=180,clockwise=TRUE,lwd=3,line.col=4)
    
    # reset everything
    par(oldpar)
    

    【讨论】:

      【解决方案3】:

      我最终选择了 plotrix 中的 radial.plot(尽管事实证明 polar.plot 具有所有相同的功能 - 只是在我弄清楚它时没有很好地记录它)。我不知道如何做箭头,或沿圆周的部分虚线,但对我的目的来说都不重要。出于某种原因,我无法绘制第一个数据点,所以我插入了一个虚拟点。谢谢大家的帮助!

      library(plotrix)
      
      magnitude <- c(2.1, 2.3, 2.5, 1.5, 2.8, 2.7)
      angle <- c(2.1, 2.6, -0.1, -2.6, 0.1, 0.4)
      directionlabels <- c("more\nbenthic", "higher trophic", 
                           "more\npelagic", "lower trophic")
      colors <- c("black", "red", "green", "blue", "orange", "purple", "pink")
      par(cex.axis=0.7)
      par(cex.lab=0.5)
      
      radial.plot(c(0, magnitude), 
                  c(0, angle), 
                  lwd=4, line.col=,
                  labels=directionlabels,
                  radial.lim = c(0,3), #range of grid circle
                  main="circular diagram!",
                  show.grid.label=1, #put the concentric circle labels going down
                  show.radial.grid=TRUE
      )
      

      【讨论】:

        【解决方案4】:

        这是一种使用来自 TeachingDemos 包中的 my.symbols 以及 ms.polygonms.arrows 的方法:

        plot(c(-2,2),c(-2,2), axes=FALSE, xlab='', ylab='', type='n', asp=1)
        abline(v=0, col='lightgrey')
        abline(h=0, col='lightgrey')
        my.symbols(c(0,0),c(0,0),ms.polygon, xsize=c(2,4), lwd=c(1,2), n=360)
        
        theta <- seq(pi/4, 3*pi/4, length=250)
        lines( 2.03*cos(theta), 2.03*sin(theta), lwd=2, lty='dashed' )
        lines( c(0,0), c(0,2), lty='dashed', lwd=2 )
        
        a <- c(300,305,355,0,5,45,65)
        l <- c(1.1, .5, .4,1,.6,.7,1.25)
        
        my.symbols( rep(0,7), rep(0,7), ms.arrows, xsize=2, r=l, adj=0, 
                angle=pi/2 - pi/180*a )
        

        【讨论】:

          猜你喜欢
          • 2022-09-30
          • 1970-01-01
          • 1970-01-01
          • 2013-09-09
          • 1970-01-01
          • 2018-11-21
          • 1970-01-01
          • 1970-01-01
          • 2022-06-16
          相关资源
          最近更新 更多