Точки меняют размеры на ggplot geom_point и без легенды?

Итак, вот мой код для базовой карты:

gg <- ggmap(Peru) +
  geom_map(data = peru.coast, map = peru.coast, aes(x = long, y = lat, map_id = region),
           fill="gray", color="black") +
  xlim(-86, -70) +
  ylim(-20, -4) + 
  labs(x = "Longitude", y = "Latitude") +
  coord_map()

Затем я добавляю города, которые хочу назвать вручную (не знал, как это сделать с помощью карт Google, так как мне нужны были только эти 4)

gg <- gg + geom_point(aes(x=-78.981885, y=-8.229354, size=3)) +
  annotate("text", label='Salaverry', size=4, x=-77.2, y=-8.229354) +
  geom_point(aes(x=-71.345838, y=-17.644347, size=3)) +
  annotate("text", x=-70.545838, y=-17.644347, label = 'Ilo', size=4) +
  geom_point(aes(x=-77.142375, y=-12.047544, size=3)) +
  annotate("text", x=-75.9, y=-12.047544, label = 'Callao', size=4) +
  geom_point(aes(x=-78.610677, y=-9.074166, size=3)) +
  annotate("text", x=-76.9, y=-9.074166, label = 'Chimbote', size=4)
gg <- gg + guides(size=FALSE) #this removes the legend with the black dot and '3' on it 
gg

Я получаю эту прекрасную карту: введите здесь описание изображения

Затем я использую этот набор данных для добавления точек данных, и я хочу сделать точки больше или меньше в соответствии с изобилием «n».

Trip_Set sex        Set.Lon     Set.Lat     n
119_1    hembra -81.09390   -9.32338    2
119_7    hembra -81.03117   -9.09622    1
161_3    macho  -83.76533   -9.74533    5
193_8    hembra -81.00888   -9.00950    7
255_5    macho  -80.14992   -8.64592    1
271_6    hembra -72.20233   -18.05117   6
271_6    macho  -72.20233   -18.05117   7
328_7    hembra -78.66667   -12.91700   2
403_3    hembra -80.03037   -10.03900   1
428_2    hembra -83.01305   -8.74883    2
655_4    hembra -71.58363   -18.24882   1

используя этот код:

ggAB <- gg + geom_point(data=dframe4, aes(Set.Lon, Set.Lat, colour='red', size=n)) 
ggAB <- ggAB + theme(legend.title = element_text(colour="black", size=12, face="bold")) 
ggAB <- ggAB +  guides(colour=FALSE) #This removes the legend for the red colour
ggAB <- ggAB +  scale_size(name='Sharks per line', range = c(5,9)) 
ggAB <- ggAB +  theme(legend.key=element_rect(fill = NA)) #This removes the boxes around the points 
ggAB

Однако, когда я это делаю... я получаю следующее: введите здесь описание изображения

Точки данных нанесены великолепно (уф!), но почему это делает точки больше для названий моих городов? Кажется, я не могу заставить его просто сохранить изобилие для моих числовых точек данных «n» ... Он также не включает автоматическую легенду (как обычно делает ggplot), даже когда я пытаюсь ввести ее вручную, используя функция scale_discrete.

Я подумал, что это может быть как-то связано с тем, что я использовал gg + guides(size=FALSE) в первой части, но даже если убрать это, это не работает, а добавляет раздражающую легенду для точек данных моего города.

Любые идеи?


person CDav    schedule 17.12.2014    source источник
comment
Если вы хотите получить долготу и широту городов, вы можете использовать geocode в пакете ggmap. Тогда вы сможете избежать ручной работы.   -  person jazzurro    schedule 17.12.2014
comment
@jazzurro о, спасибо - сейчас попробую!   -  person CDav    schedule 17.12.2014
comment
Попробуйте это: cities <- c("Salaverry", "Chimbote", "Callao", "Ilo"); locations <- geocode(cities)   -  person jazzurro    schedule 17.12.2014
comment
@jazzurro, спасибо! Есть ли ярлык для построения этих точек или это просто случай копирования и вставки их в мой код выше?   -  person CDav    schedule 17.12.2014
comment
На самом деле я пересматривал ваш код в своем ответе. Я буду рад предоставить код позже. Как только я отправлю его в качестве дополнительного ответа, я дам вам знать. Сейчас нет времени.   -  person jazzurro    schedule 17.12.2014
comment
Я добавил дополнительную информацию для вас. Пожалуйста, посмотрите. Надеюсь, это даст вам дополнительные идеи.   -  person jazzurro    schedule 17.12.2014


