Several customizable plotting options include
pch=
(options are 0 through 25)cex=
lty=
(options are 0 through 6)Example for changing shape
There are 26 available shapes which can be specified (default is 1 a hollow dot)
plot(0:25, pch = 0:25)
Also for the shapes 21-25 the col=
parameter changes the border color and the bg=
changes the inner color
plot(0:25, pch = 0:25, col = "red", bg = "darkblue")
You can also change the size of dots by using cex=
. You give it a relative value, something that has a cex
value of 4 will be twice as big as something that has a cex
value of 2, but the number itself doesn’t mean a size
plot(1:10, cex = 1:10)
When doing line plots, you can change the type of line being drawn by using lty=
There are seven options given by giving lty 0 through 6
number | type of line |
---|---|
0 | blank |
1 | solid |
2 | dashed |
3 | dotted |
4 | dotdash |
5 | longdash |
6 | twodash |
# blank you can't see it
plot(c(0,1), c(0,0), ylim = c(0,6), type="l", lty=0)
# solid (the default)
lines(c(0,1), c(1,1), type="l", lty=1)
# dashed
lines(c(0,1), c(2,2), type="l", lty=2)
# dotted
lines(c(0,1), c(3,3), type="l", lty=3)
# dotdash
lines(c(0,1), c(4,4), type="l", lty=4)
# longdash
lines(c(0,1), c(5,5), type="l", lty=5)
# twodash
lines(c(0,1), c(6,6), type="l", lty=6)
A helpful to add to a plot is the ifelse()
function. You give it three things
What this function does is return a new vector by replacing wherever there are TRUEs in the input with the value for TRUE and wherever there are FALSEs with the value for FALSE
For example
ifelse(c(TRUE,FALSE,TRUE, FALSE), "Replace_TRUE", "Replace_FALSE")
[1] "Replace_TRUE" "Replace_FALSE" "Replace_TRUE" "Replace_FALSE"
This can also work by giving it a logic test on a vector (which will be converted into a vector of TRUEs and FALSEs anyways)
testNumbers = c(1,2,3,4)
testNumbers > 2
[1] FALSE FALSE TRUE TRUE
ifelse(testNumbers >2, "Greater_than_two", "Less_than_two")
[1] "Less_than_two" "Less_than_two" "Greater_than_two" "Greater_than_two"
And you can of course combine logic tests
ifelse(testNumbers >2 & testNumbers < 4, "Greater_than_two_less_than_four", "Less_than_two_or_greater_than_four")
[1] "Less_than_two_or_greater_than_four" "Less_than_two_or_greater_than_four"
[3] "Greater_than_two_less_than_four" "Less_than_two_or_greater_than_four"
This function can be helpful for change colors or shapes of scatter plots to demonstrate thresholds
For example lets look at a scatter plot of 100 randomly generated points with x ranging from -1 to 1 and y ranging from -1 to 1
testNumberData = data.frame(x = runif(100,-1,1), y = runif(100,-1,1))
plot(testNumberData$x, testNumberData$y)
# add a line for x = 0 and y = 0
abline(v = 0)
abline(h = 0)
If you were interested in marking points that have a positive x value you could use ifelse()
with col
along with the package RColorBrewer to color the points differently
install.packages("RColorBrewer")
library(RColorBrewer)
cols = brewer.pal(2, "Dark2")
plot(testNumberData$x, testNumberData$y,
col = ifelse(testNumberData$x > 0, cols[1], cols[2]))
# add a line for x = 0 and y = 0
abline(v = 0)
abline(h = 0)
And if you were interested in marking points that had both a positive x value and a positive y value you could use ifelse()
like this
cols = brewer.pal(2, "Dark2")
plot(testNumberData$x, testNumberData$y,
col = ifelse(testNumberData$x > 0 & testNumberData$y > 0,
cols[1], cols[2]))
# add a line for x = 0 and y = 0
abline(v = 0)
abline(h = 0)
You could also use it to change the shapes as well to mark it even further. Giving hollow dots (pch = 1) to any points with negative values and solid filled in points (pch=16) to points with only positive values
cols = brewer.pal(2, "Dark2")
plot(testNumberData$x, testNumberData$y,
col = ifelse(testNumberData$x > 0 & testNumberData$y > 0,
cols[1], cols[2]),
pch = ifelse(testNumberData$x > 0 & testNumberData$y > 0,
16, 1))
# add a line for x = 0 and y = 0
abline(v = 0)
abline(h = 0)
Now things might get a little messy with too many values if we had a bigger dataset like bellow
cols = brewer.pal(2, "Dark2")
testNumberDataLarge = data.frame(x = runif(2000,-1,1), y = runif(2000,-1,1))
plot(testNumberDataLarge$x, testNumberDataLarge$y,
col = ifelse(testNumberDataLarge$x > 0 & testNumberDataLarge$y > 0,
cols[1], cols[2]),
pch = ifelse(testNumberDataLarge$x > 0 & testNumberDataLarge$y > 0,
16, 1))
# add a line for x = 0 and y = 0
abline(v = 0)
abline(h = 0)