[r] 점이 너무 많은 산점도

N = 700K 인 두 개의 변수를 플로팅하려고합니다. 문제는 겹치는 부분이 너무 많아서 음모가 대부분 검은 색의 단색 블록이되는 것입니다. 플롯의 어두움이 영역의 포인트 수의 함수 인 회색조 “구름”을 갖는 방법이 있습니까? 다시 말해, 개별 점을 표시하는 대신 영역의 점 수가 많을수록 해당 영역이 더 어두워지는 플롯이 “구름”이되기를 원합니다.



답변

이 문제를 해결하는 한 가지 방법은 알파 블렌딩을 사용하여 각 점을 약간 투명하게 만드는 것입니다. 따라서 더 많은 점이 그려진 영역이 더 어둡게 나타납니다.

이것은 다음과 같이 쉽습니다 ggplot2.

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)

여기에 이미지 설명을 입력하십시오

이것을 처리하는 또 다른 편리한 방법은 (그리고 아마도 당신이 가지고있는 포인트의 수에 더 적합 할 때) 육각형 비닝입니다.

ggplot(df,aes(x=x,y=y)) + stat_binhex()

여기에 이미지 설명을 입력하십시오

그리고 기존의 오래된 사각형 비닝 (이미지 생략)이 있습니다. 이는 전통적인 히트 맵과 비슷합니다.

ggplot(df,aes(x=x,y=y)) + geom_bin2d()


답변

ggsubplot패키지를 살펴볼 수도 있습니다 . 이 패키지는 2011 년 Hadley Wickham이 제시 한 기능을 구현합니다 ( http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html ).

(다음에서는 설명을 위해 “포인트”레이어를 포함합니다.)

library(ggplot2)
library(ggsubplot)

# Make up some data
set.seed(955)
dat <- data.frame(cond = rep(c("A", "B"), each=5000),
                  xvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)),
                  yvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)))


# Scatterplot with subplots (simple)
ggplot(dat, aes(x=xvar, y=yvar)) +
  geom_point(shape=1) +
  geom_subplot2d(aes(xvar, yvar,
                     subplot = geom_bar(aes(rep("dummy", length(xvar)), ..count..))), bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)

여기에 이미지 설명을 입력하십시오

그러나 제어 할 세 번째 변수가있는 경우이 기능이 흔들립니다.

# Scatterplot with subplots (including a third variable) 

ggplot(dat, aes(x=xvar, y=yvar)) +
  geom_point(shape=1, aes(color = factor(cond))) +
  geom_subplot2d(aes(xvar, yvar,
                     subplot = geom_bar(aes(cond, ..count.., fill = cond))),
                 bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)  

여기에 이미지 설명을 입력하십시오

또는 다른 접근법은 다음을 사용하는 것입니다 smoothScatter().

smoothScatter(dat[2:3])

여기에 이미지 설명을 입력하십시오


답변

다음의 몇 가지 좋은 옵션에 대한 개요 ggplot2:

library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)

옵션 A : 투명한 점

o1 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05)

옵션 B : 밀도 윤곽선 추가

o2 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05) +
  geom_density_2d()

옵션 C : 채워진 밀도 윤곽선 추가

o3 <- ggplot(df, aes(x, y)) +
  stat_density_2d(aes(fill = stat(level)), geom = 'polygon') +
  scale_fill_viridis_c(name = "density") +
  geom_point(shape = '.')

옵션 D : 밀도 히트 맵

o4 <- ggplot(df, aes(x, y)) +
  stat_density_2d(aes(fill = stat(density)), geom = 'raster', contour = FALSE) +
  scale_fill_viridis_c() +
  coord_cartesian(expand = FALSE) +
  geom_point(shape = '.', col = 'white')

옵션 E : 헥스 빈

o5 <- ggplot(df, aes(x, y)) +
  geom_hex() +
  scale_fill_viridis_c() +
  geom_point(shape = '.', col = 'white')

옵션 F : 깔개

o6 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.1) +
  geom_rug(alpha = 0.01)

하나의 그림으로 결합 :

cowplot::plot_grid(
  o1, o2, o3, o4, o5, o6,
  ncol = 2, labels = 'AUTO', align = 'v', axis = 'lr'
)

여기에 이미지 설명을 입력하십시오


답변

알파 블렌딩은 기본 그래픽으로도 쉽게 할 수 있습니다.

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
with(df, plot(x, y, col="#00000033"))

뒤의 첫 6 자리 숫자 #는 RGB 16 진수 색상이고 마지막 2 자리 숫자 는 불투명도로 다시 16 진수로 33 ~ 3 / 16 번째 불투명합니다.

여기에 이미지 설명을 입력하십시오


답변

밀도 등고선 ( ggplot2)을 사용할 수도 있습니다 .

df <- data.frame(x = rnorm(15000),y=rnorm(15000))
ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()

여기에 이미지 설명을 입력하십시오

또는 밀도 윤곽을 알파 블렌딩과 결합하십시오.

ggplot(df,aes(x=x,y=y)) +
    geom_point(colour="blue", alpha=0.2) +
    geom_density2d(colour="black")

여기에 이미지 설명을 입력하십시오


답변

hexbin패키지가 유용 할 수 있습니다 . 의 도움말 페이지에서 hexbinplot:

library(hexbin)
mixdata <- data.frame(x = c(rnorm(5000),rnorm(5000,4,1.5)),
                      y = c(rnorm(5000),rnorm(5000,2,3)),
                      a = gl(2, 5000))
hexbinplot(y ~ x | a, mixdata)

헥스 빈 플롯


답변

geom_pointdenisty로부터 ggpointdensity패키지를 동시에 밀도와 각각의 데이터 포인트를 시각화 허용 (최근 루카스 크레머와 사이먼 앤더스 (2019)에 의해 개발) :

library(ggplot2)
# install.packages("ggpointdensity")
library(ggpointdensity)

df <- data.frame(x = rnorm(5000), y = rnorm(5000))
ggplot(df, aes(x=x, y=y)) + geom_pointdensity() + scale_color_viridis_c()