R Scatter Plot: символ цвета представляет количество перекрывающихся точек
Графики рассеяния может быть трудно интерпретировать, когда многие точки перекрываются, поскольку такое перекрытие затеняет плотность данных в конкретном регионе. Одним из решений является использование полупрозрачных цветов для построенных точек, чтобы непрозрачная область указывала на наличие множества наблюдений в этих координатах.
Ниже приведен пример моего черно-белого решения в R:
MyGray <- rgb(t(col2rgb("black")), alpha=50, maxColorValue=255)
x1 <- rnorm(n=1E3, sd=2)
x2 <- x1*1.2 + rnorm(n=1E3, sd=2)
dev.new(width=3.5, height=5)
par(mfrow=c(2,1), mar=c(2.5,2.5,0.5,0.5), ps=10, cex=1.15)
plot(x1, x2, ylab="", xlab="", pch=20, col=MyGray)
plot(x1, x2, ylab="", xlab="", pch=20, col="black")
Однако недавно я наткнулся на эту статью в PNAS, в которой использовался аналогичный подход, но использовалась окраска тепловых карт, а не непрозрачность, как показатель того, сколько точек перекрывалось. Эта статья - "Открытый доступ", так что любой может скачать.pdf и посмотреть на рисунок 1, который содержит соответствующий пример графика, который я хочу создать. Раздел методов этой статьи указывает, что анализы были сделаны в Matlab.
Для удобства приведем небольшую часть рисунка 1 из вышеприведенной статьи:
Как бы я создал график рассеяния в R, который использовал цвет, а не непрозрачность, в качестве индикатора плотности точек?
Для начала, пользователи R могут получить доступ к этой цветовой схеме Matlab в install.packages("fields")
библиотека, используя функцию tim.colors()
,
Есть ли простой способ сделать фигуру, похожую на рисунок 1 вышеупомянутой статьи, но в R? Спасибо!
3 ответа
Одним из вариантов является использование densCols()
извлечь плотности ядра в каждой точке. Сопоставление этих плотностей с желаемой цветовой шкалой и нанесение точек в порядке увеличения локальной плотности дает вам график, очень похожий на график в связанной статье.
## Data in a data.frame
x1 <- rnorm(n=1E3, sd=2)
x2 <- x1*1.2 + rnorm(n=1E3, sd=2)
df <- data.frame(x1,x2)
## Use densCols() output to get density at each point
x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white")))
df$dens <- col2rgb(x)[1,] + 1L
## Map densities to colors
cols <- colorRampPalette(c("#000099", "#00FEFF", "#45FE4F",
"#FCFF00", "#FF9400", "#FF3100"))(256)
df$col <- cols[df$dens]
## Plot it, reordering rows so that densest points are plotted on top
plot(x2~x1, data=df[order(df$dens),], pch=20, col=col, cex=2)
Вы можете получить аналогичный эффект, выполнив шестиугольное разбиение на части, разделив область на шестиугольники, раскрасив каждый шестиугольник в зависимости от количества точек в шестиугольнике. В пакете hexbin есть функции для этого, а также в пакете ggplot2.
Ты можешь использовать smoothScatter
за это.
colramp = colorRampPalette(c('white', 'blue', 'green', 'yellow', 'red'))
smoothScatter(x1, x2, colramp=colramp)