2012-04-23 9 views
60

Próbuję uzyskać etykiety osi X obrócone o 45 stopni na plandece bez powodzenia. Jest to kod mam poniżej:Obracanie znaczników osi X w R dla wykresu podziałowego

barplot(((data1[,1] - average)/average) * 100, 
     srt  = 45, 
     adj  = 1, 
     xpd  = TRUE, 
     names.arg = data1[,2], 
     col  = c("#3CA0D0"), 
     main  = "Best Lift Time to Vertical Drop Ratios of North American Resorts", 
     ylab  = "Normalized Difference", 
     yaxt  = 'n', 
     cex.names = 0.65, 
     cex.lab = 0.65) 

Odpowiedz

45

EDITED ODPOWIEDŹ ZA ODPOWIEDZI Dawida:

Oto rodzaj hackish sposób. Zgaduję, że jest łatwiejszy sposób. Można jednak stłumić etykiety prętów i tekst fabuły etykiet, zapisując pozycje prętów od barplot i wykonując niewielkie poprawki w górę iw dół. Oto przykład z zestawu danych mtcars:

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

_caveat_: Jeśli używasz 'beside = TRUE', prawdopodobnie będziesz chciał użyć' colMeans (x) 'zamiast tylko' x', jeśli chcesz mieć tylko jedną etykietę na grupę. – MichaelChirico

23

Jeśli chcesz obrócić etykiety osi X o kącie równym lub mniejszym niż 90, wypróbować następujące podejście:

używa argumentu barplot za space=1 aby szerokość kolumn równa odstępom między kolumnami.

W ten sposób można było dostosować kod podany w R FAQ, który został wskazany przez @BenBarnes pod odpowiedzią Tylera Rinkera.

par(mar = c(7, 4, 2, 2) + 0.2) #add room for the rotated labels 

#use mtcars dataset to produce a barplot with qsec colum information 
mtcars = mtcars[with(mtcars, order(-qsec)), ] #order mtcars data set by column "qsec" (source: http://stackoverflow.com/questions/1296646/how-to-sort-a-dataframe-by-columns-in-r) 

end_point = 0.5 + nrow(mtcars) + nrow(mtcars)-1 #this is the line which does the trick (together with barplot "space = 1" parameter) 

barplot(mtcars$qsec, col="grey50", 
     main="", 
     ylab="mtcars - qsec", ylim=c(0,5+max(mtcars$qsec)), 
     xlab = "", 
     space=1) 
#rotate 60 degrees, srt=60 
text(seq(1.5,end_point,by=2), par("usr")[3]-0.25, 
    srt = 60, adj= 1, xpd = TRUE, 
    labels = paste(rownames(mtcars)), cex=0.65) 

enter image description here

154

użycie opcjonalnego parametru LAS = 2.

barplot(mytable,main="Car makes",ylab="Freqency",xlab="make",las=2) 

enter image description here

+0

działa absolutnie. dzięki –

+1

Uważam, że to powinna być zaakceptowana odpowiedź. Działa doskonale przy użyciu parametru bazowej funkcji barplota użytej w pytaniu. – jwhaley58

+0

Uzgodnione, to powinna być zaakceptowana odpowiedź. O wiele bardziej zwięzłe rozwiązanie: – snlan

1

odpowiedź Andre Silva działa świetnie dla mnie, z jednym zastrzeżeniem w wierszu "barplot":

barplot(mtcars$qsec, col="grey50", 
    main="", 
    ylab="mtcars - qsec", ylim=c(0,5+max(mtcars$qsec)), 
    xlab = "", 
    xaxt = "n", 
    space=1) 

obwieszczeniu "xaxt" argumentów. Bez tego etykiety są rysowane dwukrotnie, po raz pierwszy bez obrotu o 60 stopni.

0

Można po prostu zdać ramkę danych w następnym funkcji:

rotate_x <- function(data, column_to_plot, labels_vec, rot_angle) { 
    plt <- barplot(data[[column_to_plot]], col='steelblue', xaxt="n") 
    text(plt, par("usr")[3], labels = labels_vec, srt = rot_angle, adj = c(1.1,1.1), xpd = TRUE, cex=0.6) 
} 

Zastosowanie:

rotate_x(mtcars, 'mpg', row.names(mtcars), 45) 

enter image description here

Można zmienić kąt rotacji z etykiety w razie potrzeby.