【问题标题】:Adding a point to a choropleth map based on lat and long - r基于纬度和经度向等值线图添加点 - r
【发布时间】:2018-03-08 19:12:10
【问题描述】:

我绘制了美国的等值线地图,并为每个州叠加了数据。现在我正在尝试将点添加到某些纬度和经度坐标,并认为将 geom_point 添加到我的 ggplot 可以解决问题。我认为我对 aes 的输入有一些问题,并且在弄清楚如何解决这个问题时遇到了很多麻烦。这是代码:

library(ggplot2)
library(fiftystater)
library(colorplaner)
library(RColorBrewer)

# prepare data frame
data("fifty_states") 

df <- data.frame(state=tolower(rownames(USArrests)), USArrests)
names(df)[names(df)=='Murder'] <- 'Fake_Data'
names(df)[names(df)=='Assault'] <- 'Bucket'
df<-df[,-c(4:5)]

df$Fake_Data <- runif(nrow(df), 1,60)

df$Bucket = 0
for (i in 1:nrow(df)){
  if(df[i, 2] <= 10){
    df[i,3] = 1
  } else if(df[i,2] > 10 & df[i,2] <= 20){
    df[i,3] = 2
  } else if(df[i,2] > 20 & df[i,2] <= 30){
    df[i,3]= 3
  } else if(df[i,2] > 30 & df[i,2] <= 40){
    df[i,3] = 4
  } else if(df[i,2] > 40 & df[i,2] <= 50){
    df[i,3] = 5
  }
  else if(df[i,2] > 50)
    df[i,3]=6
}

p <- ggplot(df, aes(map_id = state)) + 
  # map points to the fifty_states shape data
  geom_map(aes(fill = factor(Bucket)), map = fifty_states, color = 'gray') + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  coord_map() +
  scale_x_discrete(breaks = NULL) + 
  scale_y_discrete(breaks = NULL) +
  labs(x = "", y = "") +
  theme(legend.position = "right", 
        panel.background = element_blank())

labs <- data.frame(long = c(-122.064873,-122.306417), 
                   lat = c(36.951968,47.644855), 
                   names = c('lab', 'Seattle'), stringsAsFactors = FALSE)

p + fifty_states_inset_boxes()+ 
  scale_fill_manual('Fake Data Percentages',
                    values = c('#fef0d9', '#fdd49e', '#fdbb84', '#fc8d59', '#e34a33', 
                               '#b30000'), 
                    labels = c('0-10','10-20','20-30','30-40','40-50','50-60'))+
  geom_point(data = labs, aes(x=long, y=lat),
             color = 'black', size = 5) + 
  geom_point(data = labs, aes(x=long, y=lat),
             color = 'blue', size = 4)

我尝试用map_id = state 和简单的x=long, y=lat 替换geom_point 中的x 和y 值。但没有运气。我得到的错误是:

Error in FUN(X[[i]], ...) : object 'state' not found

任何帮助将不胜感激!

【问题讨论】:

  • 顺便说一句,您不应该在审美调用中使用声明数据框。我已经编辑了这个给你看。即它是data = labs, aes(x=long, y=lat) 而不是data = labs, aes(x=labs$long, y=labs$lat)。这可能会在地块内产生一些问题
  • 有趣,我不知道。你知道你脑海中可能发生的事情的例子吗?
  • 这解释了一些问题:stackoverflow.com/q/32543340/7347699

标签: r ggplot2 choropleth


【解决方案1】:

在情节的全局选项中,您已设置:

ggplot(df, aes(map_id = state))

这会尝试将数据框 df 和审美 map_id state 传递给所有参数,除非在几何选项中被覆盖。这就是导致错误的原因。

要解决此问题,只需在 geom_map 调用中设置 map_id。这确保它只在本地为该一个对象设置:

p <- ggplot(df) + 
  # map points to the fifty_states shape data
  geom_map(aes(fill = factor(Bucket), map_id = state), map = fifty_states, color = 'gray') + 
  expand_limits(x = fifty_states$long, y = fifty_states$lat) +
  coord_map() +
  scale_x_discrete(breaks = NULL) + 
  scale_y_discrete(breaks = NULL) +
  labs(x = "", y = "") +
  theme(legend.position = "right", 
        panel.background = element_blank())

labs <- data.frame(long = c(-122.064873,-122.306417), 
                   lat = c(36.951968,47.644855), 
                   names = c('lab', 'Seattle'), stringsAsFactors = FALSE)

p + fifty_states_inset_boxes() + 
  scale_fill_manual('Fake Data Percentages',
                    values = c('#fef0d9', '#fdd49e', '#fdbb84', '#fc8d59', '#e34a33', 
                               '#b30000'), 
                    labels = c('0-10','10-20','20-30','30-40','40-50','50-60'))+
  geom_point(data = labs, aes(x=long, y=lat),
             color = 'black', size = 5) + 
  geom_point(data = labs, aes(x=long, y=lat),
             color = 'blue', size = 4)

【讨论】:

  • 啊,对我来说似乎是一个愚蠢的错误。我仍在通过反复试验自学 R 编码的所有细节。非常感谢您解释得如此简单明了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2016-10-20
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多