Как изменить метки и имена легенды ggplot с двумя слоями?

Я рисую координаты долготы и широты двух разных фреймов данных на карте Сан-Паулу, используя пакеты ggmap и ggplot, и хочу вручную пометить каждый слой легенды:

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

update: я хотел бы сделать это без объединения фреймов данных.

require(ggmap)

sp <- get_map('sao paulo', zoom=11, color='bw')
restaurants <- data.frame(lon=c(-46.73147, -46.65389, -46.67610), 
                          lat=c(-23.57462, -23.56360, -23.53748))
suppliers <- data.frame(lon=c(-46.70819,-46.68155, -46.74376), 
                        lat=c(-23.53382, -23.53942, -23.56630))
ggmap(sp)+geom_point(data=restaurants, aes(x=lon, y=lat),color='blue',size=4)+geom_point(data=suppliers, aes(x=lon, y=lat), color='red', size=4)

введите описание изображения здесь

Я посмотрел на несколько вопросов и безуспешно пробовал разные способы. Кто-нибудь знает, как я могу вставить легенду и обозначить синие точки как рестораны, а красные точки как поставщиков?


person Davi Moreira    schedule 22.06.2012    source источник
comment
Объедините фреймы данных. Добавьте третью переменную, чтобы указать отдых / поддержку. Сопоставьте цвет с третьей переменной.   -  person joran    schedule 22.06.2012
comment
Я должен добавить, что собирался написать полный ответ, но ваш код не воспроизводится.   -  person joran    schedule 22.06.2012
comment
Извини, @Joran. В моем коде была ошибка, но я ее уже исправил. Теперь он должен быть полностью воспроизводимым. Спасибо.   -  person Davi Moreira    schedule 22.06.2012


Ответы (1)


Теперь, когда ваш код воспроизводится (спасибо!):

dat <- rbind(restaurants,suppliers)
dat$grp <- rep(c('Restaurants','Suppliers'),each = 3)

ggmap(sp) + 
    geom_point(data=dat, aes(x=lon, y=lat,colour = grp),size = 4) + 
    scale_colour_manual(values = c('red','blue'))

введите описание изображения здесь

person joran    schedule 22.06.2012
comment
Спасибо! Это решение действительно делает то, что я просил. Однако я очень ценю решение без объединения фреймов данных. Поскольку ggplot2 позволяет перекрывать разные слои, вероятно, можно вручную изменить метки обеих легенд. - person Davi Moreira; 22.06.2012
comment
@DaviMoreira На самом деле ggplot работает не так. В общем, один слой: одна легенда. Объединение фреймов данных - это то, как вы это делаете в ggplot. - person joran; 22.06.2012
comment
Ты прав. Но я имел в виду нечто вроде того, что построил Хэдли [ссылка] stat.columbia.edu/~gelman/bayescomputation/Wickham2010.pdf) знаменитая карта Minard. Есть два фрейма данных (войска и города), и они не объединяются, потому что организованы по-разному (по крайней мере, я думаю, что причина в этом). И случилось так, что у меня может быть эта проблема в моем наборе данных, поскольку данные о ресторанах организованы иначе, чем данные о поставщиках. Возможно, удастся переупорядочить оба набора данных, чтобы объединить их, но я чувствую, что это будет сложно сделать. - person Davi Moreira; 22.06.2012
comment
@DaviMoreira В этом примере используются два набора данных, но они абсолютно не имеют общей легенды. Фактически, данные о городах вообще не создают легенды для этих данных. Вы не можете выполнять отдельные вызовы слоев и иметь одну легенду для данных в обоих наборах. - person joran; 22.06.2012
comment
На самом деле, поскольку нет ничего невозможного, я должен сказать, что объединение ваших фреймов данных будет намного менее неудобным, чем принуждение ggplot вести себя не так, как предполагалось. R разработан, чтобы сделать слияние / объединение данных простым и удобным. Работайте с имеющимися у вас инструментами, а не против них. - person joran; 22.06.2012