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