2017-03-11 1 views
1

Je cherchais depuis 2 ou 3 jours maintenant en essayant de trouver une solution à mon problème sans succès. Je m'excuse si c'est vraiment facile ou s'il existe déjà, mais je ne le trouve pas. J'ai 3 trames de données qui peuvent varier en longueur de 1 à 300. Il est seulement possible d'afficher environ 60 valeurs le long de l'axe x de ggplot sans qu'il devienne illisible et je ne veux pas omettre des valeurs, donc j'essaie de trouver un moyen de calculer combien de temps chaque trame de données est et diviser en "x" parcelles de pas plus de 60 chacun. Jusqu'à présent, j'ai essayé: facet_grid, facet_wrap, transformer et scinder. "Split" fonctionne bien pour diviser les données, mais il ajoute un "X1". "X2". ... "Xn". au début des noms de variables (où n est le nombre de partitions dans lesquelles les données ont été décomposées). Donc quand j'appelle ggplot2, il ne trouve pas mes noms de variables d'origine ("Cost" et "Month") car ils ressemblent à X1.Cost X1.Month, X2.Cost etc ... Comment résoudre ce problème?Comment diviser 300 mois en groupes de 60 pour la lisibilité de l'axe x ggplot2 en r

Je suis ouvert à toutes les suggestions, en particulier si je peux résoudre les deux problèmes (pas de codage en dur dans 60 lignes à la fois et la rupture dans les graphiques avec des gammes d'axes x plus petits). Merci d'avance pour votre patience et votre aide.

Stephanie (désespérée d'étudiant diplômé)

Voici un code stub:

```{r setup, include=FALSE} 
xsz <- 60 # would like not to have to hardcode this 
ix1 <- seq(1:102) # would like to break into 2 or 3 approx equal graphs # 
fcost <- sample(0:200, 102) 
f.df <- data.frame("Cost" = fcost, "Month" = ix1) 
fn <- nrow(f.df) 
fr <- rep(1:ceiling(fn/xsz),each=xsz)[1:fn] 
fd <- split(f.df,fr) 
fc <- numeric(length(fd)) 
for (i in 1:length(fd)){ 
    print(ggplot(as.data.frame(fd[i]), aes(Month, Cost)) + 
    geom_line(colour = "darkred", size = .5) + 
    geom_point(colour = "red", size = 1) + 
    labs(x = "Projected Future Costs (monthly)", y = "Dollars") + 
    theme_bw() + 
    theme(plot.title = element_text(hjust = 0.5)) + 
    theme(axis.text.x = element_text(angle = 60, vjust = .6))) 
} 
``` 

Quand je cours, je reçois: Erreur dans eval (expr, Envir, Enclos): objet « Mois 'not found

Quand je fais: noms (as.data.frame (fd [1]))

je reçois: [1] « X1 .Cost "" X1.Month "

Répondre

0

Utilisez [[]] pour les listes.

print(ggplot(as.data.frame(fd[[i]]), aes(Month, Cost)) + 

Pour répondre à votre autre question, vous devez créer une nouvelle variable avec un numéro de placette. Ici, j'utilise rep.

f.df$plot_number <-rep(1:round(nrow(f.df)/60),each=60,len=nrow(f.df)) 

Ensuite, vous créez une liste des parcelles dans une boucle

plots <- list() # new empty list 
for (i in unique(f.df$plot_number)) { 
p = ggplot(f.df[f.df$plot_number==i,], aes(Month, Cost)) + 
geom_line(colour = "darkred", size = .5) + 
geom_point(colour = "red", size = 1) + 
labs(x = "Projected Future Costs (monthly)", y = "Dollars") + 
theme_bw() + 
theme(plot.title = element_text(hjust = 0.5)) + 
theme(axis.text.x = element_text(angle = 60, vjust = .6)) 
plots[[paste0("p",i)]] <- p # add each plot into plot list 
} 

Avec le paquet gridExtra, vous pouvez organiser vos parcelles en une seule.

library(gridExtra) 
    do.call("grid.arrange", c(plots, ncol=1)) 

enter image description here

+0

Je vous remercie beaucoup! Fonctionne comme un charme! –