R中的线密度热图

问题描述 投票:7回答:3

问题描述我要绘制数千行(〜4000)。但是,使用geom_line()绘制所有线是不可行的,仅使用例如alpha=0.1来说明哪里有高密度线,而没有哪里。我遇到了something similar in Python,尤其是答案的第二幅图看起来确实不错,但是现在ggplot2是否可以实现类似的功能,我现在还不知道。因此是这样的:enter image description here

示例数据集用一个显示模式的集合来演示这一点会更有意义,但是现在我只生成了随机的窦曲线:

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绘制与第一张图类似的线热图?

r ggplot2 plot heatmap
3个回答
5
投票

仔细观察,您可以看到您链接到的图形由许多很多]点而不是直线组成。

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创建


2
投票

您的数据将产生非常均匀的圆点密度。


-1
投票

我使用geom_segment()提出了以下解决方案,但是我不确定geom_segment()是否可行,因为它仅检查成对值是否exactly

© www.soinside.com 2019 - 2024. All rights reserved.