Ошибка ggplot2: дискретное значение, подаваемое в непрерывную шкалу

У меня есть набор данных, называемый "объединенным", который содержит 3 числовых столбца "pauseMedian" и "numTotalPauses" и "diff". У меня также есть набор данных splineHull, который также содержит числовые столбцы "pauseMedian" и "numTotalPauses", плюс 6-уровневый фактор "microstyle"

У меня есть следующий код, который отлично работает. Он отображает разброс plop, а затем накладывает его на полигоны splineHull, окрашенные в соответствии с "микростилем".

script 1:

ggplot(data=merged,aes(x = pauseMedian, y = numTotalPauses)) 
       + geom_point()  
       + geom_polygon(data = splineHull, 
                      mapping=aes(x=pauseMedian, 
                                  y=numTotalPauses, 
                                  group=microstyle, 
                                  color = microstyle),
                       alpha=0)

Затем я также хочу изменить цвет точек в диаграмме рассеяния, добавив только один атрибут color = diff.

script 2:

ggplot(data=merged,aes(x = pauseMedian, y = numTotalPauses, color = diff)) 
       + geom_point()  
       + geom_polygon(data = splineHull, 
                      mapping=aes(x=pauseMedian, 
                                  y=numTotalPauses, 
                                  group=microstyle, 
                                  color = microstyle),
                       alpha=0)

Я вижу следующую ошибку:

Error: Discrete value supplied to continuous scale

Я не знаю, почему я вижу эту ошибку. Если мне по-прежнему нужен цветной график рассеяния, но нет полигонов, я запускаю следующий код, который он работает снова.

script 3:

ggplot(data=merged,aes(x = pauseMedian, y = numTotalPauses, color = diff)) 
       + geom_point()  

Итак, что случилось с script 2, где это ошибка, и как я могу заставить ее работать?

Ответ 1

Очевидно, что у вас не может быть другой цветовой эстетики для двух разных геометрий. В качестве обходного пути используйте вместо этого вместоэксплуатацию для очков. Это означает, что вы должны использовать стиль маркера точки, который имеет заполненный интерьер (см. ?pch и прокрутка вниз для доступных стилей точек). Вот как это сделать:

ggplot() + 
  geom_point(data=merged,aes(x = pauseMedian, y = numTotalPauses, fill = diff),
             pch=21, size=5, colour=NA) +
  geom_polygon(data = splineHull, 
               mapping=aes(x=pauseMedian, 
                           y=numTotalPauses, 
                           colour = microstyle),
               alpha=0) 

Добавление colour=NA (вне aes()), избавляется от черной границы по умолчанию вокруг маркеров точки. Если вам нужна цветная рамка вокруг точек, просто измените colour=NA на любой цвет, который вы предпочитаете.

Также см. этот поток из группы ggplot2 Google, обсуждая аналогичную проблему и некоторые обходные пути.

Ответ 2

Теперь, когда мы знаем, что два цветовых вара имеют разные типы, есть проблема. Вы можете попробовать использовать другой масштаб для одного (например, заполнить вместо цвета)

set.seed(123)
my_df1 <- data.frame(a=rnorm(100), b=runif(100), c=rep(1:10, 10))
my_df2 <- data.frame(a=rnorm(100), b=runif(100), c=factor(rep(LETTERS[1:5], 20)))

# this won't work. can't assign discrete and continuous to same scale
ggplot() +
  geom_point(data=my_df1, aes(x=a, y=b, color=c)) +
  geom_polygon(data=my_df2, aes(x=a, y=b, color=c), alpha=0.5)

Error: Discrete value supplied to continuous scale

# but use fill for polygons, and that works:
ggplot() +
  geom_point(data=my_df1, aes(x=a, y=b, color=c)) +
  geom_polygon(data=my_df2, aes(x=a, y=b, fill=c), alpha=0.5)

plot output

Если вам нужно использовать тот же масштаб (цвет) и не можете преобразовать переменные в один и тот же тип, см. это для получения дополнительной информации: Построение непрерывных и дискретных серий в ggplot с фасеткой

Ответ 3

Просто добавьте что-то в предпочтительный ответ eipi10 выше (спасибо за это!!). Опция color = "NA", чтобы избавиться от границы вокруг формы круга (pch = 21), должна быть между "". Если вы используете color = NA (без кавычек), вся форма исчезает и не отображается. Я бы просто прокомментировал ответ, но у меня до сих пор нет репутации для этого.