R: заговор Морана I в ggplot - PullRequest
       3

R: заговор Морана I в ggplot

1 голос
/ 05 января 2020

Helo Я хотел бы спросить, как конвертировать clasi c R plot в ggplot, чтобы он выглядел лучше, в моем случае я хотел бы построить MORAN I plot в ggplot.

пример :

library(spdep)

data(afcon, package="spData")
moran.plot(afcon$totcon, nb2listw(paper.nb))

1 Ответ

4 голосов
/ 05 января 2020

Это не немедленная операция. Вы можете посмотреть на код 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)

Поэтому я бы предложил разделить эти операции на два этапа: затем подготовить данные замышляя это. Первая функция будет иметь вид

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

. Это дает вам весь необходимый объект для графика: x, wx и label переменные, is.inf и xwx.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")

Не стесняйтесь, чтобы подробно рассмотреть Руководство ggplot2 поможет вам с этими функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...