1

更新: コードの読みやすさに関する非常に合理的なコメントに応えて、コード ブロックを再構築しました。

コロラド州の各地区の国勢調査データをマッピングしようとしていますが、説明の仕方がわからない問題に遭遇しました。(シェープファイルはここにあります。Summary File 1 のデータはCensus APIを介して取得されました。)データと格闘した後、次のコードを使用して総人口をプロットすることに成功しました。

#Set theme for histograms
theme_hist <- list(theme(panel.grid.minor = element_blank(),
                        panel.grid.major = element_blank(),
                        panel.background = element_blank(),
                        plot.background = element_blank(),
                        panel.border = element_blank(),
                        plot.title = element_text(size=22)))

#Plot map
pop_dist<-ggplot(aes(x=long,y=lat,group=group,fill=as.numeric(tot_pop)),data=co_mapd) + 
            geom_polygon(colour='white',size=.2) + 
            coord_equal() + 
            theme_opts + 
            labs(title='Distribution of Population') +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC',
                                 midpoint=median(as.numeric(co_mapd$tot_pop)))
#ggsave('co_tract_pop_2010_map.png')

#Plot histogram
pop_hist<-ggplot(aes(x=as.numeric(tot_pop),group=group,fill=as.numeric(tot_pop)),data=co_mapd) + 
            geom_histogram() + 
            theme_hist +
            xlab('Population Bins') +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC',
                                 midpoint=median(as.numeric(co_mapd$tot_pop)))
#ggsave('co_tract_pop_2010_hist.png')

#Throw plots on a single canvas
grid.arrange(pop_dist,pop_hist)

これにより、以下のマップとヒストグラム プロットが生成されました。 最初の出力 ここに画像の説明を入力

これは私がやろうとしていたことには完璧だと思いましたが、もっと多くの変数があります。関数があれば便利です。だから、ここに私の機能があります:

 map_var<-function(data,var,ttl){
        dist<-ggplot(aes(x=long,y=lat,group=group,fill=var),data=data) +  
        geom_polygon(colour='white',size=.2) + 
                coord_equal() + 
        theme_opts + 
        labs(title=ttl) +
        scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC',
                                 midpoint=median(data$var))

        hist<-ggplot(aes(x=var,group=group,fill=var),data=data) + 
        geom_histogram() + 
        theme_hist +
                xlab('Bins') +
                scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC',
                                midpoint=median(data$var))

        grid.arrange(dist,hist)
        }

    map_var(co_mapd,tot_pop,'Distribution of Population')

関数ラッパーの外で行ったことを正確にミラーリングしようとしたため、機能するはずです。文字通りコピーして貼り付け、関数パラメーターが作用する要素を変更しただけです。ただし、代わりに次のエラーがスローされます。

Error in data.frame(x = c(-107.48212, -107.482115, -107.482062, -107.48206,  : 
  arguments imply differing number of rows: 748351, 0

また、関数内で as.numeric() がいくつかの問題を引き起こしているため、関数を実行する前に、関連するすべての列を数値に変換したことにも言及する必要があります。

いずれにせよ、引数が関数内の異なる行数を意味する理由は明確ではありませんが、プロットコードが単独である場合は明確ではありません。適切な環境へのアクセスで何かファンキーなことが起こっていると思いますが、それが何であるかはわかりません. どんな助けでも大歓迎です。

更新:私はまた、aes_stringルートに行こうとしました(これは以前は知らなかったのでありがとうございます)。それが問題ではなかったか、私がテクニックを誤って適用したかのどちらかです。

map_var<-function(data,var,ttl,coord_x,coord_y,group='group'){
    dist<-ggplot(aes_string(x=coord_x,y=coord_y,group=group,fill=var),data=data) + 
            geom_polygon(colour='white',size=.2) + 
            coord_equal() + 
            theme_opts + 
            labs(title=ttl) +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC')

    hist<-ggplot(aes(x=var,group=group,fill=var),data=data) +
            geom_histogram() + 
            theme_hist +
            xlab('Bins') +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC')

    grid.arrange(dist,hist)
    }

map_var(co_mapd,var='tot_pop',ttl='Distribution of Population',coord_x='long',coord_y='lat')

このバージョンでは、次の例外がスローされます...

Don't know how to automatically pick scale for object of type function. Defaulting to continuous
Error in data.frame(x = function (x, y = NULL, na.rm = FALSE, use)  : 
  arguments imply differing number of rows: 0, 748351

完全な data.frame 以外を意味する、使用している引数についてはまだ明確ではありません (関数内でのみ重要な理由が不明であることに加えて)。

更新 (8/20) : eval() の提案を組み込むために、更新されたコード ブロックを追加しています。

map_var<-function(data,var,ttl,coord_x,coord_y,group='group'){
    dist<-ggplot(aes_string(x=eval(coord_x),y=eval(coord_y),group=eval(group),fill=eval(var)),data=data) + 
            geom_polygon(colour='white',size=.2) + 
            coord_equal() + 
            theme_opts + 
            labs(title=eval(ttl)) +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC')

    hist<-ggplot(aes(x=eval(var),group=eval(group),fill=eval(var)),data=data) +
            geom_histogram() + 
            theme_hist +
            xlab('Bins') +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC')

    grid.arrange(dist,hist)
    }

map_var(co_mapd,var='tot_pop',ttl='Distribution of Population',coord_x='long',coord_y='lat')

うまく実行できなかった場合に備えて、明示的に共有したかった. 残念ながら、例外は変更されていません。

4

1 に答える 1

1

後でこの問題に遭遇する可能性がある人にとって、これは見事に機能しました。

map_var<-function(data,var,ttl,coord_x,coord_y,group='group'){
    dist<-ggplot(aes_string(x=coord_x,y=coord_y,group=group,fill=var),data=data) + 
            geom_polygon(colour='white',size=.2) + 
            coord_equal() + 
            theme_opts + 
            labs(title=ttl) +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC')

    hist<-ggplot(aes_string(x=var,group=group,fill=var),data=data) +
            geom_histogram() + 
            theme_hist +
            xlab('Bins') +
            scale_fill_gradient2(low='#ECE7F2',mid='#A6BDDB',high='#3300CC')

    grid.arrange(dist,hist)
    }

map_var(co_mapd,var='tot_pop',ttl='Distribution of Population',coord_x='long',coord_y='lat')

上記のコメントで、バティストローランドに敬意を表します。どうもありがとう。

于 2013-08-21T00:34:09.387 に答える