Scatterplot dengan kontur / panas overlay

23

Saya melihat plot ini dalam suplemen kertas baru - baru ini dan saya ingin dapat mereproduksi menggunakan R. Ini adalah sebaran, tetapi untuk memperbaiki overplotting ada garis kontur yang "panas" berwarna biru ke merah sesuai dengan kepadatan overplotting. Bagaimana saya melakukan ini?

masukkan deskripsi gambar di sini

Stephen Turner
sumber
5
Pertanyaan StackOverflow ini menunjukkan beberapa opsi ggplot2 untuk plot semacam ini, termasuk titik scatterplot +.
joran

Jawaban:

30

Inilah yang saya ambil, hanya menggunakan fungsi dasar untuk menggambar:

library(MASS)  # in case it is not already loaded 
set.seed(101)
n <- 1000
X <- mvrnorm(n, mu=c(.5,2.5), Sigma=matrix(c(1,.6,.6,1), ncol=2))

## some pretty colors
library(RColorBrewer)
k <- 11
my.cols <- rev(brewer.pal(k, "RdYlBu"))

## compute 2D kernel density, see MASS book, pp. 130-131
z <- kde2d(X[,1], X[,2], n=50)

plot(X, xlab="X label", ylab="Y label", pch=19, cex=.4)
contour(z, drawlabels=FALSE, nlevels=k, col=my.cols, add=TRUE)
abline(h=mean(X[,2]), v=mean(X[,1]), lwd=2)
legend("topleft", paste("R=", round(cor(X)[1,2],2)), bty="n")

masukkan deskripsi gambar di sini

Untuk rendering yang lebih mewah, Anda mungkin ingin melihat pada ggplot2 dan stat_density2d(). Fungsi lain yang saya suka adalah smoothScatter():

smoothScatter(X, nrpoints=.3*n, colramp=colorRampPalette(my.cols), pch=19, cex=.8)

masukkan deskripsi gambar di sini

chl
sumber
2
Akan lebih baik jika seseorang dapat mengendalikan plot kontur untuk memasukkan kuantil / persentil / desil tertentu (atau apa pun yang Anda miliki).
Roman Luštrik
Mengagumkan, saya sudah lama mencari hal seperti itu, plot berkualitas bagus
WAF
26

Tidak ada yang menyarankan ggplot2 untuk ini ??

library(MASS)
library(ggplot2)
n <- 1000
x <- mvrnorm(n, mu=c(.5,2.5), Sigma=matrix(c(1,.6,.6,1), ncol=2))
df = data.frame(x); colnames(df) = c("x","y")

commonTheme = list(labs(color="Density",fill="Density",
                        x="RNA-seq Expression",
                        y="Microarray Expression"),
                   theme_bw(),
                   theme(legend.position=c(0,1),
                         legend.justification=c(0,1)))

ggplot(data=df,aes(x,y)) + 
  geom_density2d(aes(colour=..level..)) + 
  scale_colour_gradient(low="green",high="red") + 
  geom_point() + commonTheme

Yang menghasilkan sebagai berikut:

Contoh 1

Namun, hal-hal lain juga dapat dilakukan dengan mudah, seperti yang berikut:

ggplot(data=df,aes(x,y)) + 
  stat_density2d(aes(fill=..level..,alpha=..level..),geom='polygon',colour='black') + 
  scale_fill_continuous(low="green",high="red") +
  geom_smooth(method=lm,linetype=2,colour="red",se=F) + 
  guides(alpha="none") +
  geom_point() + commonTheme

Yang menghasilkan sebagai berikut:

masukkan deskripsi gambar di sini

ADP
sumber