2015-05-08 14 views
5

Quando eseguo il plot utilizzando geom_area(), mi aspetto che funzioni molto come geom_bar(), ma sono un po 'perplesso da questo comportamento per i valori mancanti.Come posso fare in modo che geom_area() lasci uno spazio per i valori mancanti?

require(dplyr) 
    require(ggplot2) 

    set.seed(1) 

    test <- data.frame(x=rep(1:10,3), y=abs(rnorm(30)), z=rep(LETTERS[1:3],10)) %>% arrange(x,z) 

# I also have no idea why geom_area needs the data.frame to be sorted first. 

    test[test$x==4,"y"] <- NA 

    ggplot(test, aes(x, y, fill=z)) + geom_bar(stat="identity", position="stack") 

Produce questo grafico a barre in pila. Graph using stack_bar()

Tuttavia, se si passa a stack_area() interpola tra i valori mancanti.

> ggplot(test, aes(x, y, fill=z)) + geom_area(stat="identity", position="stack") 
Warning message: 
Removed 3 rows containing missing values (position_stack). 

Graph using stack_area()

Se aggiungo in na.rm=FALSE o na.rm=TRUE non fa alcuna differenza.

ggplot (test, AES (x, y, z = riempire)) + geom_area (stat = "identità", Posizione = "stack", na.rm = TRUE) messaggio Attenzione: Eliminato 3 righe contenenti valori mancanti (position_stack)

Graph with na.rm=TRUE

ggplot (test, AES (x, y, riempire = z)) + geom_area (stat = "identità", posizione = "stack", na .rm = FALSE) Messaggio di avviso: Rimosso 3 righe trovare valori mancanti (position_stack).

Graph with na.rm=FALSE

Ovviamente, tutto ciò che sto cercando non funziona. Come posso mostrare un vuoto nella serie con stack_area()?

risposta

4

Sembra che il problema abbia a che fare con il modo in cui i valori sono impilati. Il messaggio di errore ti dice che le righe contenenti i valori mancanti sono state rimosse, quindi non c'è semplicemente spazio vuoto nei dati che stai tracciando.

Tuttavia, geom_ribbon, di cui geom_area è un caso speciale, lascia spazio per i valori mancanti. geom_ribbon traccia anche un'area, ma è necessario specificare i valori y massimi e minimi. Quindi il trucco può essere fatto calcolando manualmente questi valori e quindi disegnando con geom_ribbon(). A partire con la cornice di dati test, creo i dati ymin e ymax come segue:

test$ymax <-test$y 
test$ymin <- 0 
zl <- levels(test$z) 
for (i in 2:length(zl)) { 
    zi <- test$z==zl[i] 
    zi_1 <- test$z==zl[i-1] 
    test$ymin[zi] <- test$ymax[zi_1] 
    test$ymax[zi] <- test$ymin[zi] + test$ymax[zi] 
} 

e poi tracciare con geom_ribbon:

ggplot(test, aes(x=x,ymax=ymax,ymin=ymin, fill=z)) + geom_ribbon() 

Questo dà il seguente grafico:

enter image description here

+1

seguente problema: http://stackoverflow.com/questions/35454277/can-you-make-geom-ribbon-leave-a-gap-for-mi sso a ip-valori? answertab = i voti # tab-top – eFF

Problemi correlati