如何使用package'在玫瑰图中移动箱子;圆形';在R

如何使用package'在玫瑰图中移动箱子;圆形';在R,r,rose-diagram,R,Rose Diagram,我使用R中的“循环”包和rose.diag函数为位置数据创建了一个以度为单位的方面玫瑰图,其中包含N、NE、E等基本方面,总共有8个箱子。然而,垃圾箱并没有跨越这些方面。换句话说,第一个bin从0到45,第二个bin从45到90,依此类推,这以奇怪的方式汇集了方面数据。有没有办法移动垃圾箱,使0、45、90等成为垃圾箱的中心,而不是边缘 rose.diag(Degrees$Degrees, bins=8,zero=pi/2, units = 'degrees', rotation='clock'

我使用R中的“循环”包和rose.diag函数为位置数据创建了一个以度为单位的方面玫瑰图,其中包含N、NE、E等基本方面,总共有8个箱子。然而,垃圾箱并没有跨越这些方面。换句话说,第一个bin从0到45,第二个bin从45到90,依此类推,这以奇怪的方式汇集了方面数据。有没有办法移动垃圾箱,使0、45、90等成为垃圾箱的中心,而不是边缘

rose.diag(Degrees$Degrees, bins=8,zero=pi/2, units = 'degrees', rotation='clock')

我认为Ben是对的,使用
rose.diag
很难做到这一点,因此这里有一个使用
ggplot2
的解决方案:

library(ggplot2)
Degrees <- runif(100, 0, 360)
rose <- ggplot(mapping = aes(x = Degrees)) +
  stat_bin(breaks = (0:8 - 0.5)/8 * 360) +
  scale_x_continuous(
    breaks = 0:7/8*360, 
    labels = c("N", "NE", "E", "SE", "S", "SW", "W", "NW")
    ) +
  coord_polar(start=-pi/8)
rose
库(ggplot2)

度您可以使用
gridBase
package获得类似的结果。我们一直在使用rose.diag,一旦我们进入了良好的视窗空间,我们就会对绘图进行破解

require(grid)
#grid.newpage()
##generate some data 
x <- circular(runif(50, 0, 2*pi))
bins <- 8
rotation <- 'clock'
##tcl =0(no ticks), tcl.text=-2 to write away the ticks marks
rose.diag(x, bins=bins,zero=0,  rotation='clock',
          tcl=0,tcl.text=-2,col='#80FF00FF')
library(gridBase)
## I use the plot viewport
vp <- baseViewports()$plot
pushViewport(vp)           ## here we go!
## radial transformation 
at <- (0:bins - 0.5)/bins * 2 * pi

## ticks
grid.segments( x0 =  .95*sin(at),  y0 = 0.95*cos(at),
               x1 = 1.05*sin(at),  y1 = 1.05*cos(at),
               default.units = "native")
## ticks labels
grid.text(x = 1.1*sin(at),   default.units = "native",
          y = 1.1*cos(at),   gp=gpar(col='red'),
          label = c("N", "NE", "E", "SE", "S", "SW", "W", "NW"))


为什么不旋转原始数据?注意:cdat以下的数值单位为度(0=pi/2),而0为2*pi

rose.diag(cdat-10,bins=20,col=“darkgrey”,prop=1.3,axes=FALSE, 加法=真,零=π/2-π/20)

复制/粘贴我正在处理的内容:

library(circular)

raw <-read.csv("C:\\Users\\Andy\\Desktop\\business\\research\\Oxford\\MichelDish\\r.csv", header=T)
raw <-na.omit(raw)


cdat <- circular(raw [, c ("kandUnknown")],type="angles",units="degrees", rotation="clock", zero=pi/2)


plot(cdat, cex=1.1, bin=720, stack=TRUE, sep=0.035, shrink=1.8, tcl.text=.2)


ticks.circular(circular(seq(0,2*pi,pi/8)), zero=pi/2, rotation='clock', tcl=0.075)



rose.diag(cdat - 10, bins = 20, col="darkgrey", prop=1.3, axes=FALSE, add=TRUE, zero = pi/2 - pi/20)

lines(density.circular(cdat, bw=40), lwd=2, lty=1)

另外,出于好奇,我们正在为eg使用这些统计数据,我认为如果不破解源代码,这是不可能的。我似乎记得在某个时候这样做过,但必须挖掘代码…@BenBolker可能不需要破解源代码,但需要破解情节:)查看我的答案,了解我对rose的厌恶。diag
@agstudy您的答案显示了对原始情节元素的巧妙操作。我个人更喜欢ggplot2渲染的外观,而且我发现它更容易修改。我只是回答Op的问题来转移垃圾箱。也许我做的很有技巧,但我更喜欢我的渲染:)为什么不直接改变初始数据集,然后用零=(例如)Pi组成RoseDiag当使用rose.diag时,我可以使用
点(平均(度))
来添加平均方向。如何使用ggplot2实现这一点?
library(circular)

raw <-read.csv("C:\\Users\\Andy\\Desktop\\business\\research\\Oxford\\MichelDish\\r.csv", header=T)
raw <-na.omit(raw)


cdat <- circular(raw [, c ("kandUnknown")],type="angles",units="degrees", rotation="clock", zero=pi/2)


plot(cdat, cex=1.1, bin=720, stack=TRUE, sep=0.035, shrink=1.8, tcl.text=.2)


ticks.circular(circular(seq(0,2*pi,pi/8)), zero=pi/2, rotation='clock', tcl=0.075)



rose.diag(cdat - 10, bins = 20, col="darkgrey", prop=1.3, axes=FALSE, add=TRUE, zero = pi/2 - pi/20)

lines(density.circular(cdat, bw=40), lwd=2, lty=1)
rose.diag(cdat, bins = 20, col="darkgrey", prop=1.3, axes=FALSE, add=TRUE)