使用facet wrap并使用geom_sf映射不同的状态

时间:2017-12-06 15:57:26

标签: r ggplot2 sf

首先,我知道这个答案:Mapping different states in R using facet wrap
但我使用图书馆sf的对象 似乎facet_wrap(scales = "free")不适用于ggplot2中使用geom_sf绘制的对象。我收到这条消息:

  

Erreur:只有coord_cartesian()coord_flip()支持自由缩放   cowplot

我有没有错过的选项?
任何人都可以在不被迫使用FRA <- raster::getData(name = "GADM", country = "FRA", level = 1) FRA_sf <- st_as_sf(FRA) g <- ggplot(FRA_sf) + geom_sf() + facet_wrap(~NAME_1) (或任何其他网格范围)的情况下解决问题吗?

确实,这是一个例子。我想分别以不同的x / y限制显示不同的法国区域。

没有scale的结果=“free”

使用整个地图的范围计算尺度。

g <- purrr::map(FRA_sf$NAME_1,
           function(x) {
             ggplot() +
               geom_sf(data = filter(FRA_sf, NAME_1 == x)) +
               guides(fill = FALSE) +
               ggtitle(x)
           })

g2 <- cowplot::plot_grid(plotlist = g)

facet regions with geom_sf

使用cowplot的结果

我需要使用ggplots列表然后将它们组合起来。 这是目标输出。它更清洁。但我也想要一个干净的方式来添加一个传奇。 (我知道可能有一个像这个其他SO问题的共同传说: facet wrap distorts state maps in R

import glob, sys, os, shutil
from Bio import SeqIO, SearchIO
from Bio.SeqRecord import SeqRecord
import argparse

def help_function():
    print 'Hi'
parser = argparse.ArgumentParser()
parser.add_argument('-input_file', '-i',type=str,help='path_to_data')
opts = parser.parse_args()  

def check_file_exists(filepath, file_description):
    if not os.path.exists(filepath):
        print("The " + file_description + " (" + filepath + ") does not exist")
        sys.exit(1)
    else:
        print file_description + " detected"

def remove_empty_files(alleles_files,destination):
    input_handle=open(alleles_files, 'r')
    gene_records=list(SeqIO.parse(input_handle, 'fasta'))
    geneID_list=[]
    for gene_record in gene_records:
        filename=gene_record.id.split('_')
        geneID=filename[0]+'_'+filename[1]  
        if len(gene_record.seq)<5 or 'N'in gene_record.seq:
            geneID_list.append(geneID)
            shutil.move(alleles_files, destination)
            print geneID_list
        #break              
        if '-' in gene_record.seq:
            geneID_list.append(geneID)
            shutil.move(alleles_files, destination)
            print geneID_list
        #break  
        if len(geneID_list) >0:
            break                   

def main():
    if len(sys.argv) <=1:
        parser.print_help()
        sys.exit()
    else:
        check_file_exists(opts.input_file, 'input_file')

    destination=opts.input_file + '/rejected_database_genes'
    if os.path.exists(destination):
        print 'Folder already exits'
    else:
        os.makedirs(destination)
        print 'Folder has been created'
    files=glob.glob(opts.input_file+'/*.fa')
    #print files
    #sys.exit()     
    for f in files:
        #print f
        #sys.exit()
        alleles_files=glob.glob(f)[0]
        #print alleles_files
        #sys.exit()

        remove_empty_files(alleles_files,destination)
    print 'Files have been removed'
main()

facet regions with geom_sf and cowplot

1 个答案:

答案 0 :(得分:4)

我知道您正在寻找使用ggplot2的解决方案,但我发现tmap包可以根据您的需要进行选择。 tmap的语法类似于ggplot2,它也可以使用sf个对象。以你的FRA_sf为例,我们可以做这样的事情。

library(tmap)

tm_shape(FRA_sf) +
  tm_borders() +
  tm_facets(by = "NAME_1")

enter image description here

或者我们可以使用geom_spatial包中的ggspatial,但geom_spatial只会使用Spatial*个对象。

library(ggplot2)
library(ggspatial)

ggplot() +
  geom_spatial(FRA) + # FRA is a SpatialPolygonsDataFrame object
  facet_wrap(~NAME_1, scales = "free")

enter image description here