Блочная диаграмма с цветовой кодировкой

Я пытаюсь использовать ggplot для создания псевдо-boxplot посредством цвета/прозрачности, но немного борюсь. Идея состоит в том, что для любой точки на оси x чем больше раз встречается конкретное значение y, тем темнее должна быть точка (x,y). Чтобы добавить сложности, у меня нет счетчика для каждого (x, y), но вместо этого у меня есть счетчик для (x , ymin:ymax), что означает, что этот счетчик верен для всех точек между (x, ymin) и (x, ymax)

Поиск кажется немного сложным, и я не могу найти ничего, что мог бы использовать. Самое близкое, что я мог сделать самостоятельно, было ниже, однако это занимает очень много времени для больших наборов данных.

library(ggplot2)
set.seed(1)
(d <- data.frame(cbind(x = sample(1:3, 10, replace = TRUE), y = sample(3:8, 10, replace = TRUE)), fac = sample(1:3, 10, replace = TRUE)))

p1 <- ggplot()

for ( i in seq(nrow(d)))
{
  p1 <- p1 + geom_rect(
    data=d[i,],
    aes(
      xmin = fac - .4,
      xmax = fac + .4,
      ymin = x,
      ymax = y),
    alpha = .25
  )

}

введите здесь описание изображения

Какие-либо предложения? Я бы предпочел решение ggplot. Спасибо

Обновление от 23 ноября 13. С помощью Троя я добрался сюда. Единственная проблема сейчас заключается в том, что легенда колеблется между значениями t для каждого прямоугольника, тогда как она должна варьироваться от кумулятивного t на x, y.

library(ggplot2)
set.seed(1)
d <- data.frame(cbind(x = sample(1:3, 6, replace = TRUE), 
                      ymin = sample(3:8, 6, replace = TRUE),
                      ymax = sample(3:8, 6, replace = TRUE),
                      t = sample(3:8, 6, replace = TRUE)/10
                      ))

ggplot(data=d) +
  geom_rect(aes(xmin=x-0.4,xmax=x+0.4,ymin=ymin,ymax=ymax,alpha=t),fill="red")

person TheComeOnMan    schedule 21.11.2013    source источник
comment
Может быть, добавить ковер по краям участка? stackoverflow.com/questions/11546256/   -  person americo    schedule 21.11.2013


Ответы (1)


ggplot БУДЕТ поддерживать векторы, используя geom_rect

это хотя бы избавится от петли, если вас устраивает механика оригинального сюжета?

library(ggplot2)
set.seed(1)
(d <- data.frame(cbind(x = sample(1:3, 10, replace = TRUE), y = sample(3:8, 10, replace = TRUE)), fac = sample(1:3, 10, replace = TRUE)))
ggplot(data=d) +
geom_rect(aes(xmin=fac-0.4,xmax=fac+0.4,ymin=x,ymax=y),alpha=0.25,fill="red")

сюжет

или вы хотели изменить способ вычисления прозрачности, используя другую реализацию count()?

РЕДАКТИРОВАТЬ - если вы просто хотите заблокировать сетку с указанием "количество":

library(ggplot2)
set.seed(1)
d <- data.frame(cbind(x = sample(1:3, 15, replace = TRUE), 
     y = sample(3:8, 18, replace = TRUE)))

ggplot(data=d) +
   geom_tile(aes(x=x,y=y),alpha=0.25,fill="red")

сюжетная плитка

person Troy    schedule 22.11.2013
comment
+1 Глядя на ваш ответ, я не могу понять, почему я вообще запустил цикл. И у вас есть хорошее представление о проблеме. Я совершенно забыл упомянуть ту часть прозрачности. Я просто связал другой столбец с аргументом alpha внутри aes, что исправило это. Есть ли способ сделать это непрерывным графиком вместо прямоугольников для каждой категории x? - person TheComeOnMan; 22.11.2013
comment
если вы просто хотите создать сетку x-y с прозрачностью, то вы можете использовать geom_tile, как указано выше, при редактировании? Не уверен, что это именно то, что вы хотите сделать, если это другое, не могли бы вы описать на основе d? - person Troy; 22.11.2013
comment
Нет-нет, ты был на правильном пути. Я имел в виду, что с сюжетом, который я не добавил к вопросу, каждый прямоугольник является точкой данных, поэтому легенда отмечает прозрачность от самого низкого до самого высокого значения счетчика прямоугольника. Однако на самом деле график имеет перекрытие прямоугольников, и прозрачность должна находиться в диапазоне между кумулятивными значениями прозрачности при любых значениях x, y. Любой способ сделать это? - person TheComeOnMan; 23.11.2013