Existe uma maneira de criar gráficos de dispersão com histogramas marginais, como na amostra abaixo em ggplot2
? No Matlab, é a scatterhist()
função e existem equivalentes para R também. No entanto, eu não vi isso para o ggplot2.
Comecei uma tentativa criando os gráficos únicos, mas não sei como organizá-los corretamente.
require(ggplot2)
x<-rnorm(300)
y<-rt(300,df=2)
xy<-data.frame(x,y)
xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")
yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )
scatter <- qplot(x,y, data=xy) + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()
e organizando-os com a função postada aqui . Mas, para resumir a história: existe uma maneira de criar esses gráficos?
Respostas:
O
gridExtra
pacote deve funcionar aqui. Comece criando cada um dos objetos ggplot:Em seguida, use a função grid.arrange:
fonte
xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )
e usardata=xy
nas chamadas ggplot.Esta não é uma resposta completamente responsiva, mas é muito simples. Ele ilustra um método alternativo para exibir densidades marginais e também como usar níveis alfa para resultados gráficos que suportam transparência:
fonte
Isso pode ser um pouco tarde, mas decidi criar um pacote (
ggExtra
), pois envolvia um pouco de código e pode ser entediante de escrever. O pacote também tenta solucionar um problema comum, como garantir que, mesmo que haja um título ou o texto seja ampliado, os gráficos ainda estejam alinhados.A idéia básica é semelhante ao que as respostas aqui deram, mas vai um pouco além disso. Aqui está um exemplo de como adicionar histogramas marginais a um conjunto aleatório de 1000 pontos. Esperamos que isso facilite a adição de histogramas / gráficos de densidade no futuro.
Link para o pacote ggExtra
fonte
Uma adição, apenas para economizar tempo de pesquisa para as pessoas que fazem isso depois de nós.
As legendas, os rótulos dos eixos, os textos dos eixos, os tiques fazem com que os gráficos se afastem um do outro, para que o gráfico fique feio e inconsistente.
Você pode corrigir isso usando algumas dessas configurações de tema,
e alinhar escalas,
para que os resultados fiquem bem:
fonte
Apenas uma variação muito pequena na resposta da BondedDust , no espírito geral dos indicadores marginais de distribuição.
Edward Tufte chamou esse uso de plotagens de tapete de 'traço pontilhado' e tem um exemplo no VDQI de uso das linhas de eixo para indicar o intervalo de cada variável. No meu exemplo, os rótulos dos eixos e as linhas de grade também indicam a distribuição dos dados. Os rótulos estão localizados nos valores do resumo de cinco números de Tukey (mínimo, dobradiça inferior, mediana, dobradiça superior, máximo), fornecendo uma rápida impressão da distribuição de cada variável.
Esses cinco números são, portanto, uma representação numérica de um boxplot. É um pouco complicado, porque as linhas de grade com espaçamento desigual sugerem que os eixos têm uma escala não linear (neste exemplo, eles são lineares). Talvez seja melhor omitir linhas de grade ou forçá-las a estar em locais regulares, e apenas deixar os rótulos mostrarem o resumo dos cinco números.
fonte
Como não havia solução satisfatória para esse tipo de gráfico ao comparar grupos diferentes, escrevi uma função para fazer isso.
Ele funciona para dados agrupados e não agrupados e aceita parâmetros gráficos adicionais:
fonte
Eu encontrei o pacote (
ggpubr
) que parece funcionar muito bem para esse problema e considera várias possibilidades para exibir os dados.O link para o pacote está aqui e neste link você encontrará um bom tutorial para usá-lo. Para completar, anexo um dos exemplos que reproduzi.
Eu instalei o pacote pela primeira vez (requer
devtools
)Para o exemplo particular de exibição de histogramas diferentes para diferentes grupos, ele menciona em relação a
ggExtra
: "Uma limitaçãoggExtra
é que ele não pode lidar com vários grupos no gráfico de dispersão e nos gráficos marginais. No código R abaixo, fornecemos um solução usando ocowplot
pacote ". No meu caso, eu tive que instalar o último pacote:E eu segui este pedaço de código:
O que funcionou bem para mim:
Conjunto de íris de histogramas marginais
fonte
shape = 19
emggscatter
. Códigos para formas aquiVocê pode criar facilmente gráficos de dispersão atraentes com histogramas marginais usando ggstatsplot (ele também se encaixa e descreve um modelo):
Ou um pouco mais atraente (por padrão) ggpubr :
ATUALIZAR:
Conforme sugerido por @aickley, usei a versão de desenvolvimento para criar o enredo.
fonte
Esta é uma pergunta antiga, mas achei que seria útil postar uma atualização aqui, já que me deparei com esse mesmo problema recentemente (obrigado a Stefanie Mueller pela ajuda!).
A resposta mais votada usando o gridExtra funciona, mas o alinhamento dos eixos é difícil / hacky, como foi apontado nos comentários. Agora isso pode ser resolvido usando o comando ggMarginal do pacote ggExtra, da seguinte forma:
fonte
Eu tentei essas opções, mas não estava satisfeito com os resultados ou o código confuso que seria necessário usar para chegar lá. Para minha sorte, Thomas Lin Pedersen acabou de desenvolver um pacote chamado patchwork , que faz o trabalho de uma maneira bastante elegante.
Se você quiser criar um gráfico de dispersão com histogramas marginais, primeiro precisará criar esses três gráficos separadamente.
A única coisa que resta a fazer é adicionar esses lotes com um simples
+
e especificar o layout com a funçãoplot_layout()
.A função
plot_spacer()
adiciona um gráfico vazio ao canto superior direito. Todos os outros argumentos devem ser auto-explicativos.Como os histogramas dependem muito da largura de caixa escolhida, pode-se argumentar que prefere gráficos de densidade. Com algumas pequenas modificações, obteríamos, por exemplo, para os dados de rastreamento ocular, um belo gráfico.
Embora os dados não sejam fornecidos neste momento, os princípios subjacentes devem ser claros.
fonte
Para desenvolver a resposta de @ alf-pascu, configurar cada plotagem manualmente e organizá-las com
cowplot
muita flexibilidade em relação às plotagens principal e marginal (em comparação com algumas das outras soluções). Distribuições por grupos é um exemplo. Alterar o gráfico principal para um gráfico de densidade 2D é outro.A seguir, cria-se um gráfico de dispersão com histogramas marginais (alinhados adequadamente).
Para plotar um gráfico de densidade 2D, basta alterar o gráfico principal.
fonte
Outra solução usando
ggpubr
ecowplot
, mas aqui criamos gráficos usandocowplot::axis_canvas
e os adicionamos ao gráfico original comcowplot::insert_xaxis_grob
:fonte
Atualmente, há pelo menos um pacote CRAN que faz o gráfico de dispersão com seus histogramas marginais.
fonte
Você pode usar a forma interativa
ggExtra::ggMarginalGadget(yourplot)
e escolher entre gráficos de caixas, gráficos de violino, gráficos de densidade e histogramas com facilidade.Curtiu isso
fonte