geom_bar и geom_point в одном и том же ggplot и в тех же группах - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть текущий код

ggplot(data = niveles[niveles$departamento=="CUNDINAMARCA" &
                        niveles$prueba=="MATEMÁTICAS" &
                        !is.na(niveles$nivel),]) + 
  geom_bar(stat="identity", position = position_dodge(),
           aes(x = año, y = desempeño, fill = nivel)) +
  geom_point(data = niveles[niveles$prueba=="MATEMÁTICAS" &
                              niveles$departamento=="COLOMBIA" &
                              !is.na(niveles$nivel),], shape = 24,
             aes(x = año, y = desempeño, group = nivel, fill = "blue")) 

, который дает мне следующий график:

enter image description here

Однако я надеялся чтобы получить каждую из «точек» в соответствующей категории переменной «niveles». Кто-нибудь знает, как я могу это сделать?

С уважением.

1 Ответ

0 голосов
/ 01 марта 2020

Вы можете уклоняться от очков так же, как вы уклоняетесь от баров, используя position=position_dodge(). Однако вам нужно добавить аргумент width, указывающий, сколько «уклоняться». Значение 1 должно соответствовать пунктирным столбикам. У вас также есть неизвестная «голубая» категория в легенде. Это связано с тем, что аргумент fill должен появляться за пределами эстетики c (aes)

. Я также думаю, что вы должны сначала поместить данные в подгруппу, а не делать все это в команде ggplot.

Альтернативой является фасет по отделам (см. Вариант 2 ниже).

Но сначала нужно увернуться от точек.

Вариант 1 : Подмножество

Создать подмножество для prueba и не пропустить для nivel:

MATH <- niveles[niveles$prueba=="MATEMÁTICAS" & !is.na(niveles$nivel),]

Создать подмножества для каждого отдела:

CUNDINAMARCA <- MATH[MATH$departamento=="CUNDINAMARCA",]
COLOMBIA <- MATH[MATH$departamento=="CUNDINAMARCA",]

Затем сделайте graph:

ggplot(data = CUNDINAMARCA) + 
  geom_bar(stat="identity", position = position_dodge(),
           aes(x = año, y = desempeño, fill = nivel)) +
  geom_point(data = COLOMBIA, shape = 24,
         position = position_dodge(width=1), # You need this to align points with bars
         aes(x = año, y = desempeño, group = nivel), fill = "blue")

Я не могу проверить это на ваших данных, но в качестве примера я использовал набор данных mtcars.

mtcars <- mtcars %>%
  mutate(gear=factor(gear), cyl=factor(cyl))

VS0 <- mtcars[mtcars$vs==0,]
VS1 <- mtcars[mtcars$vs==1,]

ggplot() + 
  geom_bar(data = VS0, stat="identity", position = position_dodge(),
           aes(x = cyl, y = mpg, fill = gear)) +
  geom_point(data = VS1, shape = 24, 
    position = position_dodge(width=1),
    aes(x = cyl, y = mpg, group = gear), fill = "blue")

enter image description here


Вариант 2: Фасетирование

ggplot(data = mtcars, group=vs) + 
  geom_bar(stat="identity", position = position_dodge(),
           aes(x = cyl, y = mpg, fill = gear)) +
  facet_grid(~vs, labeller=label_both)

enter image description here


Для ваших данных, возможно, это будет работать:

DATA <- MATH[MATH$departamento %in% c("CUNDINAMARCA","COLOMBIA"),]

ggplot(data = DATA, group=departamento) + 
  geom_bar(stat="identity", position = position_dodge(),
           aes(x = año, y = desempeño, fill = nivel)) +
  facet_grid(~departamento, labeller=label_both)
...