问题
I've been struggling with this problem for a few days. I have a shapefile that contains zip code polygons. I'm trying to plot a certain portion of it with a transparent color (alpha=0.7
), but some of the polygons at the edge of the plot end up with no color. If alpha=1.0
, all polygons are fine. The shapefile is stored as a Large SpatialPolygonsDataFrame
.
# Code that you can use (Thanks jbaums)
library(rgdal);
download.file('http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip', {f <- tempfile()});
unzip(f, exdir=tempdir());
shp <- readOGR(tempdir(), 'ne_110m_admin_0_countries');
plot(shp, col='#FF000070', xlim=c(-100, 25))
For reference, my code looks like this :
#~~~ Read zip shapefile
in_zip.shp = "./Data/USZIP11_wSTCntyLLFIPS.shp"
zip_poly = readShapePoly(in_zip.shp)
#~~~ Set-up the mapping parameters
xlim = c(-82.0, -80.7)
ylim = c(25.5, 26.8)
#~~~ Works well
output_figure <- "./Good.png"
png(output_figure, width=5, height=4, units="in", res=1200)
par(mar=c(1.5, 1.8, 2.0, 0.7))
plot(xlim, ylim, type="n", xlim=xlim, ylim=ylim, axes=FALSE, xlab="", ylab="")
plot(zip_poly, col=rgb(1, 0, 0, alpha=1), xlim=xlim, ylim=ylim, lty=1.3, add=T)
box()
title(main="Good")
dev.off()
#~~~ Doesn't work well
output_figure <- "./Bad.png"
png(output_figure, width=5, height=4, units="in", res=1200)
par(mar=c(1.5, 1.8, 2.0, 0.7))
plot(xlim, ylim, type="n", xlim=xlim, ylim=ylim, axes=FALSE, xlab="", ylab="")
plot(zip_poly,col=rgb(1,0,0,alpha=0.7),xlim=xlim,ylim=ylim,lty=1.3,add=T)
box()
title(main="Bad")
dev.off()
Any tips would be appreciated. I attached figures so you can see what problem I get with my code. Thanks!


回答1:
First, I don't know the reason of the problem. The fact that it works for regular colours but not for colours with alpha channel, seems strange to me.
Second, here is an example of a work-around using gIntersection
of the rgeos
package to clip the polygons to the size of interest, i.e. the xlim and ylim. Plotting the clipped map seems to work for alpha colours.
library(rgdal)
library(rgeos) # for gIntersection
library(raster) # for extent()
# download world map
download.file('http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip', {f <- tempfile()});
unzip(f, exdir=tempdir());
shp <- readOGR(tempdir(), 'ne_110m_admin_0_countries');
# define map limits
xlim = c(0, 90)
ylim = c(40, 60)
# red with alpha
mycol = rgb(1,0,0,0.5)
# plot world map
plot(shp)
# create rectangle from xlim and ylim
CP <- as(extent(c(xlim,ylim)), "SpatialPolygons")
proj4string(CP) <- proj4string(shp)
# add to plot
plot(CP, add=T, col=rgb(1,0,0,0.5))
# set up window for 2 plots, comparing 2 methods
par(mfrow=c(2,1))
# plot map with xlim and ylim: does not work the way we want
plot(shp, xlim=xlim, ylim=ylim, col=mycol, axes=T, las=1)
# clip map to xlim and ylim, then plot: works
out <- gIntersection(shp, CP, byid=TRUE)
plot(out, col=mycol, axes=T, las=1)
来源:https://stackoverflow.com/questions/24026108/spatialpolygonsdataframe-doesnt-plot-properly-when-i-make-the-color-transparent