ggplot2在函数内部抛出错误,但不在函数外部

时间:2013-08-18 17:56:35

标签: r function map ggplot2

UPDATE:为了回应关于代码可读性的非常合理的评论,我重新构建了代码块。

我正在尝试绘制科罗拉多州每个地区的人口普查数据,我遇到了一些我不知道如何解释的问题。 (可以找到shapefile here,并通过Census API提取摘要文件1数据。)在与数据搏斗后,我使用以下代码成功绘制了总人口:

#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)

这会生成下面的地图和直方图: First Output enter image description here

我认为这对我想做的事情来说是完美的,但我还有很多变数。一个函数会很有用。所以,这是我的功能:

 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')

我希望在我执行不当的情况下明确分享。但是,我担心它没有改变例外。

1 个答案:

答案 0 :(得分: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')

在上面的评论中提示 baptiste Roland 。非常感谢。