R中的Choropleth:自定义中断和绘图


13

我有一个关于绘制胆管图的问题。关于绘制带有自定义中断的地图有何建议?并使其看起来更具吸引力。

在我的脚本中,我使用了plot和spplot命令来可视化一些数据,但是我对结果并不完全满意。不难理解原因。使用spplot,我得到了一个颜色渐变,它为不同的值重复颜色,这有点奇怪。将绘图与自定义间隔一起使用时我无法为这些值设定更好的间隔,例如,零值在地图上为白色。我认为图例和地图之间的比例偏差可能是Rstudio的结果。

所以我想知道是否有人对使用自定义中断在R中绘制Choropleth映射有更好的建议?

编辑20-02-2013

正如建议的那样,我已经使用ggplot2创建了一个Choropleth映射。我用下面的代码。我遇到了两个问题。一种是在加强数据后,并非所有来自shapefile的数据都被传输到数据帧。因此,我必须重命名“ id”变量,以便可以合并数据。次要问题。

一个更大的问题是,尽管事实是数据帧中的数据是正确的,但ggplot显示的是数据不正确的映射。根据图例的颜色值与数据中变量的值不对应。我在这里俯瞰什么吗?

# Plotting polygon shapefiles (try-out)
# Load the packages
require(rgdal)
require(maptools)
require(ggplot2)
gpclibPermit() # required for the fortify method
# Load the shapefile
africa=readOGR("/home/GIS",layer="africaII")
names(africa) 
# Load the data on conflict
conflict<-read.csv("africa_conflict.csv", header=TRUE)
names(conflict)
# Merge the data together
africadat<-merge(africa, conflict, by="ISO3")
# Changing the data in the shapefile
africa@data <- africadat
# Fortify so that ggplot can plot
africa.points = fortify(africa,region="ISO3")
# Change "id" to "ISO3"such that the datasets can be merged again
names(africa.points)[names(africa.points)=="id"]<-"ISO3"
africa.df=merge(africa.points,africadat,by="ISO3")
# Plot the data
ggplot(africa.df) + 
aes(long,lat,group=group) + 
geom_polygon(aes(fill =onset))+
geom_path(color="white") +
coord_equal()

链接到复制数据

2015年11月13日更新: 修复了指向形状文件的链接。请参阅下面的答案,以获取有关如何绘制波形图的解决方案。


5
我还会考虑使用ggplot2Choropleth贴图,我认为默认情况下看起来效果更好。
SlowLearner

是的,我不确定使用ggplot2,因为shapefile中的long / lat数据仅指定一个点,而不指定国界。因此,我使用这些图来创建一个Choropleth贴图。我对用R处理GIS数据不是很熟悉,因此不确定我是否忽略了一些非常简单的解决方案。
horseoftheyear 2013年

请修复指向shapefile的链接。
河豚

好没问题。
horseoftheyear

Answers:


6

我没有看到上面的代码有问题,除了您在中有6个清晰的级别onset,因此我将它们视为因素而不是连续变量。请注意factor下面的代码中的调用。

ggplot(africa.df) +
  aes(long,lat,group=group) +
  geom_polygon(aes(fill = factor(onset)))+
  geom_path(color="white") +
  coord_equal()

该代码给出以下结果:

原版的

如果您想要自定义颜色,可以尝试以下操作:

library(RColorBrewer)
my.cols <- brewer.pal(6, "Blues")

ggplot(africa.df) +
  aes(long,lat,group=group) +
  geom_polygon(aes(fill = factor(onset)))+
  scale_fill_manual("Onset\n", values = my.cols, guide = "legend") +
  geom_path(color="white") +
  coord_equal()

产生此结果:

自定义颜色


尽管它仍然绘制错误的值。非常奇特。
horseoftheyear

好的,您可以通过示例确切说明问题的根源吗?安哥拉3为该onset列分配了a ,并3在图表中绘制了a 。这似乎有效。想必我想念什么吗?
SlowLearner

哦,对不起。安哥拉是少数几个正确的国家之一。例如,如果您查看南非,纳米比亚或塞内加尔,您会发现颜色所指示的值与数据中的值不对应。因此,塞内加尔应为6(现在为2),南非应为0(4),纳米比亚也应为0(1)。布隆迪和卢旺达也没有其他。在链接中,我用spplot绘制的图显示了具有正确值的图。该绘图直接从shapefile完成。因此,我猜创建数据框出了点问题。
horseoftheyear

5

classInt软件包具有许多用于计算数字数据间隔的功能-安装它并阅读文档。


是的,我将classInt包用于固定的中断(脚本中未显示),但问题在于它计算连续数值数据的间隔。尽管我的间隔是离散的,但它们代表事件的发生频率。尚未发现如何对此进行改进。
horseoftheyear 2013年

1

对于档案,我使用的解决方案是:

#### Choropleth in R example ####

## Libraries
library(classInt)    
library(lattice)
library(RColorBrewer)    
library(sp)

## Shapefile for Sub-Sahara Africa (see link in Q)
africa<-readShapeSpatial("shp/africa.shp") 

## Add data to shapefile
# In this case the number of conflict onsets between 1981-2010
africa$onset<-c(3,0,3,1,3,1,4,2,3,0,
                2,0,3,1,1,0,2,1,1,1,
                2,0,3,0,1,0,0,4,2,1,
                3,0,1,0,6,1,3,1,1,0,
                0,1,1,0,0,0,0)

## Plot 
par(mar=c(1,4,1,1),family="serif")
trellis.par.set(axis.line=list(col=NA)) # Remove borders
spplot(africa,zcol="onset",col.regions=colorRampPalette(c("white","grey10"))(20),
main=list(label="Number of civil conflict onsets 1981-2010",cex=3),
pretty=T,par.settings=list(axis.text=list(cex=3)))

在此处输入图片说明


有一个R包,它提供有用的映射功能。这被称为制图(尤其是根据文档允许对地图进行编排)。很抱歉,如果它不在主题范围内(因为您已经找到答案了),但可以说它可供将来参考。
mgc

看起来不错。我当然会尝试其他工作,因此感谢您的参考。
horseoftheyear
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.