2014-10-23 17 views
7

Esiste un modo per stampare un grafico di alberi e foglie su un dispositivo grafico, ad esempio window()/quartz()? Esistono almeno due modi per ottenere grafici stem e leaf in R: ?stem, nel pacchetto grafico e ?stem.leaf, nel pacchetto aplpack. Entrambi i testi di output sulla console. Ad esempio:Come stampare un grafico di albero e foglia come trama

> set.seed(1) 
> stem(rbinom(10, size=10, prob=.5)) 

    The decimal point is at the | 

    3 | 0 
    4 | 000 
    5 | 0 
    6 | 00 
    7 | 000 

Sarebbe bello se questo potrebbe essere convenientemente uscita ad un dispositivo grafica dove potrebbe essere combinato con altre trame (per esempio un istogramma) in una configurazione multi-figura, e/o salvati come file png. Sono consapevole che puoi produrre LaTeX e compilarlo in un pdf (ad es., Vedi: Stem and Leaf from R into LaTeX), ma questo non è molto conveniente e non è proprio quello che sto cercando. C'è una funzione R che può fare questo? Esiste una semplice soluzione codificata a mano?

+0

Dai un'occhiata a 'pacchetto: ascii' –

+0

La documentazione pdf su CRAN è piuttosto scarsa, @BondedDust. Stai pensando a 'fig()' per acquisire l'output e salvarlo come png? Potrebbe, o un'altra funzione, produrre in una finestra grafica standard? – gung

+0

Beh, non proprio. Stavo pensando che avresti bisogno di inviare i risultati di 'capture.output ()' a qualche funzione mark (su/giù). Sono d'accordo che è un po 'doloroso cercare di eseguire qualsiasi stampa ascii sul dispositivo di trama predefinito. Posso farlo, ma solo con dolore. –

risposta

10

Ecco un semplice esempio:

plot.new() 
tmp <- capture.output(stem(iris$Petal.Length)) 
text(0,1, paste(tmp, collapse='\n'), adj=c(0,1), family='mono') 

enter image description here

Se si desidera sovrapporre un istogramma, si pr volere volutamente utilizzare la funzione text su ciascuno degli elementi di tmp anziché paste ing. Funzioni come strheight e strwidth saranno utili per trovare le coordinate.

Esistono anche funzioni nei pacchetti gplot e plotrix per il tracciamento del testo e l'aggiunta di tabelle ai grafici (altre funzioni in altri pacchetti probabilmente esistono anche lungo queste linee).

+1

Questo mi ha dato un flashback al mio corso di programmazione C. –

+0

Questo era essenzialmente quello che stavo definendo l'approccio "doloroso". Penso che tu abbia anche descritto (alcuni anni fa) una funzione da inviare a gnuplot. –

+0

@BondedDust, non penso che quanto sopra sia troppo doloroso. Cercare di allineare il tutto con un istogramma comincerebbe a essere scomodo, ma non lo considererei doloroso. –

3

seguito è equivalente:

set.seed(1) 
xx = rbinom(10, size=10, prob=.5) 
barplot(t(table(xx)), horiz=T) 

enter image description here

Per ancor più simile:

set.seed(1) 
xx = rnorm(10) 

xxch = as.character(xx) 
ff = sapply(strsplit(xxch, '\\.'), function(x) x[1]) 
ss = sapply(strsplit(xxch, '\\.'), function(x) x[2]) 
first = sapply(strsplit(ss, ''), function(x) x[1]) 
second = sapply(strsplit(ss, ''), function(x) x[2]) 
third = sapply(strsplit(ss, ''), function(x) x[3]) 
dd = data.frame(ff, first, second, third) 
dd = cbind(dd[1], sapply(dd[-1], as.numeric)) 
ddt = data.table(dd) 
gg = ddt[order(ff,first)][,paste(first, collapse=""),by=ff] 
gg$rr = rownames(gg) 
ggplot(gg)+geom_text(aes(x=rr, y=1, label=paste(ff,'|',V1))) + 
theme(axis.text = element_blank(),axis.title = element_blank(), axis.ticks=element_blank()) + 
coord_flip()+ labs(title="Decimal is at |") 

enter image description here

Il codice può avere bisogno di essere ottimizzato per diversi set.

Utilizzando capture.output (come suggerito da @ Greg) e tracciando con ggplot:

tmp <- capture.output(stem(iris$Petal.Length)) 
stemdf = data.frame(tmp, rr=1:length(tmp)) 
ggplot(stemdf)+ geom_text(aes(x=rr, y=0, label=tmp), hjust=0) + 
    coord_flip()+ theme_classic() + 
    scale_x_discrete(breaks=NULL)+ 
    scale_y_discrete(breaks=NULL, limits=c(0,1))+ 
    theme(axis.text = element_blank(), 
     axis.title = element_blank(), 
     axis.ticks=element_blank(), 
     panel.grid=element_blank(), 
     axis.line=element_blank()) 

enter image description here

+0

Grazie. Penso che questo è solo equivalente perché l'output del mio esempio è numeri interi. Considera l'output di questo caso: 'set.seed (1); stelo (RNorm (10)) '. – gung

+0

Buon punto. Sono d'accordo che è solo per gli interi. – rnso

+0

Vedere l'aggiunta alla mia risposta sopra. – rnso

Problemi correlati