2013-12-10 7 views
6

Wracam do tego problemu, który pojawił się około rok temu. Chciałbym, aby mój "kolorbaryczny" przewodnik był skutecznie wyświetlany w skali logarytmicznej, aby na wynos patrząc na to, że coraz ciemniejsze wartości niebieskiego odzwierciedlają większe znaczenie.Zmień rozmiar/ręcznie wprowadź przerwy w kolorowym przewodniku po geom_tile ORAZ zamień etykiety osi Y

z następującego kodu, wygenerować poniższy obraz:

pz <- ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=c("#000066","#0000FF","#DDDDDD","white"), 
        values=c(0,0.05,0.050000000000001,1.0), 
        breaks=c(0, 0.000001, 0.01, 0.05, 1), 
        guide = "colourbar") + 
    theme_bw()+ 
    theme(panel.background = element_blank(), 
     panel.border = element_blank(), 
     axis.ticks.x = element_blank(), 
     axis.ticks.y = element_blank()) + 
    theme(legend.position="top", 
     legend.text = element_text(angle=45), 
     axis.text.x = element_text(angle=45) 
) 

colourbar

Albo mogę wyświetlić go jako "legendy" w przeciwieństwie do "colourbar":

enter image description here

Ale to, czego naprawdę pragnę, to coś takiego:

enter image description here

Próbowałem dodając 'trans = "log"' (scale_fill_gradientn (trans = "log")), ale istnieje wiele zer w moich danych, co powoduje problemy. Jeśli masz jakieś pomysły, byłoby to bardzo cenne!


Dotychczasowe brzmienie:

Próbuję zrobić mapę cieplną p-wartości dla różnych próbek dla różnych kategoryzacji. Są dwie rzeczy chciałbym zmodyfikować na tej działce:

  1. chciałbym dopasować legendę o moim geom_tile działki podkreślić dolnego końca skali legenda zachowując pełne spektrum gradientu - podobne do tego, jak by wyglądało, gdyby była to skala logarytmiczna. Zatem zasadniczo przejście od białego do niebieskiego od 1,0-0,05 do przejścia od niebieskiego do ciemnego od 0,05 do 0,00 będzie w przybliżeniu równe pod względem wielkości. Czy istnieje sposób, w jaki mogę ręcznie dostosować przewodnik kolorów?

  2. Chciałbym zastąpić nazwy osi Y, aby móc usunąć moją "pustą" etykietę wiersza. Uwaga, kategorie są po prostu reprezentowane tutaj jako litery, ale w moim prawdziwym zestawie danych są długie. Wstawiłem "pozorowane" wiersze danych, aby podzielić kategoryzacje na uchwyty i kazałem, aby płytki w każdym bloku przechodziły od najbardziej znaczących do znaczących - jestem pewien, że jest lepsze rozwiązanie tego problemu, ale to właśnie wymyśliłem po wiele nieudanych prób innych pomysłów, które znalazłem na przepełnieniu stosu! Próbowałem je oznaczyć etykietą scale_y_discrete, ale jest to pomieszane z wyżej wymienioną kolejnością.

Pomoc z którąkolwiek z tych kwestii zostanie doceniona!

sample_heatmap

Oto zbiór danych próbki:

dput(dat.m) 
structure(list(Category = structure(c(12L, 11L, 10L, 9L, 8L, 
7L, 6L, 5L, 4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 
4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 
1L), class = "factor", .Label = c("j", "i", "empty2", "h", "empty1", 
"g", "f", "e", "d", "c", "b", "a")), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L), .Label = c("b2", "c1", "c2"), class = "factor"), 
    value = c(7.40214650772221e-06, 0.0075828339, 0.1825924627, 
    0.0384381317, 0.0440256659, 0.3659284985, 0.9777569144, 1, 
    0.0075828339, 1, 0.2193606406, 0.3659284985, 0.0004289756, 
    0.0011541045, 0.0004289756, 0.4400885491, 0.6121402215, 0.6724032426, 
    0.2735924085, 1, 0.018824582, 1, 0.4386503891, 0.4249526456, 
    1.05094571578633e-05, 0.0027216795, 0.715979827, 0.0050376405, 
    0.7473334763, 0.9053300832, 1, 1, 0.0015392848, 1, 0.039679469, 
    0.0950327519)), .Names = c("Category", "variable", "value" 
), row.names = c(NA, -36L), class = "data.frame") 

