R для цветного рассеивателя плотности, созданного с использованием smoothScatter

Я создаю диаграмму рассеяния плотности цвета в R, используя функцию smoothScatter().

Пример:

## A largish data set
n <- 10000
x1  <- matrix(rnorm(n), ncol = 2)
x2  <- matrix(rnorm(n, mean = 3, sd = 1.5), ncol = 2)
x   <- rbind(x1, x2)
oldpar <- par(mfrow = c(2, 2))
smoothScatter(x, nrpoints = 0)

Вывод:

enter image description here

Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как добавить легенду/цветовую шкалу, которая описывает относительную разницу в числовых терминах между разными оттенками. Например, невозможно определить, будет ли самый темный синий на рисунке выше 2 раза, в 10 или 100 раз плотнее самого легкого синего цвета без какой-либо легенды или цветовой гаммы. Есть ли какой-либо путь в R для получения необходимой информации для создания такой шкалы или что-либо, что может быть создано таким образом, что автоматически может быть получена такая цветовая шкала?

Ответ 1

Вот ответ, который полагается на fields::imageplot и некоторые возится с par(mar), чтобы получить правильные поля.

fudgeit <- function(){
  xm <- get('xm', envir = parent.frame(1))
  ym <- get('ym', envir = parent.frame(1))
  z  <- get('dens', envir = parent.frame(1))
  colramp <- get('colramp', parent.frame(1))
  fields::image.plot(xm,ym,z, col = colramp(256), legend.only = T, add =F)
}

par(mar = c(5,4,4,5) + .1)
smoothScatter(x, nrpoints = 0, postPlotHook = fudgeit)

enter image description here

Вы можете поиграть с image.plot, чтобы получить то, что хотите, и посмотреть ?bkde2D и аргумент transformation на smoothScatter, чтобы получить представление о том, что представляют собой цвета.