1

I am using cchart.p function of IQCC package to generate p-charts, but title of the graph is "Standardized p-chart (phase II)". I want to change the title and axes label names.

Code tried:

library(IQCC)

#get arguments
args <- commandArgs(TRUE)
pdfname <- args[1]
datafile <- args[2]

pdf(pdfname)
tasks <- read.csv(datafile , header = T,sep=",")
p <- cchart.p(x1 = tasks$x, n1 = tasks$y,phat = 0.02)
print(p)
dev.off()

Any function or package I can use with it?

How I can use with ggplot2 package?

Artem
  • 3,304
  • 3
  • 18
  • 41
henna
  • 368
  • 3
  • 13
  • I believe the authors of that function wrote it in such a way that it does not accept additional arguments passed on to `par` to set things like the title, x axis label, etc. It would be fairly straightforward, though, to create your own version that does by modifying the code slightly. – joran Feb 02 '12 at 06:18
  • @joran true its was really easy once i got source code. I just made my function to generate p graph. many thanks. – henna Feb 07 '12 at 22:15

1 Answers1

0

In IQCC package the function cchart.p does not permit arguments to change title and/or axis labels. However you can modify cchart.p code itself. In the body of the function there are calls for qcc function, which has argument to change title and axes labels. Please see the code below for modified cchart.p (the changes for title and labels are indicated by comments):

