Существует ряд проблем, которые затрудняют или делают невозможным извлечение полезной информации из матрицы рассеяния.
У вас слишком много переменных отображаются вместе. Когда в матрице диаграммы рассеяния имеется много переменных, каждый график становится слишком маленьким, чтобы быть полезным. Стоит заметить, что многие участки дублируются, что приводит к пустой трате места. Кроме того, хотя вы хотите видеть каждую комбинацию, вам не нужно наносить их все вместе. Обратите внимание, что вы можете разбить матрицу диаграммы рассеяния на более мелкие блоки из четырех или пяти (число, которое полезно визуализировать). Вам просто нужно сделать несколько участков, по одному на каждый блок.
Поскольку у вас есть много данных в отдельных точках пространства , они в конечном итоге накладываются друг на друга. Таким образом, вы не можете увидеть, сколько точек в каждом месте. Есть несколько приемов, которые помогут вам справиться с этим.
- Первое - это дрожать . Дрожание означает добавление небольшого количества шума к значениям в вашем наборе данных. Шум берется из равномерного распределения с центром на вашем значении плюс или минус небольшое количество. Существуют алгоритмы определения оптимального количества, но, поскольку ваши данные поступают целыми единицами от одного до десяти, кажется хорошим выбором. .5
- При таком большом количестве данных даже дрожание затруднит различение скороговорок. Вы можете использовать цвета, которые очень насыщенные, но в основном прозрачные, чтобы учесть это. Там, где много данных складывается друг на друга, цвет становится темнее, а там, где плотность невелика, цвет будет светлее.
- Чтобы прозрачность работала, вам понадобятся сплошные символы для отображения ваших данных, тогда как R по умолчанию использует пустые кружки.
Используя эти стратегии, вот несколько примеров кода R и построенных графиков:
# 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) }
}
}