无法在r中构建等值区域图

时间:2016-07-17 02:30:08

标签: r ggplot2 mapping

我有一些人口统计数据,我想用它来制作美国各州的等值线图。我的工作流程没有遇到任何错误,我可以创建最终的地图,但是,它的映射不正确的数据。我的工作流程使用两个数据源 - 形状文件和data.frame。 shapefile是一个可以在此链接https://www.dropbox.com/s/4ujxidyx42793j7/cb_2015_us_county_500k.zip?dl=1找到的县形状文件 data.frame文件可以在以下链接找到:https://www.dropbox.com/s/qys6s6ikrs1g2xb/data.dem.csv?dl=1

这是我的代码:

import UIKit
import SwiftyJSON

class MainTableViewController: UITableViewController, SettingsSidebarViewDelegate {

@IBOutlet var settings: UIBarButtonItem!

@IBOutlet var MainTableView: UITableView!

var NumberofRows = 0
var names = [String]()
var descriptions = [String]()
var categories = [String]()
var types = [String]()
var series = [String]()
var groups = [String]()

func parseJSON(){
    let path =  NSBundle.mainBundle().URLForResource("documents", withExtension: "json")

    let data = NSData(contentsOfURL: path!) as NSData!

    let readableJSON = JSON(data: data)


    NumberofRows = readableJSON["Documents"].count


    for i in 1...NumberofRows {
        let doc = "Doc" + "\(i)"
        let Name = readableJSON["Documents"][doc]["name"].string as String!
        let Description = readableJSON["Documents"][doc]["description"].string as String!
        let Category = readableJSON["Documents"][doc]["category"].string as String!
        let Type = readableJSON["Documents"][doc]["type"].string as String!
        let Series = readableJSON["Documents"][doc]["tags"]["series"].string as String!
        let Group = readableJSON["Documents"][doc]["tags"]["group"].string as String!

        names.append(Name)
        descriptions.append(Description)
        categories.append(Category)
        types.append(Type)
        series.append(Series)
        groups.append(Group)

    }


}



func showTags(showTags: Bool) {

    tableView.reloadData()
}



func showTimestamp(showTimeStamp: Bool) {
    tableView.reloadData()
}


override func viewDidLoad() {
    super.viewDidLoad()

    parseJSON()



    //Sets button title to gear, sets button actions (to open menu)
    settings.title = NSString(string: "\u{2699}\u{0000FE0E}") as String!
    let font = UIFont.systemFontOfSize(25);
    settings.setTitleTextAttributes([NSFontAttributeName: font], forState:UIControlState.Normal)
    settings.target = self.revealViewController()
    settings.action = #selector(SWRevealViewController.rightRevealToggle(_:))

        }




override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return NumberofRows
}




override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("MainTableCell", forIndexPath: indexPath) as! MainTableViewCell


    if names.count != 0{
        cell.fileName.text = names[indexPath.row]
        cell.fileDescription.text = descriptions[indexPath.row]
        cell.fileCategory.text = categories[indexPath.row]
        cell.fileType.text = types[indexPath.row]

        cell.options.setTitle(NSString(string: ":") as String!, forState: .Normal)

        cell.tag1.text = series[indexPath.row]
        cell.tag2.text = groups[indexPath.row]

        if showTagsVal{
            cell.tag1.hidden = false
        }
        else{
            cell.tag1.hidden = true
        }
        if showTimeStampVal{
            cell.tag2.hidden = false
        }
        else{
            cell.tag2.hidden = true
        }



    }



    return cell
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("showView", sender: self)
}

// MARK: - Navigation

//In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if(segue.identifier == "showView"){
        let detailVC: DetailViewController = segue.destinationViewController as! DetailViewController
        let indexPath = self.MainTableView.indexPathForSelectedRow!
        detailVC.text = names[indexPath.row]

        self.MainTableView.deselectRowAtIndexPath(indexPath, animated: true)

    }

}

输出如下所示: enter image description here

但这是错误的,这显然有很多原因。其中一个,最明显的大部分数据都没有映射。地图上的灰色区域表示NA。但是我在上面的一个步骤中删除了NA,同样在检查用于映射的数据(map.plot)时,填充变量(count)中没有NA。其次,映射的值的分布是关闭的。洛杉矶县的最高计数值应为793(对数值为6.675823),但在地图上,许多较浅色的县表明其他空间单位的价值较高,而一些排名较高的县(如圣地亚哥)则未填写在所有(地图的左下角)。

当我检查我用来映射的数据(map.plot)时,一切似乎都没问题。洛杉矶县仍然是“计数”变量的最高价值县,但地图则另有建议(见此图)。 enter image description here我希望有人可以在这里做一些取证并找出问题所在,我已尽力完成所有步骤,但我似乎无法确定问题。提前谢谢。

更新:我尝试使用来自同一来源的不同shapefile。上面链接中的shapefile与下面标记为“cb_2015_us_county_500k.zip”的形状文件相同(https://www.census.gov/geo/maps-data/data/cbf/cbf_counties.html)。当我选择不同的shapefile(例如cb_2015_us_county_5m.zip)时,我会得到一个不同的地图,但问题相同:请参阅下面的地图示例:

enter image description here

我不确定发生了什么!在这张新地图中,洛杉矶县不再是彩色的,而是橙县!非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

不清楚你的合并会发生什么,但这对我有用:

library(albersusa) # devtools::install_github("hrbrmstr/albersusa)
library(readr)
library(dplyr)
library(rgeos)
library(maptools)
library(ggplot2)
library(ggalt)
library(ggthemes)
library(viridis)

df <- read_csv("data.dem.csv")

counties_composite() %>% 
  subset(state %in% unique(df$state)) -> usa

pts <- df[,2:1]
coordinates(pts) <- ~long+lat
proj4string(pts) <- CRS(proj4string(usa))

bind_cols(df, select(over(pts, usa), -state)) %>% 
  count(fips, wt=count) -> df

您有942个县:

glimpse(df)
## Observations: 942
## Variables: 2
## $ fips <chr> "01001", "01003", "01013", "01015", "01043", "01055", "01061", ...
## $ n    <int> 1, 2, 1, 3, 1, 3, 1, 1, 19, 6, 12, 7, 7, 1, 4, 4, 1, 5, 67, 19,...

美国有超过3K个县。

然而,还有很多NA s:

filter(df, is.na(fips))
## # A tibble: 1 x 2
##    fips     n
#3   <chr> <int>
## 1  <NA>    10

usa_map <- fortify(usa, region="fips")

gg <- ggplot()
gg <- gg + geom_map(data=usa_map, map=usa_map,
                    aes(long, lat, map_id=id),
                    color="#b2b2b2", size=0.05, fill="white")
gg <- gg + geom_map(data=df, map=usa_map,
                    aes(fill=n, map_id=fips),
                    color="#b2b2b2", size=0.05)
gg <- gg + scale_fill_viridis(name="Count", trans="log10")
gg <- gg + coord_proj(us_aeqd_proj)
gg <- gg + theme_map()
gg <- gg + theme(legend.position=c(0.85, 0.2))
gg

enter image description here