Eu gostaria de colocar dois gráficos lado a lado usando o pacote ggplot2 , ou seja, faça o equivalente a par(mfrow=c(1,2))
.
Por exemplo, eu gostaria que os dois gráficos a seguir mostrassem lado a lado com a mesma escala.
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
Preciso colocá-los no mesmo data.frame?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
r
visualization
ggplot2
Christopher DuBois
fonte
fonte
Respostas:
Qualquer gráfico gg lado a lado (ou n gráficos em uma grade)
A função
grid.arrange()
nogridExtra
pacote combinará várias plotagens; é assim que você coloca dois lado a lado.Isso é útil quando os dois gráficos não se baseiam nos mesmos dados, por exemplo, se você deseja plotar variáveis diferentes sem usar reshape ().
Isso plotará a saída como um efeito colateral. Para imprimir o efeito de um lado para um arquivo, especificar um controlador de dispositivo (tais como
pdf
,png
, etc.), por exemplo,ou use
arrangeGrob()
em combinação comggsave()
,Isso é o equivalente a fazer dois gráficos distintos usando
par(mfrow = c(1,2))
. Isso não apenas economiza tempo na organização dos dados, como também é necessário quando você deseja dois gráficos diferentes.Apêndice: Usando facetas
As facetas são úteis para fazer gráficos semelhantes para grupos diferentes. Isso é indicado abaixo em muitas respostas abaixo, mas quero destacar essa abordagem com exemplos equivalentes aos gráficos acima.
Atualizar
a
plot_grid
função nocowplot
vale a pena conferir como uma alternativa paragrid.arrange
. Veja a resposta de @ claus-wilke abaixo e esta vinheta para uma abordagem equivalente; mas a função permite controles mais refinados na localização e tamanho da plotagem, com base nessa vinheta .fonte
?grid.arrange
me faz pensar que essa função agora é chamada de arranjoGrob. Eu era capaz de fazer o que queria fazendoa <- arrangeGrob(p1, p2)
e depoisprint(a)
.grid.arrange
ainda é uma função válida e não obsoleta. Você tentou usar a função? O que acontece, se não o que você esperava.Uma desvantagem das soluções baseadas
grid.arrange
é que elas dificultam rotular as parcelas com letras (A, B, etc.), como a maioria dos periódicos exige.Eu escrevi o pacote cowplot para resolver este (e mais alguns) problemas, especificamente a função
plot_grid()
:O objeto que
plot_grid()
retorna é outro objeto ggplot2, e você pode salvá-loggsave()
como de costume:Como alternativa, você pode usar a função cowplot
save_plot()
, que é um invólucro finoggsave()
que facilita a obtenção das dimensões corretas para plotagens combinadas, por exemplo:(O
ncol = 2
argumento dizsave_plot()
que há duas plotagens lado a lado esave_plot()
torna a imagem salva duas vezes maior.)Para uma descrição mais detalhada de como organizar plotagens em uma grade, consulte esta vinheta. Há também uma vinheta explicando como fazer gráficos com uma legenda compartilhada.
Um ponto frequente de confusão é que o pacote cowplot altera o tema padrão do ggplot2. O pacote se comporta dessa maneira porque foi originalmente escrito para uso em laboratório interno e nunca usamos o tema padrão. Se isso causar problemas, você pode usar uma das três abordagens a seguir para solucionar isso:
1. Defina o tema manualmente para cada plot. Eu acho que é uma boa prática sempre especificar um tema específico para cada enredo, assim como fiz
+ theme_bw()
no exemplo acima. Se você especificar um tema específico, o tema padrão não importa.2. Reverta o tema padrão para o padrão ggplot2. Você pode fazer isso com uma linha de código:
3. Chame as funções do cowplot sem anexar o pacote. Você também não pode chamar
library(cowplot)
ou, emrequire(cowplot)
vez disso, chamar funções de cowplot anexandocowplot::
. Por exemplo, o exemplo acima usando o tema padrão ggplot2 se tornaria:Atualizações:
fonte
Você pode usar a seguinte
multiplot
função no livro de receitas R de Winston Changfonte
Usando o pacote de retalhos , você pode simplesmente usar o
+
operador:fonte
Sim, acho que você precisa organizar seus dados adequadamente. Uma maneira seria a seguinte:
Tenho certeza de que existem truques melhores em plyr ou remodelar - ainda não estou realmente atualizado sobre todos esses pacotes poderosos da Hadley.
fonte
Usando o pacote remodelar, você pode fazer algo assim.
fonte
Há também um pacote multipanelfigure que vale a pena mencionar. Veja também esta resposta .
Criado em 06/07/2018 pelo pacote reprex (v0.2.0.9000).
fonte
O ggplot2 é baseado em gráficos de grade, que fornecem um sistema diferente para organizar gráficos em uma página. O
par(mfrow...)
comando não tem um equivalente direto, pois os objetos de grade (chamados grobs ) não são necessariamente desenhados imediatamente, mas podem ser armazenados e manipulados como objetos R regulares antes de serem convertidos em uma saída gráfica. Isso permite maior flexibilidade do que desenhar agora modelo de gráficos de base, mas a estratégia é necessariamente um pouco diferente.Eu escrevi
grid.arrange()
para fornecer uma interface simples o mais próximo possívelpar(mfrow)
. Na sua forma mais simples, o código seria semelhante a:Mais opções são detalhadas nesta vinheta .
Uma queixa comum é que as plotagens não estão necessariamente alinhadas, por exemplo, quando elas possuem rótulos de eixo de tamanho diferente, mas isso ocorre por design:
grid.arrange
não faz nenhuma tentativa para objetos especiais do caso ggplot2, e os trata igualmente para outros grobs (plotagens de treliça, por exemplo ) Apenas coloca as garras em um layout retangular.Para o caso especial dos objetos ggplot2, escrevi outra função,
ggarrange
com uma interface semelhante, que tenta alinhar os painéis de plotagem (incluindo plotagens facetadas) e tenta respeitar as proporções de aspecto quando definidas pelo usuário.Ambas as funções são compatíveis com
ggsave()
. Para uma visão geral das diferentes opções e algum contexto histórico, esta vinheta oferece informações adicionais .fonte
Atualização: Esta resposta é muito antiga.
gridExtra::grid.arrange()
agora é a abordagem recomendada. Deixo isso aqui caso seja útil.Stephen Turner postou a
arrange()
função no blog Getting Genetics Done (consulte a publicação para obter instruções sobre a aplicação)fonte
grid.arrange
(gostaria de não ter postado nas listas de discussão no momento - não há como atualizar esses recursos on-line), a versão empacotada é uma escolha melhor se você me perguntarUsando
tidyverse
:fonte
As soluções acima podem não ser eficientes se você deseja plotar várias plotagens ggplot usando um loop (por exemplo, conforme solicitado aqui: Criando múltiplas plotagens no ggplot com diferentes valores do eixo Y usando um loop ), que é uma etapa desejada na análise do desconhecido ( ou grandes) conjuntos de dados (por exemplo, quando você deseja plotar contagens de todas as variáveis em um conjunto de dados).
O código abaixo mostra como fazer isso usando o 'multiplot ()' mencionado acima, cuja fonte está aqui: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
Agora execute a função - para obter Counts para todas as variáveis impressas usando ggplot em uma página
Uma coisa a observar é que:
using
aes(get(strX))
, que você usaria normalmente em loops ao trabalharggplot
, no código acima, em vez deaes_string(strX)
NÃO, desenhará os gráficos desejados. Em vez disso, ele plotará o último gráfico várias vezes. Eu não descobri o porquê - pode ser necessário fazer issoaes
eaes_string
ser chamadoggplot
.Caso contrário, espero que você ache a função útil.
fonte
plots
objetos nosfor-loop
quais é altamente ineficiente e não é recomendadoR
. Por favor, veja estes grandes mensagens para descobrir melhores maneiras de fazer isso: acumulação eficiente em R , aplicação de uma função sobre linhas de um quadro de dados e fluxos de trabalho no R Row-orientado com o tidyversetidy evaluation
abordagem que está disponível desdeggplot2 v.3.0.0
stackoverflow.com/a/52045613/786542Na minha experiência, gridExtra: grid.arrange funciona perfeitamente, se você estiver tentando gerar gráficos em um loop.
Snippet de código curto:
fonte
O
cowplot
pacote oferece uma ótima maneira de fazer isso, de maneira adequada à publicação.fonte