cchart.p2 <- function (x1 = NULL, n1 = NULL, type = "norm", p1 = NULL, x2 = NULL, 
                       n2 = NULL, phat = NULL, p2 = NULL) 
{
  if ((!is.null(n1)) && (!is.null(x1) || !is.null(p1))) 
    OK1 = TRUE
  else OK1 = FALSE
  if (!is.null(n2) && (!is.null(x2) || !is.null(p2)) && (OK1 || 
                                                         !is.null(phat))) 
    OK2 = TRUE
  else OK2 = FALSE
  if (!OK1 && !OK2) {
    if (is.null(x1) && is.null(n1) && is.null(p1)) 
      return("Phase I data and samples sizes are missing")
    else {
      if (is.null(n1)) 
        return("Phase I samples sizes not specified")
      else return("Phase I data is missing")
    }
  }
  if (!OK2) {
    if (is.null(n2) && (!is.null(x2) || !is.null(p2))) 
      return("Phase II samples sizes not specified")
    if (!is.null(n2) && (is.null(x2) && is.null(p2))) 
      return("Phase II data is missing")
    if (!is.null(x2) && !is.null(n2) && !is.null(p2)) 
      return("Information about phase I is missing")
  }
  if (OK1 && !OK2) {
    if (!is.null(x1)) {
      m1 <- length(x1)
      if (length(n1) != length(x1)) 
        return("The arguments x1 and n1 must have the same length")
    }
    if (!is.null(p1)) {
      m1 <- length(p1)
      if (length(n1) != length(p1)) 
        return("The arguments p1 and n1 must have the same length")
    }
    if (is.null(p1)) 
      p1 <- x1/n1
    if (is.null(x1)) 
      x1 <- p1 * n1
    phat <- mean(p1)
    l <- matrix(nrow = m1, ncol = 1)
    if (type == "norm") {
      u <- matrix(nrow = m1, ncol = 1)
      for (i in 1:m1) {
        UCL <- phat + (3 * sqrt((phat * (1 - phat))/n1[i]))
        u[i, ] <- UCL
        LCL <- phat - (3 * sqrt((phat * (1 - phat))/n1[i]))
        l[i, ] <- LCL
      }
      ############## Customized title and axes labels ############################
      return(qcc(x1, type = "p", n1, limits = c(l, u), center = phat, 
          title = "Custom Title", xlab = "Custom X", ylab = "Custom Y"))
      #########################################################################

    }
    if (type == "CF") {
      u <- matrix(nrow = m1, ncol = 1)
      for (i in 1:m1) {
        UCL <- phat + (3 * sqrt((phat * (1 - phat))/n1[i])) + 
          (4 * (1 - 2 * phat)/(3 * n1[i]))
        u[i, ] <- UCL
        LCL <- phat - (3 * sqrt((phat * (1 - phat))/n1[i])) + 
          (4 * (1 - 2 * phat)/(3 * n1[i]))
        l[i, ] <- LCL
      }
      qcc(x1, type = "p", n1, limits = c(l, u), center = phat, 
          title = "Cornish-Fisher p-chart (phase I)")
    }
    if (type == "std") {
      for (i in 1:m1) {
        z <- (p1[i] - phat)/sqrt((phat * (1 - phat))/n1[i])
        l[i, ] <- z
      }
      std <- l * n1
      qcc(std, type = "p", n1, center = 0, limits = c(-3, 
                                                      3), title = "Standardized p-chart (phase I)")
    }
  }
  if (OK2) {
    if (!is.null(x2)) {
      m2 <- length(x2)
      if (length(n2) != length(x2)) 
        return("The arguments x2 and n2 must have the same length")
    }
    if (!is.null(p2)) {
      m2 <- length(p2)
      if (length(n2) != length(p2)) 
        return("The arguments p2 and n2 must have the same length")
    }
    if (is.null(p2)) 
      p2 <- x2/n2
    if (is.null(x2)) 
      x2 <- p2 * n2
    if (is.null(phat)) {
      if (is.null(p1)) 
        p1 <- x1/n1
      phat <- mean(p1)
    }
    l <- matrix(nrow = m2, ncol = 1)
    if (type == "norm") {
      u <- matrix(nrow = m2, ncol = 1)
      for (i in 1:m2) {
        UCL <- phat + (3 * sqrt((phat * (1 - phat))/n2[i]))
        u[i, ] <- UCL
        LCL <- phat - (3 * sqrt((phat * (1 - phat))/n2[i]))
        l[i, ] <- LCL
      }
      qcc(x2, type = "p", n2, limits = c(l, u), center = phat, 
          title = "Shewhart p-chart (phase II)")
    }
    if (type == "CF") {
      u <- matrix(nrow = m2, ncol = 1)
      for (i in 1:m2) {
        UCL <- phat + (3 * sqrt((phat * (1 - phat))/n2[i])) + 
          (4 * (1 - 2 * phat)/(3 * n2[i]))
        u[i, ] <- UCL
        LCL <- phat - (3 * sqrt((phat * (1 - phat))/n2[i])) + 
          (4 * (1 - 2 * phat)/(3 * n2[i]))
        l[i, ] <- LCL
      }
      qcc(x2, type = "p", n2, limits = c(l, u), center = phat, 
          title = "Cornish-Fisher p-chart (phase II)")
    }
    if (type == "std") {
      for (i in 1:m2) {
        z <- (p2[i] - phat)/sqrt((phat * (1 - phat))/n2[i])
        l[i, ] <- z
      }
      std <- l * n2
      qcc(std, type = "p", n2, center = 0, limits = c(-3, 
                                                      3), title = "Standardized p-chart (phase II)")
    }
  }
}

The excerpt below shows the only part which is changed in the function cchart.p2 in comaprison with initial function cchart.p:

 ############## Customized title and axes labels + qcc object return from the function (for further use in ggplot2) ############################
  return(qcc(x1, type = "p", n1, limits = c(l, u), center = phat, 
      title = "Custom Title", xlab = "Custom X", ylab = "Custom Y"))
  #########################################################################

Then you can call the modified function:

library(qcc)
data(binomdata)
cc <- cchart.p2(x1 = binomdata$Di[1:12], n1 = binomdata$ni[1:12], phat = 0.02, type = "norm")

And get desired output: enter image description here

As for ggplot2 usage, you need to extract information about upper & lower control limits and central line from qcc object. Please see the code below.

library(ggplot2)
df <- data.frame(gr = as.numeric(row.names(cc$data)), 
                value = cc$statistics,
                cc$limits,
                CL = cc$center)

ggplot(df, aes(gr, value)) +
  geom_point() +
  geom_line(group = 1) +
  geom_step(aes(gr, LCL., group = 1)) +
  geom_step(aes(gr, UCL, group = 1)) +
  geom_line(aes(gr, CL, group = 1))

Output:

enter image description here

Artem
  • 3,304
  • 3
  • 18
  • 41