I tu jest mój kod:

col_blue <- c("#FFFFFF","#000099","#000066","#000033") 
ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0),guide="colorbar") + 
    theme_mary(base_size=12) 

UPDATE:

Więc teraz mam zmodyfikowane t koduje jako taki z następującymi wynikami. Zbliżam się do tego, co mam nadzieję osiągnąć, ale chciałbym zagrać w proporcjach paska kolorów, aby nieco bardziej wyrazić gradient od 0,05-0,0.

col_blue <- c("#FFFFFF","#000099","#000066","#000033") 
ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) + 
    scale_colour_gradientn(guide = "colourbar", limits = c(0,1),breaks=c(1,0.05,0.01,0),values=c(1,0.05,0.01,0),colours=c("#FFFFFF","#000099","#000066","#000033")) 

image2

+1

Skąd się wzięło 'theme_mary'? –

+0

Wiem, że to stary komentarz, ale ponieważ właśnie zaktualizowałem to pytanie, odpowiedź brzmi - theme_mary to niestandardowy motyw, który wcześniej napisałem. Usunąłem go ze zaktualizowanego kodu. Przepraszamy za jakiekolwiek zamieszanie! – ONeillMB1

Odpowiedz

0

dla (1), wystarczy zmodyfikować dane wykorzystywane do spadku pustych wierszy przed (lub jak jesteś) kreślenia. np .: ggplot(dat.m[!grepl("^empty", dat.m$Category), ], aes(<etc>...))

dla (2), można zastąpić estetykę specjalnie dla legendy. Oto jeden z przykładów, dostosować do własnych upodobań: + guides(fill=guide_legend(override.aes=list(alpha=1)))

enter image description here

+0

Witaj Ricardo, dziękuję za twój wkład. Myślę, że nie byłem pewien co do problemu nr 2. Tak naprawdę chcę tam pusty wiersz (chodzi o rozbicie schematów kategoryzacji w moich prawdziwych danych), chciałbym tylko usunąć etykietę. Tak jak w przypadku numeru 1, chcę utrzymać ciągłą skalę kolorów. Chciałbym jednak, aby przewodnik/legenda pokazywał gradient od 0 do 0,05, a od 0,05 do około w równych długościach. – ONeillMB1

+0

Zmieniłem sformułowanie pierwszego numeru w moim poście, aby wyjaśnić ten problem. – ONeillMB1

+0

@ user2145578, a następnie po prostu zmień poziomy. 'levels (dane) <- list (empty01 =" ", empty02 =" ")' –

2

Możemy powiedzieć scale_fill_gradientn aby nie wyświetlać przewodnika z guide=FALSE, a następnie ręcznie dodać nasze własne z limitów określonych dla c(0,0.1) (lub cokolwiek Zakres chcesz).

ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + 
    ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) + 
    scale_colour_gradientn(guide = "colorbar", limits = c(0,0.1), colours=col_blue) 

enter image description here

Co do drugiego punktu, to dlaczego nie po prostu usunąć „pustych” wiersze z danymi źródłowymi przed spisek?

+0

Dziękuję, to jest przydatne, ale nie do końca to, do czego dążę. Skala jest w rzeczywistości odwrotnością tego, co wskazano w kolorach, które mogę łatwo naprawić odwracając kolejność kolorów. Jednak nadal chcę pokazać całą skalę, po prostu nie liniowo rozmieszczoną - czy to ma sens? Na przykład chciałbym pokazać od 0 do 0,05 i od 0,05 do 0,00 w przybliżeniu w równych proporcjach na przewodniku/legendzie. Jeśli chodzi o puste wiersze, potrzebuję spacji na wykresie i dlatego dodałem puste wiersze. Mój rzeczywisty zestaw danych ma wiele kategorii kategorii i chciałbym mieć spację. – ONeillMB1

+0

Przeformułowałem problem nr 1 powyżej, dzięki któremu to, co próbuję osiągnąć, stanie się bardziej przejrzyste. – ONeillMB1

Powiązane problemy