2016-09-26 13 views
5

Chcę wyróżnić pogrubione poszczególne etykiety osi. Jestem świadomy tego answer przez @MrFlick, ale nie mogę wymyślić, jak to zrobić a) dla więcej niż jednego przedmiotu, i b), czy możliwe jest użycie nazw etykiet zamiast liczby element na tej liście (lub wyrażenie).Wyróżnianie poszczególnych etykiet osi pogrubioną za pomocą ggplot2

Oto przykład zestawu danych:

require(ggplot2) 
require(dplyr) 
set.seed(36) 
xx<-data.frame(YEAR=rep(c("X","Y"), each=20), 
       CLONE=rep(c("A","B","C","D","E"), each=4, 2), 
       TREAT=rep(c("T1","T2","T3","C"), 10), 
       VALUE=sample(c(1:10), 40, replace=T)) 

to jestem sortowaniu moje etykiety według określonej kombinacji czynnika, który następnie miał być utrzymany w wielu panelach działce. Zobacz moje poprzednie pytanie here.

clone_order <- xx %>% subset(TREAT == "C" & YEAR == "X") %>% 
    arrange(-VALUE) %>% select(CLONE) %>% unlist()  
xx <- xx %>% mutate(CLONE = factor(CLONE, levels = clone_order)) 

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
    geom_bar(stat="identity", position="dodge") + 
    facet_wrap(~TREAT) 

enter image description here

Teraz chcę pogrubienie CloneA, B i E. Jestem pewien, że to zadziała jakoś, ale nie wiem jak. Idealnie byłoby wiedzieć, jak to zrobić, używając a), używając numeru pozycji na liście/wyrażeniu, i b), używając etykiety, np. A, B i E.

Odpowiedz

7

Oto ogólny sposób, aby utworzyć wektor emboldening:

colorado <- function(src, boulder) { 
    if (!is.factor(src)) src <- factor(src)     # make sure it's a factor 
    src_levels <- levels(src)         # retrieve the levels in their order 
    brave <- boulder %in% src_levels       # make sure everything we want to make bold is actually in the factor levels 
    if (all(brave)) {           # if so 
    b_pos <- purrr::map_int(boulder, ~which(.==src_levels)) # then find out where they are 
    b_vec <- rep("plain", length(src_levels))    # make'm all plain first 
    b_vec[b_pos] <- "bold"         # make our targets bold 
    b_vec             # return the new vector 
    } else { 
    stop("All elements of 'boulder' must be in src") 
    } 
} 

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
    geom_bar(stat="identity", position="dodge") + 
    facet_wrap(~TREAT) + 
    theme(axis.text.x=element_text(face=colorado(xx$CLONE, c("A", "B", "E")))) 
+0

Wow, to świetnie! Dzięki!Jeszcze jedno pytanie, czy byłoby również możliwe, poza pogrubieniem, zwiększenie rozmiaru czcionki pogrubionej etykiety, powiedzmy 2pt, używając 'size =' w 'axis.text.x'? – Stefan

+1

Aye. Większość paramerów 'element_text()' jest wektoryzowana, ale musisz skopiować i zaadaptować tę funkcję, aby była zmieniarką 'size' względem zmieniacza' face'. – hrbrmstr

+0

Próba dostosowania tego do alternatywnie górnego lub dolnego uzasadnia wybrane etykiety. Napisałem kod, ale po prostu tworzy on pustą fabułę. Zastąpiony "zwykły" z 1,0, i "pogrubiony" z 0.0 w twojej funkcji "colorado". I w wywołaniu fabuły: 'theme (axis.text.x = element_text (vjust = colorado2 (xx $ CLONE, c (" A "," B "," E "))))). Jednak zmiany zajmują połowę działki, której nie chcę. Wszelkie pomysły na skalowanie 0 lub 1 w obszarze etykiety na działce @hrbrmstr? – user2498193

5

Nie jestem pewien, czy można odwzorować charakterystykę etykietę nazwy, ale na pewno można to zrobić przez położenie z wezwaniem do theme:

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
    geom_bar(stat="identity", position="dodge") + 
    facet_wrap(~TREAT) + 
    theme(axis.text.x = element_text(face = c('bold', 'bold', 'plain', 'plain', 'bold'))) 

Podana czcionki stoi za axis.text.x są taką samą długość jak etykiety twojej osi X (pięć elementów). To daje:

enter image description here

+0

Dzięki! Używanie 'axis.text.x' jest zdecydowanie opcją, ale nieco uciążliwym, ponieważ mam 34 poziomy czynników. Właśnie dlatego miałem nadzieję, że w jakiś sposób określę te, które chcę, aby były pogrubione po imieniu, a nie licząc pozycję. Przegłosowałem twoją odpowiedź, ale chciałbym ją nieco dłużej otworzyć. Może ktoś ma inny pomysł. – Stefan

+0

Grając z tym trochę więcej, wygląda na to, że 'element_text' działa tylko według pozycji i ignoruje nazewnictwo. Jedną z możliwości ograniczenia pisania byłoby rozsądne użycie 'rep', na przykład:' c (rep ('plain', 10), rep (c ('bold', 'plain', each = 2)) 'sprawiłoby, że pierwszych 10 etykiet zwykłych, następna 2 pogrubiona i następna 2 zwykła – jdobres

4

Można utworzyć nazwie wektor ekspresji (to kolej tekstową pogrubieniem) w scale_x_discrete i używać parse=TRUE ocenić wyrażeń:

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
    geom_bar(stat="identity", position="dodge") + 
    facet_wrap(~TREAT) + 
    scale_x_discrete(labels=c("A"=expression(bold(A)), "C"=expression(bold(C)), 
           "E"=expression(bold(E)), parse=TRUE)) 

Prawdopodobnie można utworzyć wektor programowo, zamiast go wypisać, ale droga do tego teraz ucieka.

enter image description here

+0

Dziękuję @ eipi10! Podoba mi się również ta, ponieważ jest prosta (np. upvote), jednak odpowiedź @hrbrmstr zapewnia mi większą kontrolę – Stefan

+0

Tak, Ja też lubię jego odpowiedź: – eipi10

Powiązane problemy