rplotpch

Plot in R not recognizing pch numbers


I am trying to plot in base R with the regular plot() fcn. However, when passing a vector of which pch to use, it will not plot the pch, it will only plot the number '1' instead of the shape of the pch I am calling.

Generating some data (my real data has over 400 rows for both the loads and meta objects:

loads <- data.frame(PC1 = c(11.32, 13.18, 12.82, 24.70), PC2 = c(-23.05,  -24.71, -20.28, 10.09))
row.names(loads) <- c("100_A", "100_B", "100_C", "100_Orig")
meta <- data.frame(pch = c(17, 17, 17, 16), color = c("red", "red", "blue", "blue"))
row.names(meta) <- row.names(loads)

To plot:

x <- loads[, 1] ; y <- loads[, 2]
pch <- meta$pch
col <- meta$color

plot(x, y,
 col = col, pch = pch, cex = 2, lwd = 4,
 xlab = paste("PC1"), ylab = paste("PC2"))

Now, this will graph the correct color (red and blue) in the order I have them in the vector; the real issue becomes the plotting the pch. Instead of a circle (pch = 16) or a triangle (pch = 17) it's plotting a red or blue number 1 instead! I have included a pic of what my data is actually doing. Not recognizing pch code

Thinking that the pch vector I am passing cannot have quotes around it, I have removed the quotes with the following code:

pch <- meta$pch
pch <-as.vector(noquote(pch))
class(pch)
[1] "character"

However, this generates the same results (getting a number 1 plotted). Interestingly, when use this code, it works fine. It turns all my colors to blue, and I get nice blue circles.

plot(x, y,
 col = "blue, pch = 16, cex = 2, lwd = 4,
 xlab = paste("PC1"), ylab = paste("PC2"))

This tells me that the plot function isn't recognizing my long vector composed of pch 16 and 17's mixed in.

Alternatively, if I use the rep function to generate my pch vector, a test shows it works fine. But I have over 400 rows. I cannot manually type rep for each pch. I will be here for eternity typing that out.

Any suggestions on what to do?????


Solution

  • Try defining the col as character and the pch as numeric like this:

    plot(x, y,
         col = as.character(col), pch = as.numeric(pch), cex = 2, lwd = 4,
         xlab = paste("PC1"), ylab = paste("PC2"))