R ggplot сетка из прямоугольников, границы сверху, снизу, слева направо, отдельные цвета

Я пытаюсь сделать изображение, как показано ниже (сгенерированный в MATLAB) в R. SOM ANN изображение сетки

Мне нужно использовать ggplot, потому что мне нужно добавить прямоугольники в "сетку" один за другим и установить фон каждого прямоугольника в соответствии с матрицей, имеющей интенсивности от 0 до 1. Сейчас у меня есть фрейм данных со всеми интенсивности для прямоугольников (атрибут плотности) и границ прямоугольников (вершины, левые, правые, нижние, верхние левые и т. д.). Ссылка на мой полный R-скрипт, который определяет все переменные, на которые есть ссылки в приведенном ниже определении кадра данных, можно найти здесь (отредактированная версия): http://pastebin.com/JUUmnTSq.

g <- ggplot()
df <- data.frame(
  x = c(1:somPEs),
  y = c(1:somPEs),
  density = hm2/max(hm2),
  tops = fence_edges[,1],
  bottoms = fence_edges[,2],
  lefts = fence_edges[,3],
  rights = fence_edges[,4],
  top.lefts = fence_diagonals[,1],
  top.rights = fence_diagonals[,2], 
  bottom.lefts = fence_diagonals[,3], 
  bottom.rights = fence_diagonals[,4]
)
ggplot() +
  geom_rect() +     <- the redscaled rectangles 
  geom_segment() +  <-- the grayscaled borders on the rectangles
  geom_line()       <-- the green scatter plots connected by lines

Обратите внимание, что "top.lefts, top.rights" и т. Д. Являются диагональными значениями "pixel". По сути, это визуальное изображение самоорганизующейся карты для обучения без участия нейронной сети. Я просто не знаю, как заполнить методы geom_*() для ggplot, используя информацию о фрейме данных.

Может ли кто-нибудь помочь мне сделать это? Ggplot ОЧЕНЬ сложно освоить, и я не могу найти, как получить прямоугольники для добавления к тому же графику, используя обычные функции rect(), plot(), сегментов () и т. Д.

Спасибо за любую помощь, которую вы можете предложить!

Обновление: вот мой прогресс, основанный на удалении названий "тем" и "фасеток" ниже. По сути, все, что я хочу сейчас, - это способность затенять границы в зависимости от интенсивности, которую я указываю. Есть идеи?

# Plot
require(ggplot2)
mxW = max(max(max(w)));
deltax = 1/inputPEs;
hm2 <- as.vector(matrix(hm, byrow=TRUE))  
it=1;
# Reshape w to a 3D matrix of dimension: c(sqrt(somPEs), sqrt(somPEs), inputPEs)
dim(w) <- c(sqrt(somPEs), sqrt(somPEs), inputPEs)
w <- aperm(w, c(2, 1, 3))

df <- data.frame(
  somPEs = c(1:somPEs),      
  xp = do.call(rbind, replicate(6, cbind(matrix(0, nrow=sqrt(somPEs)),
         t(sapply(rep(1,sqrt(somPEs)), function(i) seq(-1+i+deltax,i- 
                                 deltax,deltax)))), simplify=FALSE)),
  yp = sapply(c(1:sqrt(somPEs)), function(i) 0.2+0.8*w[i,1:sqrt(somPEs),]/mxW),
  density = hm2/max(hm2),
  tops = fence_edges[,1],
  bottoms = fence_edges[,2],
  lefts = fence_edges[,3],
  rights = fence_edges[,4],
  top.lefts = fence_diagonals[,1],
  top.rights = fence_diagonals[,2], 
  bottom.lefts = fence_diagonals[,3], 
  bottom.rights = fence_diagonals[,4]
)

ggplot() + geom_rect(data=df,aes(xmin=0,xmax=1,ymin=0,ymax=1,fill=density)) +
geom_line(data=df, aes(x=c(xp.1, xp.2, xp.3, xp.4, xp.5, xp.6), 
      y=c(yp.1, yp.2, yp.3, yp.4, yp.5, yp.6)), colour="green") + 
facet_wrap( ~ somPEs, ncol=sqrt(somPEs)) +
scale_x_continuous(limits = c(0, 1)) + scale_y_continuous(limits = c(0,1)) 

0 ответов

Другие вопросы по тегам