【问题标题】:how to plot a raster file as a histogram using ggplot2?如何使用ggplot2将光栅文件绘制为直方图?
【发布时间】:2013-02-03 00:20:36
【问题描述】:

我有一个光栅文件 我想绘制为直方图,我使用 hist() 进行绘制,如下所示。但我想使用 ggplot2 进行绘图,它以更好的方式进行发布。

conne <- file("C:\\fined.bin","rb")
r = raster(y)
hist(r, breaks=30, main="SMD_2010",
        xlab="Pearson correlation", ylab="Frequency", xlim=c(-1,1))

我试过了:

  qplot(rating, data=r, geom="histogram")

错误:

            ggplot2 doesn't know how to deal with data of class RasterLayer

我需要绘制类似的东西:

http://docs.ggplot2.org/0.9.3/geom_histogram-28.png

【问题讨论】:

    标签: r ggplot2 histogram raster


    【解决方案1】:

    作为一个快速的解决方案你可以使用hist的结果

    f <- hist(r, breaks=30)
    dat <- data.frame(counts= f$counts,breaks = f$mids)
    ggplot(dat, aes(x = breaks, y = counts)) + 
      geom_bar(stat = "identity",fill='blue',alpha = 0.8)+
      xlab("Pearson correlation")+ ylab("Frequency")+
      scale_x_continuous(breaks = seq(-1,1,0.25),  ## without this you will get the same scale
                       labels = seq(-1,1,0.25))    ## as hist (question picture)
    

    PS : 也许你需要使用scale_x_discrete 来获得更好的轴外观

    编辑添加渐变填充

    ggplot(dat, aes(x = breaks, y = counts, fill =counts)) + ## Note the new aes fill here
      geom_bar(stat = "identity",alpha = 0.8)+
      xlab("Pearson correlation")+ ylab("Frequency")+
      scale_x_continuous(breaks = seq(-1,1,0.25),
                       labels = seq(-1,1,0.25))+
      scale_fill_gradient(low="blue", high="red")            ## to play with colors limits
    

    【讨论】:

    • @Barry 我更新了我的答案以改变颜色并获得漂亮的比例。
    • @Barry 你说的彩虹色是什么意思?你想要一个颜色栏吗?还是渐变色? 2 是可能的..但我认为你需要阅读 ggplot2 的教程,特别了解 aes 和映射。我相信你会做很多美好的事情。
    • @Barry 很高兴有帮助!但请避免在同一个问题中问很多事情。人们不喜欢这里。
    【解决方案2】:

    如果您的对象rrasterLayer 对象,那么我认为您只需将其转换为数据框,也许是这样:

    rr <- as.data.frame(values(r))
    

    请参阅?getValues,因为您可能需要对该调用稍作改动。在任何情况下,ggplot2 都必须将数据框作为其数据源。

    看起来更近一点,我认为这可以满足您的需求,但如果不转换为 rasterLayer 对象而是绘制您的 y 对象,它实际上更简单。但是我无法使用您链接到的文件(可能是我的错误),因此您必须尝试一下。

    编辑:这是一个有效的例子:

    f <- system.file("external/test.grd", package="raster")
    f
    r <- raster(f)
    rr <- as.data.frame(r)
    str(rr)
    # data is in one particular slot:
    qplot(rr$test)
    

    更多细节:

    str(rr)
    'data.frame':   9200 obs. of  1 variable:
     $ test: num  NA NA NA NA NA NA NA NA NA NA ...
    
    summary(rr)
          test       
     Min.   : 128.4  
     1st Qu.: 293.2  
     Median : 371.4  
     Mean   : 423.2  
     3rd Qu.: 499.8  
     Max.   :1805.8  
     NA's   :6097    
    

    如果这不适合你,我在 2013-01-21 r61719,这是 3.0 RC。也许这就是区别? ggplot2 0.9.3?

    【讨论】:

    • @Bryan ..当我测试您的解决方案时出现错误。 rr$test 到底是什么意思?
    • @Barry qplot 试图尽可能多地读懂你的想法。使用qplot(rr$test),它会查看rr$test 并尝试选择geom 以及x 和y 值。 rr$test 是一个向量,因此它会自动转到几何直方图。在你的命令中,你给了它几乎所有东西,所以它不会试图猜测,也给它 x:qplot(data = rr, x = test, geom = "histogram")
    • @agstudy str(rr) 给出'data.frame': 9200 obs. of 1 variable: $ test: num NA NA NA NA NA NA NA NA NA NA ... 你得到什么错误?
    • @BryanHanson 我得到了同样的结果..我的测试都是 NA ......你怎么能得到一个直方图? ..你能补充一下你对答案的情节吗?
    • 对于我的栅格,我必须使用unlist,例如summary(unlist(as.data.frame(raster$value))),其中value 是数据框列的名称。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2016-04-17
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多