2013-01-07 4 views
5

Ich erstellte eine Rose-Diagramm der Aspekte in Grad für Standortdaten mit dem 'circular' Paket in R und der rose.diag-Funktion, mit grundlegenden Aspekten von N , NE, E usw. für insgesamt 8 Behälter. Die Bins überspannen jedoch nicht die Aspekte. Mit anderen Worten, der erste Bereich geht von 0-45, der zweite von 45 bis 90 usw., der die Aspektdaten auf seltsame Weise zusammenfasst. Gibt es eine Möglichkeit, die Behälter so zu verschieben, dass 0, 45, 90 usw. die Mitte der Behälter statt der Kanten sind?Wie verschiebt ich bins in einem Rose-Diagramm mit Paket 'circular' in R

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

Ich glaube nicht, dass dies möglich ist, den Quellcode ohne Hacking. Ich erinnere mich, dass ich das irgendwann getan habe, aber müsste den Code ausgraben ... –

+0

@BenBolker möglich, ohne den Quellcode zu hacken, aber mit der Handlung hacken :) – agstudy

Antwort

4

Ich denke, Ben ist richtig, dass es nicht leicht mit rose.diag getan werden kann, ist so hier eine Lösung mit 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 

enter image description here Dies kann nicht ideal sein, weil nicht alle Funktionen in rose.diag haben einfache Äquivalente in ggplot2.

+0

sehe meine Antwort auf Aversion mit 'rose.diag' – agstudy

+0

@ agstudy Ihre Antwort zeigt geschickte Manipulation von rohen Handlungselementen. Ich persönlich bevorzuge das Aussehen des ggplot2-Renderings und finde es einfacher zu modifizieren. – orizon

+0

nicht. Ich beantworte gerade die Op-Frage, um die Behälter zu verschieben. Vielleicht ist das, was ich gemacht habe, geschickt, aber ich bevorzuge mein Rendering :) – agstudy

1

Sie können so etwas mit gridBase Paket haben. Wir verwenden weiter rose.diag und wir hack die Handlung, sobald wir im Raum des guten Viewports sind.

enter image description here

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")) 

Zur visuellen Aspekt, den ich einige Tuning hinzufügen, aber die einige Code oben Antwort bereits auf die Frage.

## dashed lines from the center for visual aspect 
grid.segments(x0 = .95*sin(at), y0 = 0.95*cos(at), 
       x1 = 0, 0, 
       gp = gpar(lty="dashed"), 
       default.units = "native") 

## circle just to get the same color of text 
grid.circle(r=1,x=0,y=0,gp=gpar(col='red',fill=NA,lwd=2), default.units = "native") 
## remove the viewport 
popViewport(1) 
0

Warum drehen Sie nicht Ihre Originaldaten? N.b. unterhalb von cdat ist in Grad (null = pi/2), während null ist in 2 * pi

rose.diag (cdat - 10, bins = 20, col = "dunkelgrau", prop = 1.3, achsen = FALSCH, add = TRUE, Null = pi/2-pi/20)

Kopieren/Einfügen etwas arbeite ich an:

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) 

enter image description here

nb der folgende Code gibt Ihnen die alte Figur (oben links):

rose.diag(cdat, bins = 20, col="darkgrey", prop=1.3, axes=FALSE, add=TRUE) 

ps für die Neugierigen, verwenden wir solche Statistiken für zB http://www.sciencedirect.com/science/article/pii/S0950329315001068