Многоцветные заголовки с ggplot2 для R
Я пытался реализовать многоцветные тексты, как показано здесь:
многоцветный текст на графике
который ссылается на это:
многоцветный текст в R
Вот что я придумал (с помощью здесь):
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
, и создание интервала для этого - очень ручной процесс - не подходит для сценариев, где мне нужно автоматически создавать сотни сюжетов такого характера. Я мог бы написать некоторые функции поверх этого, но, может быть, есть лучший способ реализовать методы, используемые с базовым графическим функционалом?
Ответы
Ответ 1
Здесь представлен более общий подход, который использует несколько дополнительных функций 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 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()