2013-11-27 23 views
6

Jak mogę obrócić etykiety osi X o 45 stopni na zgrupowanym wykresie słupkowym w R?Obróć etykiety osi X o 45 stopni na zgrupowanym wykresie słupkowym R

Próbowałem rozwiązanie zaproponował here ale coś bardzo brudny, etykiety wydaje się, że zostały dodane kilka razy (tylko pokazując część osi, aby chronić prywatność danych) enter image description here

This solution (gridBase) był również nie powiodło się dla mnie, z jakiegoś powodu pojawia się następujący błąd:

"Cannot pop the top-level viewport (grid and graphics output mixed?)"

PS. Większość osób wydaje się polecać this solution w bazie R, ale utknąłem z powodu zbyt, ponieważ nie rozumiem, jakie dane oni odnoszą się do (potrzebuję jakiś przykładowy zestaw danych, aby zrozumieć nowe wiersze polecenia ...).

Czy te rozwiązania nie działają, ponieważ mój plansza jest zgrupowanym baronem? A może jednak działa? Wszelkie sugestie są mile widziane, utknąłem przez jakiś czas. Dziękuję Ci.

[edytuj] Na życzenie dodaję kod użyłem do generowania obrazu powyżej (na podstawie jednego tekstu() rozwiązania):

data <- #this is a matrix with 4 columns and 20 rows; 
     #colnames and rownames are specified. 
     #the barplot data is grouped by rows 

lablist <- as.vector(colnames(data)) 

barplot(data, beside=TRUE, col=c("darkred","red","grey20","grey40")) 
text(1:100, par("usr")[1], labels=lablist, srt=45, pos=1, xpd=TRUE) 
+2

Jakiego kodu używasz? Byłoby miło, gdybyś mógł zebrać powtarzalny przykład (zobacz http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). –

+0

Nie jestem pewien, czy to jest pomocne, ale dodałem kod, który dostarczył mi zrzut ekranu powyżej. Nie mogę ujawnić danych, ale spodziewam się, że będą to dane losowe. – biohazard

+0

Musisz zmienić pionowe położenie etykiet (drugi parametr w "tekście") i napotykasz na recykling wektorów w argumentach "etykiety", dlatego tekst jest tak brudny. Jaki jest twój zamierzony rezultat? – Thomas

Odpowiedz

5

Try pierwsza odpowiedź:

x <- barplot(table(mtcars$cyl), xaxt="n") 
labs <- paste(names(table(mtcars$cyl)), "cylinders") 
text(cex=1, x=x-.25, y=-1.25, labs, xpd=TRUE, srt=45) 

Ale zmiana CEX = 1 do CEX = 0,8 lub .6 w tekście() funkcja:

text(cex=.6, x=x-.25, y=-1.25, labs, xpd=TRUE, srt=45) 

w obrazu, który pisał, wydaje się m e etykiety są po prostu za duże. cex ustawia rozmiar tych etykiet.

6

Nie jestem biegłą fabułą, więc może moje rozwiązanie nie jest zbyt proste. Myślę, że używanie ggplot2 jest tutaj lepsze.

enter image description here

def.par <- par(no.readonly = TRUE) 

## divide device into two rows and 1 column 
## allocate figure 1 for barplot 
## allocate figure 2 for barplot labels 
## respect relations between widths and heights 

nf <- layout(matrix(c(1,1,2,2),2,2,byrow = TRUE), c(1,3), c(3,1), TRUE) 
layout.show(nf) 

## barplot 
par(mar = c(0,1,1,1)) 
set.seed(1) 
nKol <- 8 ## you can change here but more than 11 cols 
      ## the solution is not really readable 
data <- matrix(sample(1:4,nKol*4,rep=TRUE),ncol=nKol) 
xx <- barplot(data, beside=TRUE, 
       col=c("darkred","red","grey20","grey40")) 

## labels , create d ummy plot for sacles 
par(mar = c(1,1,0,1)) 
plot(seq_len(length(xx)),rep(1,length(xx)),type='n',axes=FALSE) 
## Create some text labels 
labels <- paste("Label", seq_len(ncol(xx)), sep = " ") 
## Plot text labels with some rotation at the top of the current figure 
text(seq_len(length(xx)),rep(1.4,length(xx)), srt = 90, adj = 1, 
    labels = labels, xpd = TRUE,cex=0.8,srt=60, 
    col=c("darkred","red","grey20","grey40")) 

par(def.par) #- reset to default 
3

miałem ten sam problem z zgrupowane bar działki. Zakładam, że chcesz tylko jedną etykietę poniżej każdej grupy. Mogę się mylić, ponieważ nie podajesz tego wprost, ale wydaje się, że tak jest, ponieważ twoje etykiety powtarzają się w obrazie. W takim przypadku możesz skorzystać z rozwiązania zaproponowanego przez Stu, chociaż musisz zastosować colMeans do zmiennej x, gdy podasz ją do funkcji tekstowej:

x <- barplot(table(mtcars$cyl), xaxt="n") 
labs <- paste(names(table(mtcars$cyl)), "cylinders") 
text(cex=1, x=colMeans(x)-.25, y=-1.25, labs, xpd=TRUE, srt=45) 
Powiązane problemy