There are a number of issues that make it difficult or impossible to extract any usable information from your scatterplot matrix.
You have too many variables displayed together. When you have lots of variables in a scatterplot matrix, each plot becomes too small to be useful. The thing to notice is that many plots are duplicated, which wastes space. Also, although you do want to see every combination, you don't have to plot them all together. Notice that you can break a scatterplot matrix into smaller blocks of four or five (a number that is usefully visualizable). You just need to make multiple plots, one for each block.

Since you have a lot of data at discrete points in the space, they end up stacking on top of each other. Thus, you cannot see how many points are at each location. There are several tricks to help you deal with this.
- The first is to jitter. Jittering means adding a small amount of noise to the values in your dataset. The noise is taken from a uniform distribution centered on your value plus or minus some small amount. There are algorithms for determining an optimal amount, but since your data come in whole units from one to ten, $.5$ seems like a good choice.
- With so much data, even jittering will make the patters hard to discern. You can use colors that are highly saturated, but largely transparent to account for this. Where there is a lot of data stacked on top of each other, the color will become darker, and where there is little density, the color will be lighter.
- For the transparency to work, you will need solid symbols to display your data, whereas R uses hollow circles by default.
Using these strategies, here is some example R code and the plots made:
# the alpha argument in rgb() lets you set the transparency
cols2 = c(rgb(red=255, green=0, blue=0, alpha=50, maxColorValue=255),
rgb(red=0, green=0, blue=255, alpha=50, maxColorValue=255) )
cols2 = ifelse(breast$class==2, cols2[1], cols2[2])
# here we jitter the data
set.seed(6141) # this makes the example exactly reproducible
jbreast = apply(breast[,1:9], 2, FUN=function(x){ jitter(x, amount=.5) })
jbreast = cbind(jbreast, class=breast[,10]) # the class variable is not jittered
windows() # the 1st 5 variables, using pch=16
pairs(jbreast[,1:5], col=cols2, pch=16)

windows() # the 2nd 5 variables
pairs(jbreast[,6:10], col=cols2, pch=16)

windows() # to match up the 1st & 2nd sets requires more coding
layout(matrix(1:25, nrow=5, byrow=T))
par(mar=c(.5,.5,.5,.5), oma=c(2,2,2,2))
for(i in 1:5){
for(j in 6:10){
plot(jbreast[,j], jbreast[,i], col=cols2, pch=16,
axes=F, main="", xlab="", ylab="")
box()
if(j==6 ){ mtext(colnames(jbreast)[i], side=2, cex=.7, line=1) }
if(i==5 ){ mtext(colnames(jbreast)[j], side=1, cex=.7, line=1) }
if(j==10){ axis(side=4, seq(2,10,2), cex.axis=.8) }
if(i==1 ){ axis(side=3, seq(2,10,2), cex.axis=.8) }
}
}
