首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从ggplot2图生成栅格

从ggplot2图生成栅格
EN

Stack Overflow用户
提问于 2013-10-30 09:24:26
回答 1查看 2.2K关注 0票数 3

我正在处理一个图,我需要以某种方式应用一个独特的回归。该图是放置在对数-对数轴上的一系列点。对于任何熟悉水文学的人来说,我正在尝试以图形方式产生一个瞬态泰斯解,因此我的回归需要以指数积分的形式(请参阅此Wikipedia page)。

这里值得注意的是,指数积分有它自己的一组轴值,这些轴值独立于初始图。这就是从数据中提取解决方案的方式,但在尝试在R中重现解决方案时,它会引入许多问题。

我已经想出了一些想法来解决这个问题(除了使用铅笔和纸),但每种方法都遇到了一些小问题。如果您能深入了解这些解决方案中的任何一个,我将不胜感激:

  1. 使用stat_smooth将回归添加到图中,根据其斜率任意选择回归上的点,然后将其关联到具有指数积分适当轴的新图的相同斜率。这里的问题是,我不确定如何将stat_smoothy ~ xy ~ poly(x, 2)y ~ log(x)的变体以外的公式一起使用。回归会调用poly和log函数的组合,但当我尝试这样做时,R会出现问题。例如:

Stat_smooth(数据=示例,方法= "lm",公式=y~/4(X)+x- poly(x,2)/4 + poly(x,3)/18 -...

  • 我还尝试将数据和指数积分绘制为两个单独的图,然后基于我任意认为最适合的位置将这两个图重叠(这可能是更简单的方法,并且对我的目的来说已经足够精确)。为了便于叠加,我剥离了指数积分图的背景、轴、网格线等,只留下一条带有标签的水平线和垂直线,以指示曲线上具有某些值的点。如果我可以把这个放在另一个图的上面(当然,假设两个图保持相同的大小比例),我想我可以推动回归,直到它排在我认为应该排成一行的地方,然后根据水平和垂直标签线的存在读出相应的值。

我读过一些关于annotation_raster的文章,我认为这可能是一种将回归视为叠加图像的合适方式。不过,我的问题是首先要将ggplot绘图转换为栅格。as.raster()会产生以下错误:

As.raster(栅格)中出错:在为函数'as.raster‘选择方法时对参数'x’求值时出错: UseMethod("as.raster")中出错:没有适用于“as.raster”的方法应用于类"c('gg','ggplot')“的对象

如果我尝试使用raster软件包并使用raster()函数转换绘图,也会出现类似的错误。有没有简单的方法可以做到这一点?

下面是一些可重现的代码:

代码语言:javascript
复制
library(ggplot2)

Data = data.frame(matrix(
    # Elapsed_sec  Drawdown_ft
    c(20,  0.0038,
      40,  0.0094,
      60,  0.017,
      80,  0.0283,
      100, 0.0358,
      120, 0.0415,
      140, 0.049,
      160, 0.0528,
      180, 0.0548,
      200, 0.0567), nrow = 10, ncol = 2, byrow = TRUE))
colnames(Data) = c("Elapsed_sec", "Drawdown_ft")

Integral = data.frame(matrix(
    # u     W_u
    c(1e-3, 6.33,
      5e-3, 4.73,
      1e-2, 4.04,
      5e-2, 2.47,
      1e-1, 1.82,
      5e-1, 0.56,
      1e0,  0.219,
      2e0,  0.049,
      3e0,  0.013,
      4e0,  0.0038,
      5e0,  0.0011,
      6e0,  0.00036), nrow = 12, ncol = 2, byrow = TRUE))
colnames(Integral) = c("u", "W_u")

# Plot exponential integral (Theis curve)
Tcurve = ggplot(Integral, aes(1/u, W_u)) + geom_line() +
    scale_x_log10(limits = c(10^-1, 10^3), breaks = c(10^-1, 10^0,  10^1,  10^2, 10^3)) +
    scale_y_log10(limits = c(10^-3, 10^1), breaks = c(10^-3, 10^-2, 10^-1, 10^0, 10^1)) +
    xlab("1/u") + ylab("W(u)") + coord_equal() +
    geom_hline(aes(yintercept = 0.219), linetype = 2) +
    geom_vline(aes(xintercept = 1),     linetype = 2) +
    geom_text(color = "black", size = 3, aes(x = 0.3, y = 0.3,  label = "W(u) = 0.219")) +
    geom_text(color = "black", size = 3, aes(x = 0.8, y = 0.01, label = "u = 1"), angle = 90) +
    theme(line = element_blank(), text = element_blank(), panel.background = element_rect(fill = NA))

# Plot drawdown data
plot = ggplot(Data, aes(Elapsed_sec, Drawdown_ft)) + geom_point(alpha = 0.5, size = 1) +
    scale_x_log10(limits = c(10^0,  10^4), breaks = c(10^0,  10^1,  10^2,  10^3, 10^4)) +
    scale_y_log10(limits = c(10^-3, 10^1), breaks = c(10^-3, 10^-2, 10^-1, 10^0, 10^1)) +
    xlab("Elapsed Time (sec)") + ylab("Drawdown (ft)") + coord_equal() + theme_bw()

我会上传图片,但我目前缺乏最低的声誉。第一张图显示了指数积分,而第二张图显示了我试图将积分拟合到的数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-16 19:46:52

这个问题已经发布了五年了,但我想我应该分享我的想法。您可以将ggplot转换为raster对象,如下所示:

  1. 使用ggsave
  2. Create将ggplot绘图保存为任何格式的图像文件(我会使用tiff)使用raster对象保存保存的图像使用raster (或stack保存彩色图像)

以上内容的实现如下:

代码语言:javascript
复制
# You may need to remove the margins from the plot (i.e., keep the earth raster and the routes only)
plot <- plot+ 
  theme(    
        axis.ticks=element_blank(), 
        axis.text.x=element_blank(), 
        axis.text.y=element_blank(), 
        axis.title.x=element_blank(), 
        axis.title.y=element_blank(),
        plot.margin = unit(c(0, 0, 0, 0), "null"),
        legend.position = 'none'
       ) +
       labs(x=NULL, y=NULL)

# Save the plot
ggsave(plot=plot, "my_ggplot.tiff", device = "tiff")

# Create a StackedRaster object from the saved plot
raster <- raster("my_ggplot.tiff") # OR stack("my_ggplot.tiff") for colored images

# Get the GeoSpatial Components
lat_long <- ggplot_build(plot)$layout$panel_params[[1]][c("x.range","y.range")] 

# Supply GeoSpatial  data to the StackedRaster 
extent(raster) <- c(lat_long$x.range,lat_long$y.range)
projection(raster) <- CRS("+proj=longlat +datum=WGS84")


# Then, do whatever you want with the raster object here

希望能有所帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19672186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档