ggplot2: ошибка при наложении двух слоев - PullRequest
0 голосов
/ 08 мая 2018

Ниже в упрощенной форме описывается проблема, с которой я часто сталкиваюсь, но никогда не заставляю ее работать. Это связано с наложением слоев с различной информацией.

Любая помощь приветствуется.

library(dplyr)
library(ggplot2)

df = data.frame(id = c(1,1,1,1,2,2,2,3,3,3), 
            year = c(2000,2001,2002,2003,2000,2001,2002,2001,2002,2003),
            meas = c(1.1,1.2,NA,1.4,2.1,1.9,1.8,3.1,3.0,3.3))

df$id   = as.factor(df$id)
df$year = as.factor(df$year)

tib = as.tbl(df)

, который производит тибль:

# A tibble: 10 x 3
       id   year  meas
   <fctr> <fctr> <dbl>
 1      1   2000   1.1
 2      1   2001   1.2
 3      1   2002    NA
 4      1   2003   1.4
 5      2   2000   2.1
 6      2   2001   1.9
 7      2   2002   1.8
 8      3   2001   3.1
 9      3   2002   3.0
10      3   2003   3.3

В настоящее время я вычисляю медиану показателей для каждого года в поперечном сечении.

tib2 = tib %>% group_by(year) %>%       
    summarise(medi=median(meas,na.rm=T))
tib2

Что дает, как и ожидалось

# A tibble: 4 x 2
    year  medi
  <fctr> <dbl>
1   2000  1.60
2   2001  1.90
3   2002  2.40
4   2003  2.35

Пока все хорошо. Теперь я создаю свой первый сюжет

p = ggplot(tib, aes(x = year, y = meas, group = id, color = id)) p = p + geom_line() p который производит

enter image description here

С другой стороны, следующее дает набор жирных точек, как и должно быть

p1=ggplot(tib2, aes(x = year, y = medi)) + geom_point(colour = 'red', size = 3)
p1

Red dots

Однако я стараюсь разместить красные точки на первой фигуре так:

p = p + geom_point(data = tib2, aes(x = year, y = medi), colour = 'red', size = 3)
p

Здесь я получаю сообщение об ошибке:

Не знаю, как автоматически выбрать масштаб для объекта типа функции. По умолчанию для непрерывного. Ошибка в (функция (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, аргументы подразумевают различное количество строк: 4, 0

Примечание: я заметил, что пропущенное значение вызывает разрез в красной линии, который я мог бы захотеть интерполировать. Когда я заменяю NA на какое-то значение, ошибка сохраняется

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Ошибка «объект типа функции» относится к функции dplyr::id().

Когда вы назначаете эстетику в вызове ggplot, она применяется ко всему сюжету, и хотя она правильно интерпретируется в первом контексте geom in the tib dataframe context, the tib2`, ее нет, поэтому она выдает ошибку .

Вы можете передать соответствующий aes в одиночный geom, или вы можете использовать inherit.aes = FALSE в 'tib2 geom':

library(ggplot)

ggplot(tib) + 
  geom_line(aes(x = year, y = meas, group = id, color = id)) +
  geom_point(data = tib2, aes(x = year, y = medi), size = 3, color = 'red')


ggplot(tib, aes(x = year, y = meas, group = id, color = id)) + 
  geom_line() +
  geom_point(data = tib2, aes(x = year, y = medi), size = 3, color = 'red', inherit.aes = FALSE)

Или, что еще более элегантно, укажите aes, которые являются общими в вызове ggplot, и другие, где это необходимо:

ggplot(tib, aes(x = year)) + 
  geom_line(aes(y = meas, group = id, color = id)) +
  geom_point(data = tib2, aes(y=medi), size = 3, color = 'red')

Создано в 2018-05-08 пакетом Представить (v0.2.0).

0 голосов
/ 08 мая 2018

вы можете попробовать

ggplot(tib, aes(x = year, y = meas, group = id, color = id)) +
   geom_line() +
   stat_summary(fun.y = median, geom="point", aes(group=year), colour = 'red', size = 3)

enter image description here

или используйте как рекомендуется Dash2

ggplot() +
   geom_line(data=tib, aes(x = year, y = meas, group = id, color = id)) +
   geom_point(data = tib2, aes(x = year, y = medi), colour = 'red', size = 3) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...