R:绘制 Moran 我在 ggplot 中绘制

Pet*_*etr 1 plot r ggplot2

直升机我想问一下如何CLASIC [R转换plotggplot,所以它看起来更好,在我的情况,我想绘制MORAN我情节ggplot。

例子:

library(spdep)

data(afcon, package="spData")
moran.plot(afcon$totcon, nb2listw(paper.nb))
Run Code Online (Sandbox Code Playgroud)

Rom*_*ain 5

这不是立即操作。您可以查看代码moran.plot以找出生成莫兰图所需的所有操作。我把它们堆在这里(如果你运行下面的代码,你最终会得到相同的情节):

library(spdep)
data(afcon, package="spData")

x <- afcon$totcon
listw <- nb2listw(paper.nb)
wx <- lag.listw(listw, x, zero.policy = NULL)
xwx.lm <- lm(wx ~ x)
infl.xwx <- influence.measures(xwx.lm)
is.inf <- which(apply(infl.xwx$is.inf, 1, any))

labels <- as.character(attr(listw, "region.id"))
xlab <- "afcon$totcon"
ylab <-  paste("spatially lagged", xlab)

plot(x, wx, xlab=xlab, ylab=ylab)
abline(xwx.lm)
abline(h = mean(wx), lty = 2)
abline(v = mean(x), lty = 2)
points(x[is.inf], wx[is.inf], pch = 9, cex = 1.2)
text(x[is.inf], wx[is.inf], labels = labels[is.inf], 
     pos = 2, cex = 0.7)
Run Code Online (Sandbox Code Playgroud)

所以我建议将这些操作分成两个步骤:准备数据然后绘制它。第一个函数将是某种形式

library(dplyr)

prepare_data <- function(data, x, listw){
  # prepare a dataframe with variables x and wx, from the x and listw arguments
  # this dataframe will be the base data for the ggplot() call
  plot_data <- data %>% 
    mutate(
      x = !!enquo(x),
      wx = lag.listw(listw, x, zero.policy = NULL),
      label = as.character(attr(listw, "region.id"))
    ) %>% 
    select(x, wx, label)

  # Prepare other needed objects that don't fit into a dataframe
  xwx.lm <- lm(plot_data$wx ~ plot_data$x)
  infl.xwx <- influence.measures(xwx.lm)

  # add non variables objects as attributes
  attr(plot_data, which = "is.inf") <- which(apply(infl.xwx$is.inf, 1, any))
  attr(plot_data, which = 'xwx.lm') <- xwx.lm

  return(plot_data)
}

moran_plot_data <- prepare_data(afcon, totcon, nb2listw(paper.nb))
Run Code Online (Sandbox Code Playgroud)

这给你所有的情节所需要的对象:xwxlabel变量,is.infxwx.lm对象作为属性。然后你可以用这个对象构建一个 ggplot。您需要使用以下 ggplot2 函数(下面的代码很少,您必须添加标签、样式和内容):

library(ggplot2)

inf_data <- moran_plot_data[attr(moran_plot_data, "is.inf"), ]

ggplot() + 
    geom_point(data = plot_data, mapping = aes(x, y)) + # equivalent of plot(x, wx, xlab=xlab, ylab=ylab)
    geom_abline("wxw.lm coefficients used here") +  
    geom_hline("mean(wx) used here") +
    geom_vline("mean(x) used here") +
    geom_point(data = inf_data, mapping = aes(x, y)) + 
    geom_text(data = inf_data, mapping = aes(x, y, label) +
    labs(x = "x variable", y = "Spatially lagged x variable") +
    theme("use this function to customise appearence")
Run Code Online (Sandbox Code Playgroud)

请随意广泛查看ggplot2 指南,以帮助您使用这些功能。