기본 그래픽에서 플롯 영역 외부에 범례를 플롯하시겠습니까?
제목에서 알 수 있듯이:기본 그래픽을 사용할 때 플롯 영역 외부에 범례를 플롯하려면 어떻게 해야 합니까?
저는 당신을 가지고 노는 것에 대해 생각했습니다.layout
범례만 포함하도록 빈 플롯을 생성하지만 기본 그래프 기능만 사용하는 방법에 관심이 있습니다.par(mar = )
그림 오른쪽에 범례를 위한 공간을 확보합니다.
다음은 예입니다.
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))
생성물:
그러나 앞서 말했듯이 범례는 플롯 영역 밖에 있어야 합니다(예: 그래프/플롯 오른쪽).
아무도 네거티브 사용에 대해 언급하지 않았습니다.inset
합니다.legend
다음은 그림 오른쪽에 범례가 있고 위쪽에 정렬된 예제입니다(키워드 사용)."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")
첫 번 째 값의 첫 값inset=c(-0.2,0)
범례의 너비에 따라 조정해야 할 수 있습니다.
어쩌면 당신에게 필요한 것은par(xpd=TRUE)
그림 영역 외부에 그림을 그릴 수 있습니다.그래서 만약 당신이 주요 줄거리를 가지고bty='L'
오른쪽에 전설을 위한 공간이 있을 겁니다일반적으로 이것은 플롯 영역에 잘리지만, 그렇게 합니다.par(xpd=TRUE)
그리고 약간의 조정을 통해 가능한 한 정확하게 범례를 얻을 수 있습니다.
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))
이미 언급된 솔루션 외에 다른 솔루션(사용)layout
또는par(xpd=TRUE)
는 플롯을 전체 장치에 투명 플롯으로 오버레이한 다음 범례를 추가하는 것입니다.
이 방법은 (빈) 그래프를 전체 플롯 영역 위에 오버레이하고 여기에 범례를 추가하는 것입니다.우리는 사용할 수 있습니다.par(fig=...)
장치에 새합니다.먼저 R에게 전체 플롯 장치에 대해 새 플롯을 생성하도록 지시합니다.
par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)
정oma
그리고.mar
우리는 플롯의 내부가 전체 장치를 덮기를 원하기 때문에 필요합니다. new=TRUE
R이 새 장치를 시작하지 못하도록 방지하기 위해 필요합니다.그런 다음 빈 그림을 추가할 수 있습니다.
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
이제 범례를 추가할 준비가 되었습니다.
legend("bottomright", ...)
장치 오른쪽 아래에 범례를 추가합니다.마찬가지로 범례를 위쪽 또는 오른쪽 여백에 추가할 수 있습니다.우리가 보장해야 할 유일한 것은 원래 그림의 여백이 범례를 수용할 수 있을 정도로 크다는 것입니다.
이 모든 것을 기능에 적용하는 것;
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(...)
}
그리고 예를 들어보죠.먼저 그림을 작성하여 아래쪽에 범례를 추가할 수 있는 충분한 공간이 있는지 확인합니다.
par(mar = c(5, 4, 1.4, 0.2))
plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)
그런 다음 범례를 추가합니다.
add_legend("topright", legend=c("Foo", "Bar"), pch=20,
col=c("steelblue", "indianred"),
horiz=TRUE, bty='n', cex=0.8)
결과:
저는 이렇게 하는 것을 좋아합니다.
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))
오른쪽 여백을 범례를 수용할 수 있을 정도로 넓게 설정하는 것이 유일하게 필요한 조정입니다.
그러나 이는 자동화될 수도 있습니다.
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))
오래된 스레드를 부활시켜서 미안하지만, 나는 오늘 같은 문제를 겪었습니다.제가 찾은 가장 간단한 방법은 다음과 같습니다.
# 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)
다음 위치: http://www.harding.edu/fmccown/R/
내 생각에 꽤 우아한 또 다른 간단한 대안을 추가하는 것.
그림:
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("bottomright", c("group A", "group B"), pch=c(1,2), lty=c(1,2),
inset=c(0,1), xpd=TRUE, horiz=TRUE, bty="n"
)
결과:
여기서 범례의 두 번째 줄만 예제에 추가되었습니다.차례로:
inset=c(0,1)
그림 영역의 분율로 범례를 (x,y) 방향으로 이동합니다.는 이경우범다같습다니음과는에 있습니다."bottomright"
("으로 과합니다.x 방향으로 0개의 플로팅 영역("오른쪽"으로 유지됨)과 y 방향으로 1개의 플로팅 영역(하단에서 상단으로)으로 이동합니다.그리고 그것은 우연히도 플롯 바로 위에 나타납니다.xpd=TRUE
범례가 플롯 영역 밖에 나타난다고 합시다.horiz=TRUE
수평 범례를 생성하도록 지시합니다.bty="n"
범례 경계 상자를 제거하기 위한 스타일 세부사항입니다.
범례를 측면에 추가할 때도 마찬가지입니다.
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"
)
여기서는 범례 위치를 조정하고 그래프 오른쪽에 여백 공간을 추가했습니다.결과:
저는 이미 지적한 레이아웃 솔루션의 예만 제시할 수 있습니다.
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))
최근에 저는 당신이 원하는 플롯 영역 밖에서 범례를 인쇄할 수 있는 매우 쉽고 흥미로운 기능을 발견했습니다.
그림의 오른쪽에 바깥쪽 여백을 만듭니다.
par(xpd=T, mar=par()$mar+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")
범례를 추가하고 아래와 같이 로케이터(1) 기능만 사용하시면 됩니다.그런 다음 스크립트를 로드한 후 원하는 위치를 클릭하면 됩니다.
legend(locator(1),c("group A", "group B"), pch = c(1,2), lty = c(1,2))
먹어봐.
Plotly R API를 사용하여 코드를 사용하거나 GUI에서 원하는 위치로 범례를 끌어서 이 작업을 수행할 수 있습니다.
여기 예가 있습니다.그래프와 코드도 여기 있습니다.
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)
x 및 y 값 중 하나를 100 또는 -100에 할당하여 그래프 외부에 범례를 배치할 수 있습니다.
legendstyle = list("x"=100, "y"=1)
layoutstyle = list(legend=legendstyle)
다른 옵션은 다음과 같습니다.
list("x" = 100, "y" = 0)
Bottom의 경우list("x" = 100, "y"= 1)
Top 외부른상단쪽오상단list("x" = 100, "y" = .5)
오른쪽 가운데 바깥쪽list("x" = 0, "y" = -100)
아래 쪽왼래아list("x" = 0.5, "y" = -100)
심래에서list("x" = 1, "y" = -100)
아래
그러면 반응이.
response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));
전화를 걸 때 그래프와 함께 URL을 플롯으로 반환합니다.전화를 하면 더 빨리 액세스할 수 있습니다.browseURL(response$url)
그러면 브라우저에서 그래프가 열립니다.
url = response$url
filename = response$filename
이것이 우리에게 이 그래프를 줍니다.GUI 내에서 범례를 이동할 수도 있습니다. 그러면 그래프가 그에 따라 축척됩니다.전체 공개:저는 플로틀리 팀입니다.
ㅠㅠlayout()
이전에는 아래에 빈 플롯을 만들고 1/4 정도의 크기로 적절하게 조정한 후 범례 부분을 수동으로 배치하여 사용했습니다.
여기에 몇 가지 오래된 질문이 있습니다.legend()
시작할 수 있을 거예요
언급URL : https://stackoverflow.com/questions/3932038/plot-a-legend-outside-of-the-plotting-area-in-base-graphics
'it-source' 카테고리의 다른 글
vuex에서 API에서 데이터를 가져오는 방법 (0) | 2023.07.05 |
---|---|
'완화' 설정내장된 Tomcat에 대한 QueryChars' (0) | 2023.07.05 |
SQL 문에 왼쪽 괄호가 누락되어 혼동되는 오류 (0) | 2023.06.30 |
R에서 ggplot2를 사용하여 히스토그램 중첩 (0) | 2023.06.30 |
Android에서 FirebaseApp.initializeApp(Context)을 먼저 호출하십시오. (0) | 2023.06.30 |