Plotar uma legenda fora da área de plotagem em charts base?

Como o título diz: Como posso plotar uma legenda fora da área de plotagem ao usar charts de base?

Pensei em brincar com o layout e produzir um gráfico vazio para conter apenas a legenda, mas estaria interessado em usar apenas as facilidades do gráfico base e, par(mar = ) exemplo, par(mar = ) para obter algum espaço à direita da plotagem. para a lenda.


Aqui um exemplo:

 plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") legend(1,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) 

produz:

texto alternativo

Mas como disse, eu gostaria que a legenda estivesse fora da área de plotagem (por exemplo, à direita do gráfico / plotagem).

Talvez o que você precise seja par(xpd=TRUE) para permitir que as coisas sejam desenhadas fora da região de plotagem. Então, se você fizer o gráfico principal com bty='L' você terá algum espaço à direita para uma legenda. Normalmente, isso seria cortado na região de plotagem, mas faça par(xpd=TRUE) e, com um pouco de ajuste, você poderá obter uma legenda o mais correta possível:

  set.seed(1) # just to get the same random numbers par(xpd=FALSE) # this is usually the default plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2), bty='L') # this legend gets clipped: legend(2.8,0,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) # so turn off clipping: par(xpd=TRUE) legend(2.8,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) 

Ninguém mencionou o uso de valores negativos inset para legend . Aqui está um exemplo, onde a legenda está à direita da plotagem, alinhada à parte superior (usando a palavra-chave "topright" ).

 # Random data to plot: A < - data.frame(x=rnorm(100, 20, 2), y=rnorm(100, 20, 2)) B <- data.frame(x=rnorm(100, 21, 1), y=rnorm(100, 21, 1)) # Add extra space to right of plot area; change clipping to figure par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) # Plot both groups plot(y ~ x, A, ylim=range(c(A$y, B$y)), xlim=range(c(A$x, B$x)), pch=1, main="Scatter plot of two groups") points(y ~ x, B, pch=3) # Add legend to top right, outside plot region legend("topright", inset=c(-0.2,0), legend=c("A","B"), pch=c(1,3), title="Group") 

O primeiro valor de inset=c(-0.2,0) pode precisar de ajuste com base na largura da legenda.

legend_right

Outra solução, além das ondes já mencionadas (usando layout ou par(xpd=TRUE) ) é sobrepor sua plotagem com uma plotagem transparente sobre todo o dispositivo e depois adicionar a legenda a ela.

O truque é sobrepor um gráfico (vazio) sobre a área de plotagem completa e adicionar a legenda a isso. Podemos usar a opção par(fig=...) . Primeiro, instruímos R a criar um novo gráfico sobre todo o dispositivo de plotagem:

 par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE) 

A configuração de oma e mar é necessária, pois queremos que o interior da plotagem cubra todo o dispositivo. new=TRUE é necessário para evitar que R inicie um novo dispositivo. Podemos então adicionar o gráfico vazio:

 plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n') 

E estamos prontos para adicionar a legenda:

 legend("bottomright", ...) 

irá adicionar uma legenda no canto inferior direito do dispositivo. Da mesma forma, podemos adicionar a legenda à margem superior ou direita. A única coisa que precisamos garantir é que a margem do gráfico original seja grande o suficiente para acomodar a legenda.

Colocando tudo isso em uma function;

 add_legend < - function(...) { opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE) on.exit(par(opar)) plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n') legend(...) } 

E um exemplo. Primeiro crie o enredo certificando-se de que temos espaço suficiente na parte inferior para adicionar a legenda:

 par(mar = c(5, 4, 1.4, 0.2)) plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20) 

Em seguida, adicione a legenda

 add_legend("topright", legend=c("Foo", "Bar"), pch=20, col=c("steelblue", "indianred"), horiz=TRUE, bty='n', cex=0.8) 

Resultando em:

Exemplo da figura mostrada como legenda na margem superior

Desculpe por ressuscitar um thread antigo, mas eu estava com o mesmo problema hoje. A maneira mais simples que encontrei é a seguinte:

 # Expand right side of clipping rect to make room for the legend par(xpd=T, mar=par()$mar+c(0,0,0,6)) # Plot graph normally plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") # Plot legend where you want legend(3.2,1,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) # Restore default clipping rect par(mar=c(5, 4, 4, 2) + 0.1) 

Encontrado aqui: http://www.harding.edu/fmccown/R/

Eu gosto de fazer assim:

 par(oma=c(0, 0, 0, 5)) plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch=2, lty=2, type="o") legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA, c("group A", "group B"), pch=c(1, 2), lty=c(1,2)) 

insira a descrição da imagem aqui

O único ajuste necessário é configurar a margem direita para ser ampla o suficiente para acomodar a legenda.

