2011-10-20 19 views
6

Używam ggplot2 do wykreślenia wykresu rozrzutu wielu wartości na osi biegunowej - coord_polar(). Powstały wykres zawiera tłusty tekst, ponieważ tekst jest zawsze wyrównany do dolnej części strony. Czy możliwe jest umieszczenie tekstu w taki sposób, aby był drukowany promieniście wzdłuż biegunowej osi X?Obrót tekstu osi X w ggplot2 przy użyciu coord_polar()

Edited by podać przykład:

qplot(data=presidential, name,end) + coord_polar() 

W przypadku prezydenckiego chciałbym zobaczyć prezydenckich nazwy usytuowane pod kątem do wyrównania z osią/mówili oni są włączone. Poniżej znajduje się przykład wykresu, nad którym pracuję, gdzie oś x jest kategoryczna, a oś y jest zmienną ciągłą (podobnie jak w przykładzie).

enter image description here

+0

można zapewnić powtarzalne przykład? – MYaseen208

+1

Biorąc pod uwagę, że 'theme_text (angle =)' obsługuje tylko jedną wartość, należy przejść do etykiet osi i użyć funkcji geom_text obliczającej kąty. A może modyfikując źródło, aby zaakceptować wiele kątów. Ale zostawiam to komuś, kto ma więcej wiedzy na temat ggplot2. –

+0

'qplot (dane = prezydencki, nazwa, koniec) + coord_polar() + opts (ax.text.x = theme_text (angle = 360/8 * seq_along (presidential $ name)))' daje ostrzeżenia, ale wciąż używa wielu kątów . – baptiste

Odpowiedz

4

o to nie eleganckie przykładem współrzędnych:

CoordPolar2 <- proto(CoordPolar, { 
    objname <- "polar2" 
    guide_foreground <- function(., details, theme) { 
    theta <- .$theta_rescale(details$theta.major, details) 
    labels <- details$theta.labels 

    # Combine the two ends of the scale if they are close 
    theta <- theta[!is.na(theta)] 
    ends_apart <- (theta[length(theta)] - theta[1]) %% (2*pi) 
    if (ends_apart < 0.05) { 
     n <- length(labels) 
     if (is.expression(labels)) { 
     combined <- substitute(paste(a, "/", b), 
      list(a = labels[[1]], b = labels[[n]])) 
     } else { 
     combined <- paste(labels[1], labels[n], sep="/") 
     } 
     labels[[n]] <- combined 
     labels <- labels[-1] 
     theta <- theta[-1] 
    } 

    grobTree(
     if (length(labels) > 0) { 
     lab <- theme_render(
      theme, "axis.text.x", 
      labels, 0.45 * sin(theta) + 0.5, 0.45 * cos(theta) + 0.5, 
      hjust = 0.5, vjust = 0.5, 
      default.units="native" 
     ) 
     lab$rot <- (pi/2 - theta)/pi * 180 
     lab 
     }, 
     theme_render(theme, "panel.border") 
    ) 
    } 
}) 

coord_polar2 <- CoordPolar2$build_accessor() 

p <- qplot(data=presidential, name,end) + coord_polar2() 
print(p) 

enter image description here

9

Rozumiem, że jest to stary temat, ale znalazłem lepsze rozwiązanie tego problemu, natchniony z komentarza baptise:

ggplot(data, aes(x=someId, y=someValue)) + 
    geom_point() + 
    coord_polar() + 
    theme(axis.text.x = element_text(
    angle= -90 - 360/length(unique(data$someId)) * seq_along(data$someId) 
    ) 
) 
4

Odpowiedź Yoplaita bardzo pomaga, ale nadal nie rozwiązuje problemu czytania do góry nogami na pół wykresu. Rozszerzenie pomysłu, który ten plakat proponuje, jest następujące.

najpierw przygotować wektor kąt, upewniając się podzielić wykres w dwóch:

sequence_length = length(unique(data$someId)) 
first_sequence = c(1:(sequence_length%/%2)) 
second_sequence = c((sequence_length%/%2+1):sequence_length) 
first_angles = c(90 - 180/length(first_sequence) * first_sequence) 
second_angles = c(-90 - 180/length(second_sequence) * second_sequence) 

A teraz możemy dołączyć wektorów kąt dokonać rzeczywistego wykresu:

ggplot(data, aes(x=someId, y=someValue)) + 
    geom_point() + 
    coord_polar() + 
    theme(axis.text.x = element_text(
    angle= c(first_angles,second_angles) 
    ) 
) 
Powiązane problemy