Descrição do problema
Tenho milhares de linhas (~ 4000) que quero plotar. No entanto, é inviável plotar todas as linhas usando geom_line()
e apenas usando, por exemplo, alpha=0.1
para ilustrar onde há uma alta densidade de linhas e onde não. Me deparei com algo semelhante em Python , especialmente o segundo gráfico das respostas parece muito bom, mas não o faço agora se algo semelhante puder ser alcançado ggplot2
. Assim, algo como isto:
Um exemplo de conjunto de dados
Seria muito mais sensato demonstrar isso com um conjunto que mostra um padrão, mas, por enquanto, eu apenas gerava curvas sinusais aleatórias:
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()
Tentei um mapa de calor
Tentei um mapa de calor como o respondido aqui , no entanto, este mapa de calor não considerará a conexão de pontos sobre o eixo completo (como em uma linha), mas mostrará o "calor" por ponto de tempo.
Pergunta
Como podemos em R, usando o ggplot2
gráfico de um mapa de calor de linhas semelhante ao mostrado na primeira figura?
ggplot(dat, aes(time, val, group=key)) +stat_pointdensity(geom = "line", size = 0.05, adjust = 10) + scale_color_gradientn(colors = c("blue", "yellow", "red"))
ggpointdensity
Observando atentamente, pode-se ver que o gráfico ao qual você está vinculando consiste em muitos, muitos, muitos pontos em vez de linhas.
O
ggpointdensity
pacote faz uma visualização semelhante. Observe que, com tantos pontos de dados, existem alguns problemas de desempenho. Estou usando a versão do desenvolvedor, porque contém omethod
argumento que permite usar diferentes estimadores de suavização e aparentemente ajuda a lidar melhor com números maiores. Também existe uma versão CRAN.Você pode ajustar a suavização com o
adjust
argumentoAumentei a densidade do intervalo x do seu código, para torná-lo mais parecido com linhas. No entanto, reduzimos ligeiramente o número de 'linhas' na trama.
Criado em 2020-03-19 pelo pacote reprex (v0.3.0)
update Agradecemos ao usuário Robert Gertenbach por criar alguns dados de amostra mais interessantes . Aqui, o uso sugerido de ggpointdensity nesses dados:
Criado em 2020-03-24 pelo pacote reprex (v0.3.0)
fonte
ggplot(dat, aes(time, val, group=key)) +stat_pointdensity(geom = "line", size = 0.05, adjust = 10) + scale_color_gradientn(colors = c("blue", "yellow", "red"))
resultados em algo realmente bonito!Eu vim com a seguinte solução, usando
geom_segment()
, no entanto, não tenho certeza segeom_segment()
é o caminho a seguir, pois apenas verifica se os valores em pares são exatamente os mesmos, enquanto em um mapa de calor (como na minha pergunta) os valores próximos um do outro também afetam o 'calor' ao invés de ser exatamente o mesmo.fonte