2016-09-16 16 views
6

Wykonuję bargraf w ggplot2, a ze względu na prezentację potrzebuję spacji między niektórymi z moich kresek. Używam limitów w scale_x_discrete do wstawiania pustych pasków, co daje mi wymagane odstępy.Usunąć pojedynczy znacznik zaznaczenia osi X w ggplot2 w R?

Różnica między grupami b i c w moim mock danych wygląda idealnie, ale różnica między a i b nadal ma czarny znak zaznaczyć i białą linię w tle. Nie potrzebuję żadnych linii siatki osi x, więc mogę łatwo rozwiązać problem białej linii, ale nie mogę się dowiedzieć, jak pozbyć się znaku podziałki.

używam wersji 3.3.1 R (2016-06-21) - "Bug we włosach", pracując w RStudio a kod wymaga ggplot2

### Mock data with the same structure as mine 
my.data <- data.frame(x = rep(c("a", "b", "c", "d"), 3), 
         y = c("e", "f", "g")) 

### Make graph 
ggplot(my.data, aes(x = x, fill = y)) + 
    geom_bar(position = "fill") + 
    scale_x_discrete(limits = c("a", "", "b", "", "c", "d")) 

### Remove white line in background by removing all x grid lines 
ggplot (my.data, aes(x = x, fill = y)) + 
    geom_bar(position = "fill") + 
    scale_x_discrete(limits = c("a", "", "b", "", "c", "d")) + 
    theme(panel.grid.minor.x = element_blank(), 
      panel.grid.major.x = element_blank()) 

Jak mogę usunąć czarny znacznik wyboru między a i b?

Jeśli muszę zmienić sposób wstawiania spacji między paskami, w jaki sposób mogę to zrobić i zachować strukturę wykresu?

Image showing white x-axis line and black tick mark

Odpowiedz

6

Ty może zrobić to pytasz poprzez hack: Jeśli zastąpić pusty limits z pierwszej wartości "a", ggplot umieści bar przy pierwszym wystąpieniu i pozostawić te kolejne puste :

my.data <-data.frame (x=rep(c("a", "b", "c", "d"),3), 
         y=c("e", "f", "g")) 

ggplot(my.data, aes(x=x, fill = y)) + 
    geom_bar(position = "fill") + 
    scale_x_discrete(limits = c("a", "a", "b", "a", "c", "d")) 

hacked plot

jednak prawo sposób rozdzielania zmiennych polega na fasetowaniu, które wymaga zmiennej do zdefiniowania żądanych grup, np.

library(dplyr) 

      # create with your favorite grammar 
my.data %>% mutate(grp = case_when(.$x == 'a' ~ 1, 
            .$x == 'b' ~ 2, 
            TRUE ~ 3)) 
#> x y grp 
#> 1 a e 1 
#> 2 b f 2 
#> 3 c g 3 
#> 4 d e 3 
#> 5 a f 1 
#> 6 b g 2 
#> 7 c e 3 
#> 8 d f 3 
#> 9 a g 1 
#> 10 b e 2 
#> 11 c f 3 
#> 12 d g 3 

które można przekazać do ggplot do szlifowania:

my.data %>% mutate(grp = case_when(.$x == 'a' ~ 1, 
            .$x == 'b' ~ 2, 
            TRUE ~ 3)) %>% 
    ggplot(aes(x, fill = y)) + 
    geom_bar(position = 'fill') + 
    facet_grid(. ~ grp, space = 'free_x', scales = 'free_x') 

facetted plot

+2

kolejny "hacky" sposób to zrobić byłoby dodać coś takiego do 'theme':' osi. ticks.x = element_line (color = c ("czarny", "przezroczysty", "czarny", "przezroczysty", "czarny", "czarny")) ' – Jota

+0

Tak, to prawdopodobnie kulminacja ciągu myśli OP, i jest przynajmniej czytelny. Zaletą metody "skalowania" jest to, że automatycznie zajmuje się wszystkimi liniami siatki i kleszczami bez tworzenia motywów; wadą jest to, że kod nie ma sensu. – alistaire

+0

Doskonale, dziękuję! "Hacky" sposób jest zgodny z moją pierwotną linią myślenia, ale widzę korzyści z używania 'facet_grid'. Jeśli mam nazwy aspektów i chcę je w porządku nie alfabetycznym (tj. "Pierwszy" "drugi" "dalej"), jak mam to zrobić? Ta modyfikacja ma je w porządku alfabetycznym. 'my.data%>% mutate (grp = case_when (. $ x == 'a' ~" first ", . $ x == 'b' ~" second ", TRUE ~" forth "))> % ggplot (aes (x, wypełnienie = y)) + geom_bar (position = 'fill') + facet_grid (. ~ Grp, space = 'free_x', skales = 'free_x') ' – MST