2012-08-15 63 views
11

我試圖實現多色文字在這裏:多色職稱GGPLOT2的R

multicolor text on chart

其中引用此:

multicolor text in R

這是我想出了(在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() 

這裏的結果圖:

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

所以,我的問題:是否有用於該更優雅的方法是什麼?例如,我希望能夠使用ggsave,爲此創建間距是一個高度手動的過程 - 不適用於需要自動創建數百個此類特性的情景。我可以看到在這之上編寫了一些函數,但是也許有更好的方法來實現基本繪圖函數使用的方法嗎?

+0

你想使顏色自動地在劇情相同嗎? – 2012-08-15 21:52:50

+0

我認爲這會很好,因爲我認爲你可以將'scale_colour_manual'中的'values'作爲向量,然後調用values [1]等等,可能會追加黑色,所以它會是值[4]。如果沒有手動選擇,那麼將它拖到劇情中使用的顏色將會很酷,我不確定我會怎麼做,但我敢打賭,這是記錄在某處的:/。 – ideamotor 2012-08-15 22:06:43

+0

歡迎來到Stack Overflow的R社區! – Gregor 2012-08-17 07:28:48

回答

6

下面是一個更通用的方法,它利用了幾個額外的功能grid函數。它不是特別精美,但它可能會給你一些有用的想法:

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

謝謝,那太棒了。它看起來像當標題中有3個以上的組時自動起作用 – ideamotor 2012-08-20 22:11:49