2012-12-19 14 views
15

Sto cercando di creare la trama come segue (molte volte finisco per disegnare una trama come questa a mano, ma questa volta voglio tracciarla da sola).Creazione di grafico a linee con scala temporale ed etichette in

enter image description here

Ecco i miei dati e il mio processo:

myd <- data.frame (period = c("Triassic", "Jurasic", 
"Cretaceous", "Cenzoic"), myears = c(245, 208, 145, 65), 
label = c(226, 176,105, 32)) 
myd2 <- data.frame (event = c("Diansaurs_strt", "Birds", 
    "Diansaurs_ext", "Human"), myears = c(235, 200, 60, 0.5)) 
myd2$x <- -0.25 
with (myd2, plot(x,myears,ylim=c(0,250), 
xlim = c(0, 10), axes=F,xlab="",ylab="",type="p",pch=17)) 
with (myd2,text(x,myears,event,pos=4,xpd=T)) 
axis(side=2,at = myd$label, labels = myd$period) 

enter image description here

ho problemi particolarmente corrispondenza dell'asse con la trama e l'orientamento del testo e punti. Qualsiasi altra idea o miglioramento può essere apprezzata.

risposta

16

Per costruire nuovi trame "da zero", e per il massimo controllo sui singoli elementi grafici, il griglia sistema grafico è difficile da battere: risposta

library(grid) 

## Set up plotting area with reasonable x-y limits 
## and a "native" scale related to the scale of the data. 
x <- -1:1 
y <- extendrange(c(myd$myears, myd2$myears)) 
dvp <- dataViewport(x, y, name = "figure") 

grid.newpage() 
pushViewport(dvp) 

## Plot the central timeline 
grid.lines(unit(0, "native"), unit(c(0,245), "native"), 
      gp = gpar(col="dodgerblue")) 

## Annotate LHS 
grid.segments(x0=0.5, x1=0.47, 
       y0=unit(c(0, myd$myears), "native"), 
       y1=unit(c(0, myd$myears), "native"), 
       gp=gpar(col="dodgerblue")) 
grid.text(label=c(0, myd$myears), x=0.44, y=unit(c(0, myd$myears), "native")) 
grid.text(label=myd$period, x=0.3, y=unit(myd$label, "native"), 
      just=0, gp=gpar(col="dodgerblue", fontface="italic")) 

## Annotate RHS 
## Create a function that plots a pointer to the specified coordinate 
pointer <- function(x, y, width=1) { 
    grid.polygon(x = x + unit(width*(c(0, .1, .1)), "npc"), 
       y = y + unit(width*(c(0, .03, -.03)), "npc"), 
       gp = gpar(fill="dodgerblue", col="blue", lwd=2)) 
} 
## Call it once for each milestone 
for(y in myd2$myears) { 
    pointer(unit(.5, "npc"), y=unit(y, "native"), width=0.3) 
} 
## Or, if you just want blue line segments instead of those gaudy pointers: 
## grid.segments(x0=0.5, x1=0.53, 
##   y0=unit(c(myd2$myears), "native"), 
##   y1=unit(c(myd2$myears), "native"), gp=gpar(col="dodgerblue")) 

grid.text(label=myd2$event, x=0.55, y=unit(myd2$myears, "native"), 
      just=0) 

enter image description here

+2

Questo merita molti più upvotes. – A5C1D2H2I1M1N2O1R2T1

+0

d'accordo, ho votato – SHRram

+0

@Josh O'Brien, grazie, puoi anche presentare la versione alternativa con le linee che hai elencato nelle precedenti revisioni – shNIL

5

Si può provare qualcosa di simile per iniziare:

myd <- data.frame(period = c("", "Triassic", "Jurasic", 
          "Cretaceous", "Cenzoic", ""), 
        myears = c(260, 245, 208, 145, 65, -5), 
        label = c(260, 226, 176,105, 32, -5)) 
myd2 <- data.frame(event = c("Dinosaurs_strt", "Birds", 
          "Dinosaurs_ext", "Human"), 
        myears = c(235, 200, 60, 0.5)) 
myd2$x <- 1 
with(myd2, plot(x, myears, ylim = c(-5, 250), xlim = c(0, 10), 
       axes = FALSE, xlab = "", ylab = "", type = "n")) 
with(myd2, text(x, myears, event, pos = 4, xpd = TRUE)) 
axis(side = 2, at = myd$label, labels = myd$period, las = 2) 
X0 <- rep(myd2$x, 4) 
Y0 <- myd2$myears 
X1 <- rep(-.25, 4) 
Y1 <- Y0 
arrows(X0, Y0, X1, Y1) 

enter image description here

ho aggiunto un elemento vuoto in più all'inizio e alla fine dei tuoi dati in "myd" per aiutare con la l'asse. Quindi, invece di usare pch, ho usato arrows per abbinare le etichette della mano destra con l'asse.

Alcuni tweak potrebbero probabilmente renderlo molto più bello.

3

Ecco alcuni miglioramenti (vi suggerisco di aggiungere 0 per ora solo per fare bene in scala):

myd <- data.frame (period = c("Triassic", "Jurasic", 


"Cretaceous", "Cenzoic", "now"), myears = c(245, 208, 145, 65, 0), 
    label = c(226, 176,105, 32, NA)) 
    myd2 <- data.frame (event = c("Diansaurs_strt", "Birds", "Diansaurs_ext", "Human"), 
    myears = c(235, 200, 60, 0.5)) 
    myd2$x <- -0.25 
    with (myd2, plot(x,myears,ylim=c(0,250), xlim = c(0, 10), 
    axes=F,xlab="",ylab="",type="p",pch=17, col = "green")) 
    with (myd2, plot(x,myears,ylim=c(0,250), 
    xlim = c(0, 10), axes=F,xlab="",ylab="",type="p",pch="-", col = "green")) 
    with (myd2,text(x,myears,event,pos=4,xpd=T), col = "green") 
    axis(side=2,at = myd$label, labels = myd$period, tick = FALSE, 
    las = 2, col = "green",) 
    axis(side=2,at = myd$myears, labels = myd$myears, las = 2, col = "green") 

enter image description here

ci sono pochi punti rimasti si potrebbe desiderare di cambiare oriantation della freccia (Credo che tu possa in qualche modo trovare < - simbolo, ma non so come).

+0

Vedi Ananad di Mahato per le cose che disegnano le frecce. – jon

0

Per disegnare i triangoli, guarda le funzioni my.symbols e ms.polygon nel pacchetto TeachingDemos.

Nel grafico a destra sopra i Dinosauri vengono spostati verso l'alto, se lo si desidera in generale (spostando le etichette che altrimenti sarebbero troppo vicine o sovrapposte), allora guarda la funzione spread.labs nel pacchetto TeachingDemos.

Alcune altre funzioni possibili che potrebbero aiutare con la trama sono text, mtext, grconvertX, grconvertY, segments e axis.

Problemi correlati