Наложение двух графиков ggplot2 stat_density2d с альфа-каналами

Я хочу наложить два ggplot2 с альфа-каналами таким образом, чтобы в полученном изображении отображались оба набора данных. Это мои тестовые данные:

 data = read.table(text="P1 -1 0 4\nP2 0 0 2\nP3 2 1 8\nP4 -2 -2 6\nP5 0.5 2 12") data2 = read.table(text="Q1 1 1 3\nQ2 1 -1 2\nQ3 -1 1 8") colnames(data) = c("name","x","y","score") colnames(data2) = c("name","x","y","score") 

И вот как я рисую эти данные:

 ggplot(data, aes(x=x,y=y)) + stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") + xlim(-3,3) + ylim(-3,3) + geom_point() ggplot(data2, aes(x=x,y=y)) + stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#00FF00") + xlim(-3,3) + ylim(-3,3) + geom_point() 

Первый график показывает данные , второй график данных2 :

Сюжет для данных * данных *Сюжет для набора данных * data2 *

Теперь мне нужна комбинация обоих сюжетов. Следующее изображение – это то, что я хочу получить. Я произвел его с помощью моей программы редактирования изображений на рабочем столе, умножив оба изображения на слои.

Оба набора данных в одном сюжете

Я попытался построить один dataset поверх другого, но это не умножает оба слоя, а второй цвет перезаписывает первый.

 ggplot(data, aes(x=x,y=y)) + stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") + xlim(-3,3) + ylim(-3,3) + stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + scale_fill_gradient (low = "#FFFFFF", high = "#00FF00") 

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

Кроме того, я получаю это предупреждение: Шкала для ‘fill’ уже присутствует. Добавление другой шкалы для «заполнения», которая заменит существующий масштаб.

Есть ли способ сделать это в R? Или есть другой способ (используя другие функции, например, smoothScatter), чтобы получить этот или аналогичный результат? Как своего рода обходной путь, я думаю, что я получу аналогичный результат, используя ImageMagick на сервере, но я бы предпочел сделать все это в R.

Обновление 1

Таким образом, умножение двух слоев выполняется в ImageMagick;

 composite -compose multiply data-red.png data-green.png im-multiply.png 

Это дает тот же результат, что и выше.

Обновление 2

@Roland научила меня в своем ответе, как построить два набора данных в одном и том же сюжете. Хотя это здорово, остается одна проблема: изображение зависит от того, как вы подаете данные на график.

 ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) + stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) + scale_fill_manual(values=c("a"="#FF0000", "b"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

дает следующий результат:

Первый набор данных «a», затем набор данных «b2».

При замене порядка обоих наборов данных (теперь dataset «b» aka data2 приходит первым, а затем данные данных aka «a»), вы получаете аналогичный результат, но теперь преобладает красный цвет, потому что он получается позже и, таким образом, перезаписывается зеленые данные.

 ggplot(rbind(data.frame(data2, group="a"), data.frame(data, group="b")), aes(x=x,y=y)) + stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) + scale_fill_manual(values=c("b"="#FF0000", "a"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

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

Мне нужны решения, которые не зависят от порядка наборов данных.

Здесь точно такое же решение, как @Roland, за исключением того, что я предлагаю строку controur. Это позволит вам оценить перекрытие. Я не вижу, как geom_tile и ваша идея «умножения» могут помочь вам оценить это. Возможно, если вы используете синий и красный цвета для неперекрывающейся области и «взвешенный» фиолетовый цвет для перекрывающейся области. Но я думаю, вы должны были бы вычислить его на предыдущем шаге, прежде чем рисовать, я думаю.

контурная линия

 ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) + stat_density2d(geom="density2d", aes(color = group,alpha=..level..), size=2, contour=TRUE) + #scale_color_manual(values=c("a"="#FF0000", "b"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

Вы должны отображать обе плотности в одном масштабе:

 ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) + stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) + scale_fill_manual(values=c("a"="#FF0000", "b"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

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

В противном случае вы увидите искаженное изображение ваших данных.

  • Создайте пустой файл data.frame
  • Ошибка в R: (пакет, который доступен только в исходной форме и может потребоваться компиляция C / C ++ / Fortran)
  • Как вы можете прочитать CSV-файл в R с различным количеством столбцов
  • Ошибка: ошибка загрузки пакета или пространства имен для ggplot2 и для data.table
  • count количество строк в кадре данных в R на основе группы
  • Раунд вверх от .5
  • Специальные переменные в ggplot (..count .., ..density .. и т.д.)
  • Передайте имя столбца data.frame в функцию
  • Удалить значения NA из вектора
  • R: ggplot2 barplot и панель ошибок
  • Как затенять область под кривой, используя ggplot2
  • Давайте будем гением компьютера.