我们每天制作地图,显示我们地区 30 个不同区域的计算温度水平,每个区域根据水平用不同的颜色填充。这张地图看起来像

现在我想将地图生成切换到 R。我已经下载了省和市边界(您可以找到整个西班牙的边界或我所在地区的子集)并设法按照 Hadley 的示例使用 ggplot2 绘制它们。 我还可以生成一个包含两列的 ascii 文件:标识符 (CODINE) 和每日级别。你可以在这里下载。 这是我第一个尝试使用 R 和 ggplot2 绘制 shapefile 的脚本,因此可能会出现错误,并且可以肯定它可以改进,欢迎提出建议。以下代码(基于 Hadley 前面提到的)对我有用: 这段代码绘制了一张带有所有边界的漂亮地图 对于按级别填充的多边形,我尝试按照 http://tormodboe.wordpress.com/2011/02/22/g?y-med-kart-2/ 中的建议进行读取然后合并 level=read.csv("levels.dat",header=T,sep="")
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
> require("maptools")
> require("ggplot2")
> require("plyr")
# Reading municipal boundaries
esp = readOGR(dsn=".", layer="lineas_limite_municipales_etrs89")
muni=subset(esp, esp$PROV1 =="46" | esp$PROV1 =="12" | esp$PROV1 =="3")
muni@data$id = rownames(muni@data)
muni.points = fortify(muni, region="id")
muni.df = join(muni.points, muni@data, by="id")
# Reading province boundaries
prov = readOGR(dsn=".", layer="poligonos_provincia_etrs89")
pr=subset(prov, prov$CODINE =="46" | prov$CODINE =="12" | prov$CODINE =="03" )
pr@data$id = rownames(pr@data)
pr.points = fortify(pr, region="id")
pr.df = join(pr.points, pr@data, by="id")
ggplot(muni.df) + aes(long,lat,group=group) + geom_path(color="blue") +
+ coord_equal()+ geom_path(data=pr.df, +
aes(x=long, y=lat, group=group),color="red", size=0.5)
munlevel=merge(muni.df,level,by="CODINE")
但它给出了一个错误
Error en fix.by(by.x, x) : 'by' must specify a uniquely valid column
我不熟悉 shapefile,也许我需要了解更多关于 shp 数据属性的信息,才能找到合并两个数据集的正确选择。如何合并数据以便绘制线条(市政边界)然后用级别填充?
[注意:这个问题是在一个多月前提出的,所以 OP 可能已经找到了一种不同的方法来解决他们的问题。我在处理这个相关问题时偶然发现了它。包含此答案是希望对其他人有所帮助。]
这似乎是 OP 要求的...

... 并使用以下代码生成:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | require("maptools") require("ggplot2") require("plyr") # read temperature data setwd("<location if your data file>") temp.data <- read.csv(file ="levels.dat", header=TRUE, sep="", na.string="NA", dec=".", strip.white=TRUE) temp.data$CODINE <- str_pad(temp.data$CODINE, width = 5, side = 'left', pad = '0') # read municipality polygons setwd("<location of your shapefile") esp <- readOGR(dsn=".", layer="poligonos_municipio_etrs89") muni <- subset(esp, esp$PROVINCIA =="46" | esp$PROVINCIA =="12" | esp$PROVINCIA =="3") # fortify and merge: muni.df is used in ggplot muni@data$id <- rownames(muni@data) muni.df <- fortify(muni) muni.df <- join(muni.df, muni@data, by="id") muni.df <- merge(muni.df, temp.data, by.x="CODIGOINE", by.y="CODINE", all.x=T, a..ly=F) # create the map layers ggp <- ggplot(data=muni.df, aes(x=long, y=lat, group=group)) ggp <- ggp + geom_polygon(aes(fill=LEVEL)) # draw polygons ggp <- ggp + geom_path(color="grey", linestyle=2) # draw boundaries ggp <- ggp + coord_equal() ggp <- ggp + scale_fill_gradient(low ="#ffffcc", high ="#ff4444", space ="Lab", na.value ="grey50", guide ="colourbar") ggp <- ggp + labs(title="Temperature Levels: Comunitat Valenciana") # render the map print(ggp) |
解释:
使用
2 3 4 5 6 | [2] Import polygon shapefile of municipalities (muni) [3] Convert muni polygons to a data frame for plotting (muni.df <- fortify(...)) [4] Join columns from muni@data to muni.df [5] Join columns from temp.data to muni.df [6] Make the plot |
连接必须在公共字段上完成,这是大多数问题出现的地方。原始 shapefile 中的每个多边形都有一个唯一的 ID 属性。在 shapefile 上运行
现在我们在
要创建地图,我们需要根据温度水平设置填充颜色。为此,我们需要将
现在我们可以根据相应的字段将
我们使用
OP原代码的一些说明:
OP 的第一张地图(顶部的绿色地图)标识了"我们地区的 30 个不同区域......"。我找不到识别这些区域的 shapefile。市政府文件确定了 543 个市镇,我看不出有办法将它们分成 30 个区域。此外,温度级别文件有 542 行,每个市(或多或少)一个。
OP 正在为市政当局导入线形文件以绘制边界。您不需要这样做,因为
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD