2011-07-11 6 views
13

Estoy construyendo gráficos que tienen dos líneas en el texto del eje. La primera línea contiene el nombre del grupo, la segunda línea contiene esa población de grupo. Construyo mis etiquetas de ejes como una sola cadena de caracteres con el formato "LINE1 \ n LINE2". ¿Es posible asignar caras y tamaños de fuente diferentes a LINE1 y LINE2, a pesar de que están contenidos dentro de una única cadena de caracteres? Me gustaría que LINE1 sea grande y en negrita, y que LINE2 sea pequeño y esté descolgado.Caras y tamaños de fuente diferentes dentro de las entradas de texto de etiqueta en ggplot2

He aquí algunos ejemplos de código:

Treatment <- rep(c('T','C'),each=2) 
Gender <- rep(c('Male','Female'),2) 
Response <- sample(1:100,4) 
test_df <- data.frame(Treatment, Gender, Response) 

xbreaks <- levels(test_df$Gender) 
xlabels <- paste(xbreaks,'\n',c('POP1','POP2')) 

hist <- ggplot(test_df, aes(x=Gender, y=Response, fill=Treatment, stat="identity")) 
hist + geom_bar(position = "dodge") + scale_y_continuous(limits = c(0, 
    100), name = "") + scale_x_discrete(labels=xlabels, breaks = xbreaks) + 
    opts(
     axis.text.x = theme_text(face='bold',size=12) 
    ) 

He intentado esto, pero el resultado fue una gran entrada, en negrita, y uno, la entrada unbolded pequeña:

hist + geom_bar(position = "dodge") + scale_y_continuous(limits = c(0, 
    100), name = "") + scale_x_discrete(labels=xlabels, breaks = xbreaks) + 
    opts(
     axis.text.x = theme_text(face=c('bold','plain'),size=c('15','10')) 
    ) 

Otra posible solución es crear separar los elementos del gráfico, pero no creo que ggplot2 tenga un elemento 'etiqueta de sub-eje' disponible ...

Cualquier ayuda sería muy apreciada.

Saludos, Aaron

Respuesta

14

también pienso que no podía hacer el gráfico utilizando sólo ggplot2 características.

Yo usaría grid.text y grid.gedit.

require(ggplot2) 
Treatment <- rep(c('T','C'), each=2) 
Gender <- rep(c('Male','Female'), 2) 
Response <- sample(1:100, 4) 
test_df <- data.frame(Treatment, Gender, Response) 

xbreaks <- levels(test_df$Gender) 
xlabels <- paste(xbreaks,'\n',c('','')) 

hist <- ggplot(test_df, aes(x=Gender, y=Response, fill=Treatment, 
    stat="identity")) 
hist + geom_bar(position = "dodge") + 
    scale_y_continuous(limits = c(0, 100), name = "") + 
    scale_x_discrete(labels=xlabels, breaks = xbreaks) + 
    opts(axis.text.x = theme_text(face='bold', size=12)) 
grid.text(label="POP1", x = 0.29, y = 0.06) 
grid.text(label="POP2", x = 0.645, y = 0.06) 
grid.gedit("GRID.text", gp=gpar(fontsize=8)) 

Different font faces and sizes within label text entries in ggplot2

favor intenta sintonizar un código en función de su entorno (por ejemplo la posición de las etiquetas de sub-ejes y el tamaño de fuente).

+0

1 Niza truco :) –

+0

encontré que esta pregunta está en multiposted [ggplot2 - Grupo de Google] (http: // grupos .google.com/group/ggplot2/browse_thread/thread/7ff9a9675e197ff3). –

+0

Todavía estoy trabajando en esto ... Me gusta esta solución, pero el problema que tengo es que el número de categorías de grupo variará según el conjunto de datos que estoy viendo (mis grupos no son solo hombres y mujer --- eso fue solo un ejemplo). Tu truco es genial, pero no sé si puedo hacerlo lo suficientemente flexible. Gracias por contribuir, sin embargo! – Aaron

9

me encontré debajo de otra solución sencilla:

require(ggplot2) 
Treatment <- rep(c('T','C'),each=2) 
Gender <- rep(c('Male','Female'),2) 
Response <- sample(1:100,4) 
test_df <- data.frame(Treatment, Gender, Response) 

xbreaks <- levels(test_df$Gender) 
xlabels[1] <- expression(atop(bold(Female), scriptstyle("POP1"))) 
xlabels[2] <- expression(atop(bold(Male), scriptstyle("POP2"))) 

hist <- ggplot(test_df, aes(x=Gender, y=Response, fill=Treatment, 
stat="identity")) 
hist + 
    geom_bar(position = "dodge") + 
    scale_y_continuous(limits = c(0, 100), name = "") + 
    scale_x_discrete(label = xlabels, breaks = xbreaks) + 
    opts(
    axis.text.x = theme_text(size = 12) 
) 

another solution

+0

eso es mejor, pero aún tengo el desafío de manejar múltiples categorías ... gracias, amigo, espero publicar pronto una solución para esto. – Aaron

1

Todo,

usando trucos de la tríada esto es lo más cerca que pude llegar a una solución en este caso. Déjeme saber si usted tiene alguna pregunta:

library(ggplot2) 

spacing <- 0 #We can adjust how much blank space we have beneath the chart here 

labels1= paste('Group',c('A','B','C','D')) 
labels2 = rep(paste(rep('\n',spacing),collapse=''),length(labels1)) 
labels <- paste(labels1,labels2) 

qplot(1:4,1:4, geom="blank") + 
scale_x_continuous(breaks=1:length(labels), labels=labels) + xlab("")+ 
opts(plot.margin = unit(c(1, 1, 3, 0.5), "lines"), 
     axis.text.x = theme_text(face='bold', size=14)) 

xseq <- seq(0.15,0.9,length.out=length(labels)) #Assume for now that 0.15 and 0.9 are  constant plot boundaries 

sample_df <- data.frame(group=rep(labels1,each=2),subgroup=rep(c('a','b'),4),pop=sample(1:10,8)) 
    popLabs <- by(sample_df,sample_df$group,function(subData){ 
    paste(paste(subData$subgroup,' [n = ', subData$pop,']',sep=''),collapse='\n') 
}) 

gridText <- paste("grid.text(label='\n",popLabs,"',x=",xseq,',y=0.1)',sep='') 

sapply(gridText, function(x){ #Evaluate parsed character string for each element of gridText 
    eval(parse(text=x)) 
}) 

grid.gedit("GRID.text", gp=gpar(fontsize=12)) 

Cheers, Aaron

Cuestiones relacionadas