этот вопрос является продолжением моего предыдущий вопрос SO и связан с этот вопрос.
я просто пытаюсь заполнить белым цветом область на 10% больше, чем простой многоугольник с помощью ggplot2. может я неправильно группирую? вот фото шипа с воспроизводимым кодом ниже
# reproducible example
library(rgeos)
library(maptools)
library(raster)
shpct.tf <- tempfile() ; td <- tempdir()
download.file(
"ftp://ftp2.census.gov/geo/pvs/tiger2010st/09_Connecticut/09/tl_2010_09_state10.zip" ,
shpct.tf ,
mode = 'wb'
)
shpct.uz <- unzip( shpct.tf , exdir = td )
# read in connecticut
ct.shp <- readShapePoly( shpct.uz[ grep( 'shp$' , shpct.uz ) ] )
# box outside of connecticut
ct.shp.env <- gEnvelope( ct.shp )
ct.shp.out <- as( 1.2 * extent( ct.shp ), "SpatialPolygons" )
# difference between connecticut and its box
ct.shp.env.diff <- gDifference( ct.shp.env , ct.shp )
ct.shp.out.diff <- gDifference( ct.shp.out , ct.shp )
library(ggplot2)
# prepare both shapes for ggplot2
f.ct.shp <- fortify( ct.shp )
env <- fortify( ct.shp.env.diff )
outside <- fortify( ct.shp.out.diff )
# create all layers + projections
plot <- ggplot(data = f.ct.shp, aes(x = long, y = lat)) #start with the base-plot
layer1 <- geom_polygon(data=f.ct.shp, aes(x=long,y=lat), fill='black')
layer2 <- geom_polygon(data=env, aes(x=long,y=lat,group=group), fill='white')
layer3 <- geom_polygon(data=outside, aes(x=long,y=lat,group=id), fill='white')
co <- coord_map( project = "albers" , lat0 = 40.9836 , lat1 = 42.05014 )
# this works
plot + layer1
# this works
plot + layer2
# this works
plot + layer1 + layer2
# this works
plot + layer2 + co
# this works
plot + layer1 + layer3
# here's the problem: this breaks
plot + layer3 + co
# this also breaks, but it's ultimately how i want to display things
plot + layer1 + layer3 + co
# this looks okay in this example but
# does not work for what i'm trying to do-
# cover up points outside of the state
plot + layer3 + layer1 + co
coord_map
: Это все еще экспериментально, и если у вас есть какие-либо советы относительно лучшего (или более правильного) способа сделать это, пожалуйста, дайте мне знать. Могу поспорить, что вы нашли ошибку в этой экспериментальной функции. - person Pop   schedule 17.10.2014ggplot2
решение? Предполагая, что я понимаю ваши намерения, этот материал довольно прост с базовым графиком. - person jbaums   schedule 17.10.2014coord_map
в частности, я перестал копать, так как ggplot чертовски сложно (для меня, по крайней мере) отлаживать! С функцией построения базы или решетки я бы, по крайней мере, попробовал. - person Josh O'Brien   schedule 17.10.2014ggplot2
, потому что другие компоненты полного кода, который я пытаюсь усовершенствовать полагаться на geom_tile(). тем не менее, я, безусловно, был бы признателен за решение, отличное от ggplot2, если вы считаете его простым - person Anthony Damico   schedule 17.10.20141.1 * extent(x)
- это не то же самое, что добавить 10% к каждой стороне, если только обе оси не охватывают экватор. В данном случае1.1 * xmax
и1.1 * ymax
фактически вычитают 10% из этих границ (посколькуxmax
иymax
отрицательны). - person jbaums   schedule 17.10.2014*
применительно к объекту классаExtent
, и он умнее этого. Попробуйтеextent(10,20,10,20) * 1.2
, чтобы убедиться, что он действительно дополняет каждое измерение. (Обратите внимание, что вам нужно умножить на1.2
, чтобы получить 10% расширение в каждом направлении.) Если вы хотите взглянуть на код, лежащий в основе метода*
Extent
, вы можете получить его, набравgetMethod("Arith", c("Extent", "numeric"))
. - person Josh O'Brien   schedule 17.10.2014