R - S3 Методы - Построение - PullRequest
       6

R - S3 Методы - Построение

0 голосов
/ 14 ноября 2018

Мне поручено написать метод S3, который строит два графика, где

  1. Пользователь выбирает цвета для линий на графике 1.
  2. Пользователь выбирает цвета для максимума на графике2.
  3. Пользователь может выбрать, существуют точки или нет.

У меня проблемы с 3.

Пример данных

date <- seq(as.Date("2018/1/1"), as.Date("2018/1/10"), "days")
rain <- sample(x = 0:25, size  = 10)
max <- sample(x = 10:25, size  = 10)
min <- sample(x = 5:15, size  = 10)
example <-  data.frame(date, rain, max, min)
class(example) <- c("Weather", class(example)) 
class(example)

Ниже воспроизводится мой график.Может кто-нибудь помочь мне разобраться, как добавить в этот код, чтобы пользователь мог включать и выключать #OPTIONAL POINTS

plot.Weather <- function(x, colpick1, colpick2, colpick3) {

    ##TEMP PLOT
    par(mfrow=c(2,1)) 
    #Plotting maxtp with title
    plot(x[, 1], x[, 3], 
        main = "Temperatures",
        type = "l", frame = FALSE, 
        col = colpick1, 
        xlab = "Date", ylab = expression(paste("Temperature [",degree,"C]")), 
        xlim = c(min(x[, 1]), max(x[, 1])), ylim = c(0,30))
    #Add a second line
    lines(x[, 1], x[, 4], type = "l", col = colpick2, xlab = "date", ylab = "temp")+
    #Verical dotted lines
    abline(v =x[, 1], lty=3, col="grey")

    #OPTIONAL POINTS
    ##Adding max and min points
    points(x[, 1][which.max(x[, 3])], max(x[, 3]), col = colpick1, pch = 20 ) 
    points(x[, 1][which.min(x[, 4])], min(x[, 4]), col = colpick2, pch = 20 ) 
    #adding text
    text(x[, 1]+0.5, x[, 3]+1, labels = ifelse(x[, 3] == max(x[, 3]), 'Max', NA ), cex= 0.9) 
    text(x[, 1]-0.5, x[, 4]-1, labels = ifelse(x[, 4] == min(x[, 4]), 'Min', NA ), cex= 0.9)



    ##RAINPLOT
    #Plotting maxtp with title
      plot(x[, 1], x[, 2], 
      type = "h", frame = FALSE, 
      col = ifelse(x[, 2] == max(x[, 2]), colpick3, "green"), 
      xlab = "Date", ylab = "Percipitation", 
      xlim = c(min(x[, 1]), max(x[, 1])), ylim = c(0,25))

  }

plot.Weather(example, "red", "blue", "red")

Заранее спасибо,

Шон

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Теперь я понимаю, что вы хотите сделать, я думаю.Как насчет этого:

plot.Weather <- function(x, colpick1, colpick2, colpick3, options = "YES") {

  ##TEMP PLOT
  par(mfrow=c(2,1)) 
  #Plotting maxtp with title
  plot(x[, 1], x[, 3], 
       main = "Temperatures",
       type = "l", frame = FALSE, 
       col = colpick1, 
       xlab = "Date", ylab = expression(paste("Temperature [",degree,"C]")), 
       xlim = c(min(x[, 1]), max(x[, 1])), ylim = c(0,30))
  #Add a second line
  lines(x[, 1], x[, 4], type = "l", col = colpick2, xlab = "date", ylab = "temp")+
    #Verical dotted lines
    abline(v =x[, 1], lty=3, col="grey")

  if (options == "YES"){
  #OPTIONAL POINTS
  ##Adding max and min points
  points(x[, 1][which.max(x[, 3])], max(x[, 3]), col = colpick1, pch = 20 ) 
  points(x[, 1][which.min(x[, 4])], min(x[, 4]), col = colpick2, pch = 20 ) 
  #adding text
  text(x[, 1]+0.5, x[, 3]+1, labels = ifelse(x[, 3] == max(x[, 3]), 'Max', NA ), cex= 0.9) 
  text(x[, 1]-0.5, x[, 4]-1, labels = ifelse(x[, 4] == min(x[, 4]), 'Min', NA ), cex= 0.9)
  }


  ##RAINPLOT
  #Plotting maxtp with title
  plot(x[, 1], x[, 2], 
       type = "h", frame = FALSE, 
       col = ifelse(x[, 2] == max(x[, 2]), colpick3, "green"), 
       xlab = "Date", ylab = "Percipitation", 
       xlim = c(min(x[, 1]), max(x[, 1])), ylim = c(0,25))

}

plot.Weather(example, "red", "blue", "red")

Я только что обернул ваш код #OPTIONAL POINTS в оператор if, который будет выполняться, если options == "YES" в аргументах функции.Если options = что-то отличное от "YES", это ничего не изменит.Я оставлю другой ответ на всякий случай.Ура!

0 голосов
/ 14 ноября 2018

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

library(tidyverse)
example_options <- example %>% 
  mutate(min_exclude = ifelse(min >= 13, "NA", min),
         max_exclude = ifelse(max >= 10, "NA", max),
         rain_exclude = ifelse(rain>= 12, "NA", rain))

plot(example_options$min_exclude)
plot(example_options$min)

Значения «NA» не были нанесены, и вы можете изменить условия ifelse, чтобы выбрать точки данных, которые вы хотите опустить.

Приведенный выше код может быть дополнен функцией case_when вместо ifelse, если вы хотите перейти на чистый угол и вот базовое решение r для того же:

example_options_1 <- example
example_options_1$min_exclude = ifelse(example$min >= 13, "NA", min)
example_options_1$max_exclude = ifelse(example$max >= 10, "NA", max)
example_options_1$rain_exclude = ifelse(example$rain >= 12, "NA", rain)
example_options_1

Или вы можете использовать такой функциональный подход:

options_func <- function(df, col_no, row_no){
  df[row_no, col_no] <- "NA"
  df
}
example2 <- options_func(df = example, col_no = c("min"), row_no = c(3,5))
example2

Здесь вы можете выбрать переменную (и) или положение (я) столбца col_no = "min" или col_no = c("min", "max"), col_no = c(3,4), а также положение строки и заменить их на "NA". При необходимости можно сделать функцию более универсальной.

Ура!

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