2015-07-09 3 views
2

Это основано на R 3.2.1, reverse colors on mapR 3.2.1 неправильное отображение цвета

У меня есть две точки данных, один больше, чем 66%, которые должны быть зеленого цвета, другие меньше, чем 33%, которые должны быть красного цвета.

Однако менее 33% оранжевого цвета.

Ниже приведен код, который выглядит правильно (но что-то не так)

sep <- read.csv("Out_SEP_assets_csv.csv") 
Sub1 <- sep[grep("SEP.12", names(sep))] 
sep$newCol <- 100*rowSums(Sub1)/rowSums(sep[4:7]) 

# create a new grouping variable 
Percent_SEP12_Assets <- ifelse(sep[,8] <= 33, "Less than 33%", ifelse(sep[,8] >= 66, "More than 66%", "Between 33% and 66%")) 
Percent_SEP12_Assets <- factor(Percent_SEP12_Assets, 
           levels = c("More than 66%", "Between 33% and 66%", "Less than 33%")) 


# get the map 
bbox <- make_bbox(sep$Longitude, sep$Latitude, f = 1) 
map <- get_map(bbox) 


# plot the map and use the grouping variable for the fill inside the aes 
ggmap(map) + 
    geom_point(data=sep, aes(x = Longitude, y = Latitude, color=Percent_SEP12_Assets), size=9, alpha=0.6) + 
    scale_color_manual(values=c("green","orange","red")) 

dput (сентябрь) является

structure(list(School = structure(1:2, .Label = c("Out of City\\00L001", 
"Out of City\\O308"), class = "factor"), Latitude = c(40.821367, 
41.310426), Longitude = c(-73.488313, -73.837612), Windows.SEP.11 = c(4L, 
69L), Mac.SEP.11 = 0:1, Windows.SEP.12 = c(3L, 26L), Mac.SEP.12 = c(16L, 
1L), newCol = c(82.6086956521739, 27.8350515463918)), .Names = c("School", 
"Latitude", "Longitude", "Windows.SEP.11", "Mac.SEP.11", "Windows.SEP.12", 
"Mac.SEP.12", "newCol"), row.names = c(NA, -2L), class = "data.frame") 

Выход это (неправильно обведено красным) ... ..... Как исправить?

enter image description here

Ответы

Координаты правильны, я спрашиваю, почему это точка неправильно окрашены. Я думал, что эта логика верна

Percent_SEP12_Assets <- ifelse(sep[,8] <= 33, "Less than 33%", ifelse(sep[,8] >= 66, "More than 66%", "Between 33% and 66%"))

Обновленный код

Я попробовал это на @bondeded пользователя и в результате карты такой же, как и раньше

sep <- read.csv("Out_SEP_assets_csv.csv") 
Sub1 <- sep[grep("SEP.12", names(sep))] 
sep$newCol <- 100*rowSums(Sub1)/rowSums(sep[4:7]) 



# create a new grouping variable 

sep$Percent_SEP12_Assets <- ifelse(sep[,8] <= 33, "Less than 33%", ifelse(sep[,8] >= 66, "More than 66%", "Between 33% and 66%")) 
sep$Percent_SEP12_Assets <- factor(sep$Percent_SEP12_Assets, 
           levels = c("More than 66%", "Between 33% and 66%", "Less than 33%")) 


# get the map 
bbox <- make_bbox(sep$Longitude, sep$Latitude, f = 1) 
map <- get_map(bbox) 


# plot the map and use the grouping variable for the fill inside the aes 
ggmap(map) + 
    geom_point(data=sep, aes(x = Longitude, y = Latitude, color=sep$Percent_SEP12_Assets), size=9, alpha=0.6) + 
    scale_color_manual(values=c("green","orange","red")) 

Actual CSV

Здесь фактический CSV, два ряда

School    Latitude Longitude Windows-SEP-11 Mac-SEP-11 Windows-SEP-12 Mac-SEP-12 
Out of City\00L001 40.821367 -73.488313 4 0 3 16 
Out of City\O308 41.310426 -73.837612 69 1 26 1 
+0

Возможно, вы можете использовать вместо этого. – daniel

+0

@ user792000 Координаты верны. Но точка должна быть красной, а не оранжевой, поэтому выход из 'dput' – Rhonda

+0

@ user792000 Пробовал' <'вместо' <= 'он не работает – Rhonda

ответ

2

Проблема заключается в том, что по умолчанию ggplot2 падает неиспользуемые уровни от факторов. Есть два варианта:

Укажите drop = FALSE

ggmap(map) + 
    geom_point(data=sep, aes(x = Longitude, y = Latitude, color=sep$Percent_SEP12_Assets), size=9, alpha=0.6) + 
    scale_color_manual(values=c("green","orange","red"), drop = FALSE) 

Укажите значения для каждого уровня:

ggmap(map) + 
    geom_point(data=sep, aes(x = Longitude, y = Latitude, color=sep$Percent_SEP12_Assets), size=9, alpha=0.6) + 
    scale_color_manual(values=c(`More than 66%` = "green", `Between 33% and 66%` = "orange", `Less than 33%` = "red")) 

Очевидно, вы могли бы также сделать оба.

+0

Попробуй это скоро – Rhonda

1

Теперь я понял, что вы имели в виду. Проблема в вашей структуре ifelse. Может быть, это может помочь:

ifelse(sep[,8] <= 33, "Less than 33%", ifelse(sep[,8] >= 66, "More than 66%", "Between 33% and 66%")) 
    [1] "More than 66%" "Less than 33%" 
+0

Позвольте мне попробовать это – Rhonda

+0

Ok , ваши данные dput не являются воспроизводимыми, остерегайтесь. – daniel

+0

Я думаю, вы должны удалить этот ответ. Это просто неправильно. –