Ответы (2)


Проблема в том, что в коде, где вы добавляете города, вы поместили size внутри aes. Поэтому он также трансформируется, когда вы вызываете scale_size(name='Sharks per line', range = c(5,9)). Просто используйте size вне aes:

gg <- gg + geom_point(aes(x=-78.981885, y=-8.229354), size=3) +
  annotate("text", label='Salaverry', size=4, x=-77.2, y=-8.229354) +
  geom_point(aes(x=-71.345838, y=-17.644347), size=3) +
  annotate("text", x=-70.545838, y=-17.644347, label = 'Ilo', size=4) +
  geom_point(aes(x=-77.142375, y=-12.047544), size=3) +
  annotate("text", x=-75.9, y=-12.047544, label = 'Callao', size=4) +
  geom_point(aes(x=-78.610677, y=-9.074166), size=3) +
  annotate("text", x=-76.9, y=-9.074166, label = 'Chimbote', size=4)
person shadow    schedule 17.12.2014
comment
Теперь работает отлично, знал, что это должно быть что-то действительно простое с моей стороны! Большое спасибо :) - person CDav; 17.12.2014
comment
@shadow: как насчет случая, когда размер основан на переменной столбца? В моем конкретном случае выбор размера за пределами aes делает его бессмысленным, а оставление его внутри aes, похоже, переопределяет мою предыдущую легенду geom_point. - person val; 12.01.2017

В дополнение к ответу @shadow я хотел бы оставить следующее для OP в качестве дополнительной информации. Это исходит из чата с ОП. Если вы хотите избежать использования annotate, вы можете использовать geocode в пакете ggmap. Здесь я добавил кое-что из своего ответа на предыдущий вопрос ОП и объединил/изменил код ОП. Одно изменение заключается в том, что я использовал alpha, чтобы вы могли видеть красные/розовые точки в океане. Следует отметить, что расположение названий городов не идеально; чем дальше на юг вы спускаетесь по карте, тем больше вы видите пробелов между точками и названиями городов. Это может быть связано с проекцией карты. Согласно Wiki, googlemap использует что-то близкое к marcator, но не совсем то же самое. Это может быть причиной. Некоторые эксперты по ГИС могли бы предоставить больше информации.

library(ggmap)
library(mapdata)
library(ggplot2)

# Get Peru map
Peru <- get_map(location = "Peru", zoom = 5, maptype="satellite") 

# This is the layer I wish to put over the top
coast_map <- fortify(map("worldHires", fill = TRUE, plot = FALSE)) 

# Subset data for Peru
peru.coast <- subset(coast_map, region == "Peru")

### Get lon and lat using geocode() in the ggmap package and crate a data frame
cities <- c("Salaverry", "Chimbote", "Callao", "Ilo")
locations <- geocode(cities)
locations$city <- cities
locations2 <- transform(locations, lon2 = lon + 1.1) # This is for text position


ggmap(Peru) +
geom_map(data = peru.coast, map = peru.coast, aes(x = long, y = lat, map_id = region),
         fill="gray", color="black") +
geom_point(data = locations2, aes(x = lon, y = lat, color = city), size = 4) +
geom_text(data = locations2, aes(x = lon2, y = lat, label = city), size = 3) +
scale_color_manual(values = rep(c("black"), times = 4)) + 
geom_point(data = newdata, aes(Set.Lon, Set.Lat, size = n), colour = "red", alpha = 0.5) +
scale_size(name = "Sharks per line", range = c(5,9)) +
xlim(-86, -70) +
ylim(-20, -4) + 
labs(x = "Longitude", y = "Latitude") +
coord_map("mercator") +
guides(colour=FALSE) +
theme(legend.key=element_rect(fill = NA))

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

person jazzurro    schedule 17.12.2014
comment
@CDav Я не был уверен, нужна ли тебе эта легенда. Но, я оставил это. Если вы не хотите этого, дайте мне знать. Я удалю это. - person jazzurro; 17.12.2014
comment
Ага - это НАМНОГО проще, чем мой ручной способ! И я действительно хотел легенду - прекрасное спасибо! - person CDav; 17.12.2014