점이 너무 많은 산점도


126

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


4
히트 맵을 찾고있는 것 같습니다 : streamingdata.com/2010/01/21/…

답변:


145

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

이것은 다음과 같이 쉽습니다 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()

1
색상을 바꾸려면 어떻게해야합니까? 나는 지금 블루에서 블랙 스케일을 얻고 있지만 레귤레이션, 그린 블루 스케일을 얻고 싶습니다.
user1007742

@ user1007742 scale_fill_gradient()고유 한 낮은 색과 높은 색을 사용 및 지정하거나 scale_fill_brewer()순차적 팔레트 중 하나를 사용 하여 선택하십시오.
joran

@ joran 감사합니다, 지금 작동합니다. 포인트의 유형 / 모양을 변경하는 것은 어떻습니까? 육각형 또는 정사각형을 얻습니다. 나는 단지 간단한 점들을 원한다. geom_point ()를 사용하면 오류가 발생합니다.
user1007742

1
@ user1007742 글쎄, 이유는 "육각 비닝"입니다. ;) "점"을 표시하지 않고 전체 영역을 6 각형 (또는 직사각형) 빈으로 나눈 다음 해당 빈에 몇 개의 점이 있는지에 따라 빈을 채색합니다. 짧은 대답은 "당신은 할 수 없습니다"입니다. 다른 모양을 원하면 geom_point()각 개별 점 을 사용 하고 플롯 해야합니다 .
joran

3D 데이터가 있으면 어떻게합니까?
스칸

60

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])

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


3
두 번째 줄거리는 훌륭합니다!
Ricardo Saporta

3D 데이터가 있으면 어떻게합니까?
skan

2
@ 스칸 : 당신은 그것에 대한 새로운 질문을 열 수 있습니다.
majom

불행히도 패키지 ggsubplot은 더 이상 유지되지 않고 크랜 저장소에서 제거됩니다 ... 위의 처음 두 개와 같은 플롯을 생성하는 데 사용할 수있는 대체 패키지를 알고 있습니까?
dieHellste

이전 버전의 R & ggplot2를 사용한다면 작동시킬 수 있어야합니다.
majom

59

다음의 몇 가지 좋은 옵션에 대한 개요 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'
)

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


1
이것은 약간 더 선의의 가치가 있다고 생각되는 매우 훌륭하게 작성된 답변입니다.
Lalochezia

scale_fill_viridis_c () 오류가 발생했습니다 : "scale_fill_viridis_c"함수를 찾을 수 없습니다
JustGettinStarted

ggplot2 업데이트, ggplot2 재설치 및 ggplot2 재로드 오류를 수정하지 않았습니다. 별도로 'viridis'패키지를 설치하고 'scale_fill_viridis'기능을 사용할 수 있지만 'scale_fill_viridis_c'기능은 사용할 수 없지만 여전히 동일한 오류가 발생합니다.
JustGettinStarted

오 믿어 문제가 없습니다. 오류의 바닥에 도달하려고합니다.
JustGettin2016 년

51

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

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

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

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


20
약간의 컨텍스트를 추가하기 위해 "# 000000"은 검은 색이고 색 끝에 추가 된 "33"은 불투명도입니다 (여기서는 33 %).
Charlie

추가 된 설명에 감사드립니다.
Aaron은 스택 오버플로를

완벽하게 이해됩니다. 고마워, 아론과 찰리
user702432

12
사소한 메모; 숫자는 16 진수이므로 33은 실제로 3/16 불투명합니다.
Aaron은

45

밀도 등고선 ( 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")

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


29

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)

헥스 빈 플롯


+1 hexbin이 내가 선호하는 솔루션입니다. 많은 점이 필요한 다음 안전하게 플롯을 만들 수 있습니다. 나는 다른 사람들이 줄거리를 만들지 않을 것이라고 확신하지 않고 단순히 사후에 다르게 물건을 음영 처리합니다.
반복자

3D 데이터를위한 hexbin과 같은 것이 있습니까?
skan

8

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()


2

이 유형의 데이터를 플로팅하기 위해 내가 가장 좋아하는 방법은 이 질문에 설명 된 방법입니다 - 산란 밀도 플롯 입니다. 아이디어는 산점도를 수행하지만 밀도를 기준으로 점에 색상을 지정하는 것입니다 (대략 말하면 해당 영역의 겹침 정도).

동시에 :

  • 특이 치의 위치를 ​​명확하게 보여줍니다.
  • 플롯의 조밀 한 영역의 구조를 나타냅니다.

다음은 링크 된 질문에 대한 최상위 답변의 결과입니다.

산란 밀도 플롯


1
이것은 내가 가장 좋아하는 방법입니다. 에서 이것을 달성하는 방법에 대한 내 대답 을 참조하십시오 R.
jan-glx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.