2012-02-28 19 views
14

Mam kreślenia dużą polarną wykres wykres/pie z ponad 40 barów/pierścionki z ggplot2 (używając geom_bar i coord_polar (theta = "Y")), a stwierdzam, że kompresja wykresu osi y powoduje, że najgłębsze pierścienie mają bardzo słabą rozdzielczość wieloboku.Wzrost wielokątny rozdzielczość ggplot działek polarnych

Ktoś wie, jak podnieść rozdzielczość wielokąta?

df <- data.frame(
    x = sort(sample(1:40, 400, replace=TRUE)), 
    y = sample(0:9, 400, replace=TRUE) 
) 


ggplot(df, aes(x=x, y=y, fill=y)) + 
    geom_bar(stat='identity', position="fill") + 
    coord_polar(theta="y") + 
    scale_fill_continuous(low="blue", high="pink") 

enter image description here

To, co mam na myśli rozdzielczości geometrycznej próbuję osiągnąć. Udało mi się to poprzez wykreślenie tylko 5 poziomów.

enter image description here

Kiedy zwiększy się do 40 poziomów środkowe wielokątów tracą gładkość i stają się zbyt postrzępione, tak:

enter image description here

+1

Przekażę ci wiadomość, jeśli włączysz kod i przykładowe dane. – James

+0

Mogę nawet zgodzić się, jeśli nie prześlesz powtarzalnych kodów i przykładowych danych. Zobacz http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example za wskazówki dotyczące zadawania wspaniałego pytania. – Andrie

+0

Pozdrawiam! Ten kod odtwarza problem. Jeśli zapiszesz w formacie PDF i przybliżysz centrum, zobaczysz, co mam na myśli. 'df <- data.frame (x = sort (próbka (1:40, 400, zastąp = TRUE)), ' \t' y = sample (0: 9, 400, replace = TRUE)) ' ' ggplot (df, aes (x = x, Y = Y wypełnienie = Y)) + ' \t' geom_bar (STAT = 'tożsamość' pozycja = "wypełnienia") + ' \t' coord_polar (teta = "Y") + ' \t' scale_fill_continuous (low = "blue", high = "pink") ' – geotheory

Odpowiedz

8

Problem jest z funkcją ggplot2:::coord_munch, który ma argument segment_length z domyślną wartością 0,01:

https://github.com/hadley/ggplot2/blob/master/R/coord-munch.r

Nie sądzę, że istnieje jakiekolwiek miejsce do przekazania w argumentach, które sprowadzą się do argumentu coord_munch z coord_munch z coord_munch. Jednym ze sposobów rozwiązania tego problemu jest zastąpienie coord_munch funkcją owijania, która ma inną domyślną wartość dla segment_length.

# Save the original version of coord_munch 
coord_munch_old <- ggplot2:::coord_munch 

# Make a wrapper function that has a different default for segment_length 
coord_munch_new <- function(coord, data, range, segment_length = 1/500) { 
    coord_munch_old(coord, data, range, segment_length) 
} 
# Make the new function run in the same environment 
environment(coord_munch_new) <- environment(ggplot2:::coord_munch) 

# Replace ggplot2:::coord_munch with coord_munch_new 
assignInNamespace("coord_munch", coord_munch_new, ns="ggplot2") 

Po dokonaniu rejestracji, można ponownie uruchomić przykład:

set.seed(123) 
df <- data.frame(
    x = sort(sample(1:40, 400, replace=TRUE)), 
    y = sample(0:9, 400, replace=TRUE) 
) 

pdf('polar.pdf') 
ggplot(df, aes(x=x, y=y, fill=y)) + 
    geom_bar(stat='identity', position="fill") + 
    coord_polar(theta="y") + 
    scale_fill_continuous(low="blue", high="pink") 
dev.off() 

Przypisanie wartości w obszarze nazw ma być używane tylko do celów rozwojowych, więc nie jest to dobre rozwiązanie długoterminowe .

+1

Wierzę, że to działa tylko z wersją 0.9.0 lub wyższą; Wersja 0.8.9 nie ma "coord_munch" –

+0

Aby obejść inne obejście mojego komentarza powyżej. – geotheory

0

Oprócz WCh za prawidłowej diagnozy i obejście powyżej alternatywą obejście jest sugerowane przez Jean-Olivier za pośrednictwem ggplot2 Google Grupa:

Zamiast zmieniania danych w celu zwiększenia wartości współrzędnych w przestrzeni danych , robiąc coś takiego:

ggplot(df, aes(x=x+100, y=y, fill=y)) + 
geom_bar(stat='identity', position="fill") + 
coord_polar(theta="y") + 
scale_fill_continuous(low="blue", high="pink") 

Dzięki wszystkim.