No entanto, isso também pode ser automatizado:

 dev.off() # to reset the graphics pars to defaults par(mar=c(par('mar')[1:3], 0)) # optional, removes extraneous right inner margin space plot.new() l < - legend(0, 0, bty='n', c("group A", "group B"), plot=FALSE, pch=c(1, 2), lty=c(1, 2)) # calculate right margin width in ndc w <- grconvertX(l$rect$w, to='ndc') - grconvertX(0, to='ndc') par(omd=c(0, 1-w, 0, 1)) plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2, 2)) lines(1:3, rnorm(3), pch=2, lty=2, type="o") legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA, c("group A", "group B"), pch=c(1, 2), lty=c(1, 2)) 

insira a descrição da imagem aqui

Eu posso oferecer apenas um exemplo da solução de layout já apontada.

 layout(matrix(c(1,2), nrow = 1), widths = c(0.7, 0.3)) par(mar = c(5, 4, 4, 2) + 0.1) plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") par(mar = c(5, 0, 4, 2) + 0.1) plot(1:3, rnorm(3), pch = 1, lty = 1, ylim=c(-2,2), type = "n", axes = FALSE, ann = FALSE) legend(1, 1, c("group A", "group B"), pch = c(1,2), lty = c(1,2)) 

uma foto feia: S

Recentemente eu encontrei uma function muito fácil e interessante para imprimir lendas fora da área de plotagem onde você quer.

Faça a margem externa no lado direito da trama.

 par(xpd=T, mar=par()$mar+c(0,0,0,5)) 

Crie um enredo

 plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") 

Adicione legenda e apenas use a function localizador (1) como abaixo. Então você tem que apenas clicar onde quiser depois de carregar o script seguinte.

 legend(locator(1),c("group A", "group B"), pch = c(1,2), lty = c(1,2)) 

Tente

Você poderia fazer isso com a API Plotly R , com código ou da GUI, arrastando a legenda para onde você quiser.

Aqui está um exemplo. O gráfico e o código também estão aqui .

 x = c(0,1,2,3,4,5,6,7,8) y = c(0,3,6,4,5,2,3,5,4) x2 = c(0,1,2,3,4,5,6,7,8) y2 = c(0,4,7,8,3,6,3,3,4) 

Você pode posicionar a legenda fora do gráfico atribuindo um dos valores x e y a 100 ou -100.

 legendstyle = list("x"=100, "y"=1) layoutstyle = list(legend=legendstyle) 

Aqui estão as outras opções:

  • list("x" = 100, "y" = 0) para o lado inferior direito
  • list("x" = 100, "y"= 1) Outside Right Top
  • list("x" = 100, "y" = .5) Outside Right Middle
  • list("x" = 0, "y" = -100) Sob Esquerda
  • list("x" = 0.5, "y" = -100) Em Centro
  • list("x" = 1, "y" = -100) Under Right

Então a resposta.

response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));

Plotamente retorna uma URL com seu gráfico quando você faz uma chamada. Você pode acessar isso mais rapidamente chamando browseURL(response$url) para que ele abra seu gráfico no seu navegador para você.

 url = response$url filename = response$filename 

Isso nos dá esse gráfico. Você também pode mover a legenda de dentro da GUI e, em seguida, o gráfico será dimensionado de acordo. Divulgação completa: estou na equipe Plotly.

Legenda ao lado do gráfico

Tente layout() que eu usei para isso no passado simplesmente criando um gráfico vazio abaixo, dimensionado corretamente em cerca de 1/4 ou mais e colocando as partes da legenda manualmente nele.

Há algumas perguntas mais antigas aqui sobre a legend() que devem ajudá-lo a começar.

Adicionando outra alternativa simples que é bastante elegante na minha opinião.

Seu enredo:

 plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") 

Lenda:

 legend("bottomright", c("group A", "group B"), pch=c(1,2), lty=c(1,2), inset=c(0,1), xpd=TRUE, horiz=TRUE, bty="n" ) 

Resultado:

foto com lenda

Aqui apenas a segunda linha da legenda foi adicionada ao seu exemplo. Por sua vez:

  • inset=c(0,1) – move a legenda pela fração da região de plotagem nas direções (x, y). Neste caso, a legenda está na posição "bottomright" . Ele é movido por 0 plotando regiões na direção x (assim fica na posição “à direita”) e em 1 plotando a região na direção y (de baixo para cima). E acontece que aparece logo acima do enredo.
  • xpd=TRUE – vamos a legenda aparecer fora da região de plotagem.
  • horiz=TRUE – instrui para produzir uma legenda horizontal.
  • bty="n" – um detalhe de estilo para se livrar da checkbox delimitadora da legenda.

O mesmo se aplica ao adicionar legenda ao lado:

 par(mar=c(5,4,2,6)) plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") legend("topleft", c("group A", "group B"), pch=c(1,2), lty=c(1,2), inset=c(1,0), xpd=TRUE, bty="n" ) 

Aqui nós simplesmente ajustamos as posições das legendas e adicionamos mais espaço de margem ao lado direito da trama. Resultado:

foto com a lenda 2