ggplot: geom_polygon - Ошибка в длине эстетики

Я хочу нарисовать диаграмму рассеяния с тремя полигонами в определенных областях фоновой окраски. Это должно выглядеть так: этим. Код отлично работает с 4 переменными по оси Y, но выдает ошибку, когда я добавляю пятую. Я не могу понять причину.

Ошибка:

Ошибка: эстетика должна быть либо длиной 1, либо такой же, как данные (5): x, y

Воспроизводимый код:

library(dplyr)
library(ggplot2)

v1 <- c(1, 1, 1)
v2 <- c(1, 0, 0)
v3 <- c(1, 0, 1)
v4 <- c(0, 1, 1)
v5 <- c(1, 0, 1)

xG <- c(3, 3, 3, 3, 3)

input <- c(v1, v2, v3, v4, v5)
df <- data_frame(values = input, 
             module = c(rep("A", length(v1)), 
                        rep("B", length(v2)), 
                        rep("C", length(v3)), 
                        rep("D", length(v4)), 
                        rep("E", length(v5))))

perWorkField <- df %>%
  group_by(module) %>%
  summarise(sums = sum(values)) %>%
  mutate(percent = round((sums / xG) * 100, 2))

ggplot(data = perWorkField) + 
  geom_point(mapping = aes(x = percent, y = module)) + xlim(c(0, 100)) + 
  geom_polygon(aes(x = c(0, 30, 30, 0), y = c(0.5, 0.5, 5.5, 5.5)), 
           fill="#F5817A", 
           color = NA) +
  geom_polygon(aes(x = c(30, 75, 75, 30), y = c(0.5, 0.5, 5.5, 5.5)), 
           fill="#FFFF0044", 
           color = NA) +
  geom_polygon(aes(x = c(75, 100, 100, 75), y = c(0.5, 0.5, 5.5, 5.5)), 
           fill="#00FF0044", 
           color = NA) + 
  geom_point(mapping = aes(x = percent, y = module), shape = 20, size = 5) + theme_classic()

Я ценю любые советы. Заранее спасибо!


person j3ypi    schedule 14.09.2017    source источник


Ответы (2)


Вы можете попробовать это, чтобы заставить его работать, я заменил аргумент данных, чтобы он работал правильно

ggplot() + 
  geom_point(data = perWorkField, mapping = aes(x = percent, y = module)) + xlim(c(0, 100)) + 
  geom_polygon(aes(x = c(0, 30, 30, 0), y = c(0.5, 0.5, 5.5, 5.5)), 
               fill="#F5817A", 
               color = NA) +
  geom_polygon(aes(x = c(30, 75, 75, 30), y = c(0.5, 0.5, 5.5, 5.5)), 
               fill="#FFFF0044", 
               color = NA) +
  geom_polygon(aes(x = c(75, 100, 100, 75), y = c(0.5, 0.5, 5.5, 5.5)), 
               fill="#00FF0044", 
               color = NA) + 
  geom_point(data = perWorkField, mapping = aes(x = percent, y = module), shape = 20, size = 5) + theme_classic()
person Patrik_P    schedule 14.09.2017
comment
Я немного запутался, почему это вызвало проблему с 5 переменными, а не с 4. Но теперь это работает - большое спасибо! - person j3ypi; 14.09.2017
comment
У вас есть пункт. В исходном коде вы объявили данные в ggplot(data = perWorkField), которые были переданы и столкнулись с отдельными геометриями. С моей точки зрения, это вызвало проблемы. - person Patrik_P; 14.09.2017

Поскольку вы создаете прямоугольные заштрихованные области, geom_rect() может быть легче читать/обслуживать, чем geom_polygon().

Кроме того, annotate() можно использовать, чтобы избежать проблемы с унаследованной эстетикой от фрейма данных:

ggplot(data = perWorkField) + 
  geom_point(aes(x = percent, y = module)) +
  annotate("rect", xmin =  0, xmax =  30, ymin = 0.5, ymax = 5.5, fill = "#F5817A", color = NA) +
  annotate("rect", xmin = 30, xmax =  75, ymin = 0.5, ymax = 5.5, fill = "#FFFF0044", color = NA) +
  annotate("rect", xmin = 75, xmax = 100, ymin = 0.5, ymax = 5.5, fill = "#00FF0044", color = NA) +
  geom_point(aes(x = percent, y = module), shape = 20, size = 5) +
  theme_classic()
person Z.Lin    schedule 14.09.2017
comment
Выглядит действительно лучше - Спасибо! - person j3ypi; 14.09.2017