2011-07-11 4 views
13

Buduję wykresy, które mają dwie linie w tekście osi. Pierwsza linia zawiera nazwę grupy, druga linia zawiera populację grupy. Buduję moje etykiety osi jako pojedynczy ciąg znaków o formacie "LINE1 \ n LINE2". Czy możliwe jest przypisanie różnych płaszczyzn i rozmiarów czcionek do LINII1 i LINII2, mimo że są one zawarte w jednym ciągu znaków? Chciałbym, aby LINE1 była duża i pogrubiona, a LINE2 była mała i nierozwijana.Różne twarze i rozmiary czcionek w obrębie wpisów w etykietach w ggplot2

Oto niektóre przykładowy kod:

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) 
    ) 

próbowałem tego, ale wynik był jeden duży, pogrubiony wejście i jedna mała, unbolded wpis:

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')) 
    ) 

Innym możliwym rozwiązaniem jest utworzenie Oddzielne elementy wykresów, ale nie sądzę, że ggplot2 ma dostępny element "etykiety podosiowej" ...

Każda pomoc będzie bardzo doceniana.

Cheers, Aaron

Odpowiedz

14

Myślę też, że nie mogę zrobić wykres przez tylko za pomocą funkcji ggplot2.

Chciałbym użyć grid.text i 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

Spróbuj dostroić kod momencie w zależności od środowiska (na przykład położenia etykiet sub-osiowych i fontSize).

+0

+1 Nicea oszustwo :) –

+0

Okazało się, że ta kwestia jest multiposted w [ggplot2 - grupa google] (http: // grup .google.com/group/ggplot2/browse_thread/thread/7ff9a9675e197ff3). –

+0

Nadal pracuję nad tym ... Podoba mi się to rozwiązanie, ale problem z tym związany polega na tym, że liczba kategorii grup będzie się różnić w zależności od tego, na jaki zestaw danych patrzę (moje grupy to nie tylko samiec i kobieta --- to był tylko przykład). Twój cheat jest fajny, ale nie wiem, czy mogę go wystarczająco elastycznie. Dzięki za przyczynianie się! – Aaron

9

znalazłem inny proste rozwiązanie poniżej:

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

to jest lepsze, ale wciąż mam problem z obsługą wielu kategorii ... dzięki, stary - mam nadzieję, że wkrótce rozwiążemy ten problem. – Aaron

1

Wszystko,

Korzystanie oszukiwać triady jest to najbliżej byłem w stanie dostać się do rozwiązania na ten jeden. Daj mi znać, jeśli masz jakieś pytania:

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)) 

Wiwaty, Aaron