Como posso obter as coordenadas x , y de um geom_point em um ggplot , onde o quadro de referência é toda a imagem plotada?
Eu posso criar um ggplot com alguns geom_point s usando:
library(ggplot2)
my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
geom_point(aes(x, y), color = "red")
Isto dá:
Ao converter isso em um grob , posso extrair algumas informações adicionais sobre este ggplot , como as coordenadas em relação ao painel de plotagem, marcadas pela seta roxa. No entanto, isso ignora o espaço ocupado pelos eixos.
my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native
Como posso obter os valores das coordenadas x , y quando começo a medir no canto inferior esquerdo de toda a imagem, marcado pela seta verde?
Se possível, eu gostaria que a solução levasse em consideração o tema do ggplot . Adicionar um tema como + theme_void()
afeta os eixos e também altera a localização dos pontos em relação a toda a imagem plotada.
Atualização : percebi que o tamanho da fonte dos eixos muda dependendo da largura e altura da plotagem, afetando o tamanho relativo do painel da plotagem . Portanto, não será trivial fornecer a localização em unidades npc sem definir a largura e a altura da plotagem . Se possível, forneça a localização dos geom_points como uma função da largura e altura da plotagem .
Respostas:
Quando você redimensiona um ggplot, a posição dos elementos no painel não está em posições fixas no espaço npc. Isso ocorre porque alguns dos componentes do gráfico têm tamanhos fixos e alguns deles (por exemplo, o painel) alteram as dimensões de acordo com o tamanho do dispositivo.
Isso significa que qualquer solução deve levar em consideração o tamanho do dispositivo e, se você quiser redimensionar a plotagem, precisará executar o cálculo novamente. Dito isto, para a maioria dos aplicativos (incluindo o seu, pelo som das coisas), isso não é um problema.
Outra dificuldade é garantir que você esteja identificando os grobs corretos no grob do painel e é difícil ver como isso pode ser facilmente generalizado. O uso das funções de subconjunto de lista
[[6]]
e[[3]]
no seu exemplo não é generalizável para outros gráficos.De qualquer forma, esta solução funciona medindo o tamanho e a posição do painel dentro do gtable e convertendo todos os tamanhos em milimetros antes de dividir pelas dimensões da plotagem em milimetros para converter em espaço npc. Tentei torná-lo um pouco mais geral, extraindo o painel e os pontos pelo nome, em vez do índice numérico.
Agora podemos testá-lo com seu exemplo:
E podemos confirmar que esses valores estão corretos, plotando alguns pontos sobre seus pontos vermelhos, usando nossos valores como coordenadas npc:
Criado em 2020-03-25 pelo pacote reprex (v0.3.0)
fonte
sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
parte é a mais estranha. Você poderia explicar o que está resumindo aqui?panel_pos$t
fornece a linha da grade na qual o painel (flexível) fica, assimseq(panel_pos$t -1)
como todos os números de linha acima disso e, portanto,sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
é a soma das alturas dessas linhas.