2016-09-16 4 views
6

Я делаю барграф в ggplot2, и для объяснения причин мне нужны пробелы между некоторыми из моих баров. Я использую лимиты в scale_x_discrete, чтобы вставить пустые бары, что дает мне расстояние, которое мне нужно.Удалите одну галочку по оси x в ggplot2 в R?

Разрыв между группами b и c в моем макете данных выглядит идеально, но разрыв между a и b еще имеет черную галочку и белую линию в фоновом режиме. Мне не нужны никакие линии сетки оси x, поэтому я могу легко решить проблему белой линии, но я не могу решить, как избавиться от метки.

Я использую R версии 3.3.1 (2016-06-21) - «Ошибка в волосах», работая в RStudio и код требует 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()) 

Как удалить черный отметка между a и b?

Если мне нужно изменить способ ввода пространств между столбцами, как мне это сделать и поддерживать структуру графика?

Image showing white x-axis line and black tick mark

ответ

6

Вы можете делать то, что вы просите через хак: Если вы замените пустой limits с первым значением "a", ggplot разместят бар на первом появлении и оставить следующие из них пустым :

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

Однако право способ разделения переменных - это фасетка, которая требует, чтобы переменная определяла группы, которые вы хотите, например.

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 

который вы можете перейти к ggplot для facetting:

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

другой "Hacky" способ сделать это было бы добавить что-то вроде этого в 'theme':' оси. ticks.x = element_line (color = c («черный», «прозрачный», «черный», «прозрачный», «черный», «черный»)) – Jota

+0

Да, это, вероятно, кульминация движения мысли OP, и, по крайней мере, является удобочитаемым. Преимущество подхода «масштаб» заключается в том, что он автоматически обрабатывает все линии сетки и тики без их использования; недостатком является то, что код не имеет смысла. – alistaire

+0

Отлично, спасибо! «Хакерный» способ следует моей первоначальной линии мышления, но я вижу преимущество использования 'facet_grid'. Если я назвал грани и хочу, чтобы они были в алфавитном порядке (т. Е. «Первый» «второй», «четвертый»), как мне это сделать? Эта модификация имеет их в алфавитном порядке. 'my.data%>% mutate (grp = case_when (. $ x == 'a' ~" first ", . $ x == 'b' ~" second ", ИСТИНА ~" вперед "))%> % ggplot (aes (x, fill = y)) + geom_bar (position = 'fill') + facet_grid (. ~ Grp, space = 'free_x', scale = 'free_x') ' – MST

Смежные вопросы