有什么方法可以在一张图中绘制t = 300、350、450和500条线吗?

时间:2020-05-07 05:47:00

标签: r ggplot2 plot ecdf

enter image description here我想在一张图中绘制多条线,但是我不知道要使用哪个代码。另外,有没有办法为每条线分配颜色?这是Rstudio的新手,被分配来接管某人的工作,因此我一直在做很多次反复试验,但是过去几天我一直不走运。希望有人可以帮助我!非常感谢


ecdf.shift <- function(OUR_threshold, des_cap = 40, nint = 10000){

  #create some empty vectors for later use in the loop

  ecdf_med = c() 
  ecdf_obs = c()

  for (i in 1:length(OUR_threshold)){

    # filter out the OUR threshold data, then select only the capture column and create a ecdf function

    ecdf_fun <- HRP_rESS_no %>% 
      filter(ESS > OUR_threshold[i]) %>%
      .$TSS_con %>%
      ecdf()

    # extract the ecdf data and put in tibble dataframe, then create a linear interpolation of the curve. 

    ecdf_data <- tibble(TSS_con = environment(ecdf_fun)$x, prob = environment(ecdf_fun)$y)
    ecdf_interpol <- approx(x = ecdf_data$TSS_con, y = ecdf_data$prob, n = nint)

    # find the vector numbers in x which correspond with the desired capture. Then find correlate the vectornumbers with probability numbers in the y vectors. Take the median value in case multiple hits. Put this number in a vector with designed vectornumber as ditacted by the loopnumber i. 



    ecdf_med[i] <- median(ecdf_interpol$y[(round(ecdf_interpol$x,1) == des_cap)])



    # calculate the number of observations when the filtering takes place. 

    ecdf_obs[i] <- HRP_rESS_no %>% 
      filter(ESS > OUR_threshold[i]) %>%
      .$TSS_con %>%
      length()

    # Flush the ecdf data. The ecdf is encoded as a function with global paramaters, so you want to reset them everytime the loop is done to avoid pesky bugs to appear. 

    rm(ecdf_data)
  }

  #create a tibble dataframe with all the loop data. 

  ecdf_out <- tibble(OUR_ratio_cutoff = OUR_threshold, prob = (ecdf_med)*100, nobs = ecdf_obs)



  return(ecdf_out)

}

ratio_threshold <- seq(0,115, by = 5)
t = ecdf_MLSS_target <- 400 %>% 
 ecdf.shift(ratio_threshold, .) %>% 
  filter(nobs > 2) %>%
  ggplot(aes( x = OUR_ratio_cutoff, y = prob)) + 
  geom_line() + 
  geom_point() + 
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank()) +
  scale_y_continuous(limits = c(0,100), 
                     breaks = seq(0,300, by = 5), 
                     expand = c(0,0)) +
  scale_x_continuous(limits = c(0,120), 
                     breaks = seq(0,110, by = 10), 
                     expand = c(0,0)) +
  labs(x = "ESS mg TSS/L",
       y = "Probability of contactor MLSS > 400 mg TSS/L ")




plot(t)

1 个答案:

答案 0 :(得分:0)

最简单的方法是首先遍历不同的t值,然后将结果数据帧放入一个大数据帧,然后将其用于绘图。您的代码不是完全可复制的(它需要我们没有的数据,即HRP_rESS_no)。因此,我将功能简化为核心-创建一个数据框,该框根据您的t值生成不同的“行”。我只是用它作为斜坡。

我希望这个主意很清楚。

library(tidyverse)

ecdf.shift <- function(OUR_threshold, t) {
  data.frame(x = OUR_threshold, y = t * OUR_threshold)
}

ratio_threshold <- seq(0, 115, by = 5)

t_df <-
  map(1:5, function(t) ecdf.shift(ratio_threshold, t)) %>%
  bind_rows(, .id = "t")

ggplot(t_df, aes(x, y, color = t)) +
  geom_line() +
  geom_point()

reprex package(v0.3.0)于2020-05-07创建

相关问题