2014-12-04 11 views
6

Ho un diagramma di sfaccettatura di 3 righe per 5 colonne. Ogni riga mostra dati che si estendono su diversi intervalli. Per visualizzare correttamente i miei dati in modo che tutto sia mostrato, non imposto un limite sull'asse y.Modifica i limiti dell'asse y per ogni riga di un diagramma di sfaccettatura in ggplot2

Ecco il mio codice:

require(reshape2) 
library(ggplot2) 
library(RColorBrewer) 

fileName = paste("./data_test.csv", sep = "") 

## data available here: https://dl.dropboxusercontent.com/u/73950/data_test.csv 

mydata = read.csv(fileName,sep=",", header=TRUE) 

dataM = melt(mydata,c("id")) 
dataM = cbind(dataM, 
      colsplit(dataM$variable, 
        pattern = "_", 
        names = c("Network_model", "order", "category"))) 
dataM$variable <- NULL 
dataM <- dcast(dataM, ... ~ category, value.var = "value") 
dataM$minCut <- NULL 
dataM$nbr_communities <- NULL 
dataM$mean_community_size <- NULL 
dataM$density <- NULL 

my_palette <- colorRampPalette(rev(brewer.pal(11, "Spectral"))) 

dataM = melt(dataM, id.vars = c("Network_model", "order", "nodesRemoved", "id")) 

my_palette = c(brewer.pal(5, "Blues")[c(4)], brewer.pal(5, "Set1")[c(3)]) 

ggplot(dataM, aes(x= nodesRemoved ,y= value, group= order, color= order)) + 
    geom_point(size = .6,alpha = .15,position="jitter") + ## increased size 
    stat_smooth(se = FALSE, size = .5, alpha = .1, method = "loess") + 
    scale_color_manual(values=my_palette) + 
    theme_bw() + 
    theme(plot.background = element_blank(), 
     axis.line = element_blank(), 
     legend.key = element_blank(), 
     legend.title = element_blank(), 
     axis.text.x = element_text(size = 8), 
     axis.text.y = element_text(size = 8) 
     ) + 
    scale_y_continuous("Value") + 
    scale_x_continuous("Time", limits=c(0, 100)) + 

    facet_grid(variable ~ Network_model,scales="free") 

che produce questo:

enter image description here

Ora, vorrei limiti selettivamente impostati per ciascuna delle tre file, in modo che la prima riga is limits = c (1.9, 3), il secondo è limits = c (0, 1) e il terzo è limits = c (.3, .7).

Come posso ottenere questo risultato in ggplot2 di sfaccettatura?

+1

Questo può essere possibile con sfaccettature, ma non sarà facile. Se fossi in te, farei tre ggplot, uno per ogni riga. Quindi è possibile impostare i limiti dell'asse y in modo convenzionale, quindi incollare le righe insieme, ad esempio, 'grid.arrange'. (Dubito che riceverai risposte con il codice in esse, a meno che tu non riproduca il tuo esempio riproducibile.) – Gregor

+1

Sebbene, se stai bene con 'ggplot' che imposta i limiti, prova' scale = "free_y" ', non' scale = "libero" '. Senza vedere i tuoi dati è impossibile indovinare se questo è quello che stai cercando. – Gregor

+0

Grazie Gregor, ho aggiunto il set di dati e il codice completo! Saluti! – Rodolphe

risposta

3

Penso che l'opzione migliore sarà quella di tagliare i dati prima di tracciarli, ad es. con dplyr,

library(dplyr) 
limits <- data.frame(variable = levels(dataM$variable), 
        min = c(1.9,0,0.3), 
        max = c(3,1,0.7)) 
dataC <- inner_join(dataM, limits) %>% filter(value > min, value < max) 

last_plot() %+% dataC 

enter image description here

(inizialmente ho fatto i punti più grandi per vedere i colpevoli più chiaramente)

+0

Fantastico, funziona benissimo, grazie mille Baptiste! – Rodolphe