Как я могу наложить два плотных графика рассеяния, чтобы я мог видеть контуры каждого в R или Matlab? - PullRequest
13 голосов
/ 14 марта 2012

См. Этот пример Example of overlaid scatter plots

Это было создано в Matlab путем независимого создания двух диаграмм рассеяния, создания изображений каждого из них, затем с помощью imagesc, чтобы нарисовать их на одном рисунке, и, наконец, установки альфаверхнее изображение до 0,5.

Я хотел бы сделать это в R или Matlab без использования изображений, так как создание изображения не сохраняет информацию о масштабе оси, и я не могу наложить сетку (например, используя 'grid on'в Matlab).В идеале я хотел бы сделать это правильно в matlab, но также был бы рад решению в R. Кажется, что это должно быть возможно, но я не могу на всю жизнь понять это.

ТакКак правило, я хотел бы иметь возможность установить альфа для всего построенного объекта (т. е. дескриптора сюжета Matlab на языке Matlab ...)

Спасибо,

Бен.

РЕДАКТИРОВАТЬ: данные в приведенном выше примере на самом деле 2D.Точки на графике взяты из компьютерного моделирования.Каждая точка представляет «амплитуду» (ось Y) (эмерджентное свойство, специфичное для симуляции, которую я выполняю), нанесенную на график относительно «производительности» (ось X).

РЕДАКТИРОВАНИЕ 2: в каждом наборе данных содержится 1796400 точек.

Ответы [ 4 ]

11 голосов
/ 15 марта 2012

Используя ggplot2, вы можете сложить два geom_point и сделать их прозрачными, используя параметр alpha. ggplot2 также добавляет прозрачности, и я думаю, что это то, что вы хотите. Это должно работать, хотя я не запускал это.

dat = data.frame(x = runif(1000), y = runif(1000), cat = rep(c("A","B"), each = 500))
ggplot(aes(x = x, y = y, color = cat), data = dat) + geom_point(alpha = 0.3)

ggplot2 - это круто!

Это пример расчета и рисования выпуклой оболочки:

library(automap)
library(ggplot2)
library(plyr)
loadMeuse()
theme_set(theme_bw())

meuse = as.data.frame(meuse)
chull_per_soil = ddply(meuse, .(soil), 
           function(sub) sub[chull(sub$x, sub$y),c("x","y")])

ggplot(aes(x = x, y = y), data = meuse) +
  geom_point(aes(size = log(zinc), color = ffreq)) +
  geom_polygon(aes(color = soil), data = chull_per_soil, fill = NA) +
  coord_equal()

, что приводит к следующей иллюстрации:

enter image description here

5 голосов
/ 15 марта 2012

Вы можете сначала экспортировать два набора данных в виде растровых изображений, повторно импортировать их, добавить прозрачность:

overlay

library(grid)

N <- 1e7 # Warning: slow
d <- data.frame(x1=rnorm(N),
                x2=rnorm(N, 0.8, 0.9),
                y=rnorm(N, 0.8, 0.2),
                z=rnorm(N, 0.2, 0.4))

v <- with(d, dataViewport(c(x1,x2),c(y, z)))

png("layer1.png", bg="transparent")
with(d, grid.points(x1,y, vp=v,default="native",pch=".",gp=gpar(col="blue")))
dev.off()
png("layer2.png", bg="transparent")
with(d, grid.points(x2,z, vp=v,default="native",pch=".",gp=gpar(col="red")))
dev.off()

library(png)
i1 <- readPNG("layer1.png", native=FALSE)
i2 <- readPNG("layer2.png", native=FALSE)

ghostize <- function(r, alpha=0.5)
  matrix(adjustcolor(rgb(r[,,1],r[,,2],r[,,3],r[,,4]), alpha.f=alpha), nrow=dim(r)[1])

grid.newpage()
grid.rect(gp=gpar(fill="white"))
grid.raster(ghostize(i1))
grid.raster(ghostize(i2))

Вы можете добавить их как слои, скажемggplot2.

0 голосов
/ 15 марта 2012

AFAIK, ваш лучший вариант с Matlab - просто создать свою собственную функцию сюжета.Точки рассеянного графика, к сожалению, еще не имеют атрибута прозрачности, поэтому вы не можете на него повлиять.Однако, если вы, скажем, самым грубым образом создадите группу петель, которые рисуют много маленьких кружков, вы можете легко присвоить им альфа-значение и получить прозрачный набор точек данных.

0 голосов
/ 14 марта 2012

Используйте возможность прозрачности описания цвета. Вы можете определить цвет как последовательность из четырех 2-байтовых слов: muddy <- "#888888FF". Первые три пары устанавливают цвета RGB (от 00 до FF); последняя пара устанавливает уровень прозрачности.

...