Как я могу добавить строку в мой xyplot на основе среднего значения атрибута моих данных? - PullRequest
0 голосов
/ 05 мая 2019

Я создал базовый граф, который мне нужен, и я просто не могу понять, как добавить линию к графику на основе среднего значения атрибута убийства в наборе данных USArrests.После этого мне также нужно раскрасить имена состояний, основываясь на том, находятся ли они выше или ниже линии.

График, который у меня есть: https://ibb.co/V3VkYt4

График, который мне нужен: https://ibb.co/4TTnQM1

Я попытался добавить аблайн с атрибутом Murder, означающим в качестве входных данных, и линия появляется за пределами моего графика, не зная, что я делаю неправильно.

library(lattice)
textPlot <- function()
{
  data <- cbind(rownames(USArrests), USArrests)
  names(data) <- c("State", names(data)[2:5])

averageM <- mean(USArrests$Murder)

         xyplot(Murder~UrbanPop, data, 
         groups=State, panel=drawText, 
         main="Murder vs. Urban Population")

}

drawText <- function(x,y,groups,...)
  {
    panel.text(x=x,y=y,label=groups,cex=y/10)
}   

1 Ответ

1 голос
/ 06 мая 2019

Ваш график отображает наклонную линию регрессии, а не горизонтальную линию для среднего значения. Решетка может добавить линию регрессии в xyplot непосредственно из переменных с panel.lmline или из регрессионной модели (или константы) с panel.abline. Требуется немного больше работы, чтобы классифицировать государства, которые выше или ниже выбранного уровня убийств. Вот один из способов сделать это с решеткой, показывающей оба типа линий регрессии.

# Load the lattice package, create data.frame with state names from USAarrests
  library(lattice)
  df <- data.frame(State = rownames(USArrests), USArrests)

# Determine regression and mean murder rate outside of xyplot()
# However, these operations don't have to be done outside of the lattice function
  fm <- lm(Murder ~ UrbanPop, df)
  averageM <- mean(USArrests$Murder)

# Add a variable to the data.frame indicating the classification
  df$type <- factor(ifelse(df$Murder < fm$fitted, "low", "high"))

# Plot via lattice with explicit panel() function
  xyplot(Murder ~ UrbanPop, data = df,
    panel = function(x, y, ...) {
      panel.abline(fm, col = "red", lwd = 2)
#     panel.lmline(x, y, col = "red", lwd = 2) # This would do the same
      panel.abline(h = averageM, col = "red", lty = 2, lwd = 2)
#     panel.abline(h = mean(y), col = "red", lty = 2, lwd = 2) # This would do the same
      panel.text(x, y, labels = df$State, cex = y/10, col = c(2,4)[df$type])
    }
  )
...