问题描述我要绘制数千行(〜4000)。但是,使用geom_line()
绘制所有线是不可行的,仅使用例如alpha=0.1
来说明哪里有高密度线,而没有哪里。我遇到了something similar in Python,尤其是答案的第二幅图看起来确实不错,但是现在ggplot2
是否可以实现类似的功能,我现在还不知道。因此是这样的:
示例数据集用一个显示模式的集合来演示这一点会更有意义,但是现在我只生成了随机的窦曲线:
set.seed(1)
gen.dat <- function(key) {
c <- sample(seq(0.1,1, by = 0.1), 1)
time <- seq(c*pi,length.out=100)
val <- sin(time)
time = 1:100
data.frame(time,val,key)
}
dat <- lapply(seq(1,10000), gen.dat) %>% bind_rows()
尝试过的热图我尝试了一个热图like answered here,但是此热图将不考虑整个轴上的点的连接(如直线),而是显示“加热” per时间点。
问题我们如何在R中使用ggplot2
绘制与第一张图类似的线热图?
仔细观察,您可以看到您链接到的图形由许多很多]点而不是直线组成。
ggpointdensity
程序包具有类似的可视化效果。请注意,由于有许多数据点,因此存在很多性能问题。我使用的是开发人员版本,因为它包含method
参数,该参数允许使用不同的平滑估计量,并且显然有助于更好地处理较大的数字。也有一个CRAN版本。
您可以使用adjust
参数调整平滑度。
我增加了代码的x间隔密度,使其看起来更像行。不过,已稍微减少了图中的“线条”数。
library(tidyverse)
#devtools::install_github("LKremer/ggpointdensity")
library(ggpointdensity)
set.seed(1)
gen.dat <- function(key) {
c <- sample(seq(0.1,1, by = 0.1), 1)
time <- seq(c*pi,length.out=500)
val <- sin(time)
time = seq(0.02,100,0.1)
data.frame(time,val,key)
}
dat <- lapply(seq(1, 1000), gen.dat) %>% bind_rows()
ggplot(dat, aes(time, val)) +
geom_pointdensity(size = 0.1, adjust = 10)
#> geom_pointdensity using method='kde2d' due to large number of points (>20k)
由reprex package(v0.3.0)在2020-03-19创建
更新
谢谢user Robert Gertenbach for creating some more interesting sample data。这里是该数据的ggpointdensity:library(tidyverse)
library(ggpointdensity)
gen.dat <- function(key) {
has_offset <- runif(1) > 0.5
time <- seq(1, 1000, length.out = 1000)
val <- sin(time / 100 + rnorm(1, sd = 0.2) + (has_offset * 1.5)) *
rgamma(1, 20, 20)
data.frame(time,val,key)
}
dat <- lapply(seq(1,1000), gen.dat) %>% bind_rows()
ggplot(dat, aes(time, val, group=key)) +stat_pointdensity(geom = "line", size = 0.05, adjust = 10) + scale_color_gradientn(colors = c("blue", "yellow", "red"))
由reprex package(v0.3.0)在2020-03-24创建
您的数据将产生非常均匀的圆点密度。
我使用geom_segment()
提出了以下解决方案,但是我不确定geom_segment()
是否可行,因为它仅检查成对值是否exactly