2012-08-15 18 views
11

stavo cercando di implementare i testi multicolore come illustrato di seguito:titoli multicolore con ggplot2 per R

multicolor text on chart

cui fa riferimento questo:

multicolor text in R

Questo è ciò che mi si avvicinò con (con l'aiuto di here):

require(ggplot2) 
require(grid) 
png(file="multicolortitle.png",width=800,height=500) 
qplot(x = hp,y = mpg,data = mtcars,color=factor(mtcars$cyl),size=2) + 
    scale_colour_manual(values = c("red3","green3","blue3")) + 
    theme_bw() + 
    opts(title = " \n ") + 
    opts(legend.position = "none") 
spacing <- 20 
grid.text(0.5, unit(1,"npc") - unit(1,"line"), 
      label=paste("4 cylinder,",paste(rep(" ",spacing*2), collapse='')), 
      gp=gpar(col="red3", fontsize=16,fontface="bold")) 
grid.text(0.5, unit(1,"npc") - unit(1,"line"), 
      label=paste(paste(rep(" ",spacing), collapse=''),"6 cylinder,", 
      paste(rep(" ",spacing), collapse='')), 
      gp=gpar(col="green3", fontsize=16,fontface="bold")) 
grid.text(0.5, unit(1,"npc") - unit(1,"line"), 
      label=paste(paste(rep(" ",spacing*2), collapse=''),"8 cylinder"), 
      gp=gpar(col="blue3", fontsize=16,fontface="bold")) 
grid.text(0.5, unit(1,"npc") - unit(2,"line"), 
      label=paste(paste(rep(" ",spacing*0), collapse=''), 
      "- Horsepower versus Miles per Gallon"), 
      gp=gpar(col="black", fontsize=16,fontface="bold")) 
dev.off() 

Ecco il grafico risultante:

Horsepower versus Miles per Gallon by # Cylinders (mtcars data-set)

Quindi, la mia domanda: c'è un metodo più elegante da utilizzare per questo? Mi piacerebbe essere in grado di utilizzare ggsave per esempio, e la creazione della spaziatura per questo è un processo altamente manuale, non adatto agli scenari in cui ho bisogno di creare automaticamente centinaia di grafici di questa natura. Potrei vedere scrivere alcune funzioni in cima a questo, ma forse c'è un modo migliore per implementare i metodi utilizzati con la funzione di tracciamento di base?

+0

Vuoi rendere automaticamente i colori come nella trama? –

+0

Penso che sarebbe una buona cosa, dato che penso che tu possa semplicemente fare i 'valori' in 'scale_colour_manual' un vettore e quindi chiamare i valori [1] e così via, magari aggiungere il nero così sarebbe valori [4]. Sarebbe bello averlo dove potrebbe tirare i colori usati nella trama anche se non sono stati selezionati manualmente e non sono sicuro di come potrei farlo, ma scommetto che è documentato da qualche parte: /. – ideamotor

+0

Benvenuti nella comunità R di Stack Overflow! – Gregor

risposta

6

Ecco un approccio più generale che sfrutta alcune funzioni aggiuntive di griglia. Non è particolarmente lucido, ma può darti alcune idee utili:

library(grid) 
library(ggplot2) 

p <- ggplot(data=mtcars, aes(mpg,hp,color=factor(cyl),size=2)) + 
     geom_point() + theme_bw() + 
     opts(title = " \n ") + opts(legend.position="none") 

## Get factor levels 
levs <- levels(factor(mtcars$cyl)) 
n <- length(levs) 

## Get factors' plotting colors 
g <- ggplot_build(p) 
d <- unique(g$data[[1]][c("colour", "group")]) 
cols <- d$colour[order(d$group)] 

## Use widest label's width to determine spacing 
labs <- paste(levs, "cylinder") 
xlocs <- unit(0.5, "npc") + 
     1.1 * (seq_len(n) - mean(seq_len(n))) * max(unit(1, "strwidth", labs)) 

## Plot labels in top 10% of device 
pushViewport(viewport(y=0.95, height=0.1)) 
    grid.text(paste(levs, "cylinder"), 
       x = xlocs, y=unit(0.5, "lines"), 
       gp = gpar(col=cols, fontface="bold")) 
    grid.text("- Horsepower versus Miles per Gallon", 
       y = unit(-0.5, "lines")) 
upViewport() 

## Plot main figure in bottom 90% of device 
pushViewport(viewport(y=0.45, height=0.9)) 
    print(p, newpage=FALSE) 
upViewport() 
+0

grazie, è grandioso. sembra che funzioni automaticamente quando hai più di 3 gruppi nel titolo – ideamotor

Problemi correlati