Czy planujesz legendę poza obszarem kreślenia w grafice podstawowej?

185

Jak napisano w tytule: Jak wykreślić legendę poza obszarem kreślenia przy użyciu podstawowej grafiki?

Myślałam o tym, aby się bawić layouti stworzyć pustą fabułę, która zawierałaby tylko legendę, ale byłbym zainteresowany w sposób wykorzystujący tylko podstawowe funkcje wykresów i np. par(mar = )Aby uzyskać trochę miejsca po prawej stronie fabuły na legendę.


Oto przykład:

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))

produkuje:

alternatywny tekst

Ale jak już powiedziałem, chciałbym, aby legenda była poza obszarem kreślenia (np. Po prawej stronie wykresu / fabuły.

Henrik
źródło
... możesz też hakować na równi z atrapą pojemnika, aby uzyskać legendę, łatwy i dość wygodny od czasu do czasu. Podobne pytanie tutaj .
hhh
3
@ hhh Link już nie działa. Czy możesz to zaktualizować lub opublikować odpowiedź przy użyciu tego podejścia?
Henrik

Odpowiedzi:

111

Być może potrzebujesz, par(xpd=TRUE)aby umożliwić rysowanie rzeczy poza obszarem fabuły. Więc jeśli wykonasz główną fabułę bty='L', po prawej stronie będzie trochę miejsca na legendę. Zwykle zostanie to przycięte do obszaru fabuły, ale par(xpd=TRUE)z niewielką korektą można uzyskać legendę tak daleko, jak to możliwe:

 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))
Spacedman
źródło
33
Pamiętaj, że możesz przekazać xpd bezpośrednio do legendy, więc nie musisz się martwić o późniejsze resetowanie wartości nominalnej. Zobacz także grconvertX i Y, aby dowiedzieć się, jak określić lokalizację legendy w sposób niezależny od limitów drukowanych danych.
Charles,
6
ponieważ to pytanie i odpowiedź są nadal bardzo popularne, par(xpd=NA)ma jeszcze większą moc (tj. wykresy do większej liczby regionów).
Henrik,
+1. Powinniśmy wspomnieć, że sensowne jest osobne parpołączenie tuż przed legendą. W mojej fabule korzystałem par(new=T)z kilku innych okazji i po prostu chciałem dodać xpdparametr w tym samym wywołaniu, co powoduje problemy.
Matt Bannert,