그래프를 그리다 보면 자료의 분포가 달라 두개의 y축이 필요한 경우가 있다. 예를 들어 2010년부터 2013년 까지 매출(sale)과 비용(cost)의 자료가 다음과 같다.
year = c(2010, 2011, 2012, 2013)
cost = c(27145, 25455, 20723, 19054)
sale = c(41678, 44980, 57653, 73286)
이 자료로 선그래프로 그리고 싶다. x축은 year, y축은 cost, sale을 그리는데 sale은 빨간색으로 그리고 싶다.
plot(cost ~ year, type = "l")
plot(sale ~ year, type = "l", col = "red")
하지만 이렇게 하면 두개의 그래프가 따로따로 나온다. 그 이유는 plot이 고수준 그래픽 함수라서 plot을 호출하면 화면을 지우고 그래프를 처음부터 다시 그리기 때문이다. 따라서 두개의 그래프를 그리려면 하나는 plot을 쓰고 하나는 저수준 함수인 lines를 사용하여 그려야 한다. 다음과 같이 해보자.
plot(cost ~ year, type = "l")
lines(year, sale, col = "red")
그런데 lines로 그린 선이 안보인다. 왜 그럴까? 답은 바로 그래프의 y축이 20000-26000까지이므로 40000-73000범위인 sale자료는 화면 위쪽에 안보이는 곳에 그려져서이다. 이를 해결하기 위해 y축의 범위를 20000-80000까지로 바꾸면
plot(cost ~ year, type = "l", ylim = c(20000, 80000), xlab = "year", ylab = "")
lines(year, sale, col = "red")
이 그래프는 문제가 두개 있다. 하나는 x축에 눈금이 2010.5등으로 표시되는 것이다. 또 다른 하나는 두개의 선이 너무 달라 비용이 감소하는 것이 잘 안보여 두개의 y축으로 그래프를 그리고 싶다. 먼저 축 문제를 해결하는 방법은 자동으로 축을 그리지 말고 plot함수는 축을 그리지말고(axes=FALSE), 따로 축을 그려 해결할 수 있다.
plot(cost ~ year, type = "l", ylim = c(20000, 80000), axes = FALSE, xlab = "year",
ylab = "")
lines(year, sale, col = "red")
axis(side = 1, at = 2010:2013, labels = year, line = 2)
axis(side = 2, )
두번째 문제는 다음과 같이 해결할수 있다. 먼저 plot을 이용해 그림을 그리고 두번째 그래프를 그리기 전에 par(new=TRUE)를 써주면 첫번째 그래프 위에 두번째 그래프를 그린다.
plot(cost ~ year, type = "l", axes = FALSE, xlab = "year", ylab = "cost")
lines(year, sale, col = "red")
axis(side = 1, at = 2010:2013, labels = year, line = 2)
axis(side = 2, )
par(new = TRUE)
plot(sale ~ year, type = "l", axes = FALSE, xlab = "", ylab = "", col = "red")
axis(side = 4, col = "red")
mtext("sale", side = 4, col = "red")
아직도 남은 문제는 두번째 y축의 sale이라는 글자가 있는 위치가 맘에 안들고 오른쪽 축의 글씨도 빨간색으로 고쳤으면 좋겠다. 이것을 해결한 최종 코드는 다음과 같다.
# 그래프 오른쪽 에 margin을 줌
par(mar = c(5, 4, 4, 6) + 0.1)
plot(cost ~ year, type = "b", pch = 1, col = "black", axes = FALSE, xlab = "",
ylab = "", main = "Sale and Cost, 2010-2013")
axis(side = 2, )
mtext("Cost", side = 2, line = 2.5)
box()
par(new = TRUE)
plot(sale ~ year, type = "b", pch = 2, col = "red", axes = FALSE, xlab = "",
ylab = "")
axis(side = 1, at = 2010:2013, labels = year)
mtext("Year", side = 1, line = 2)
axis(side = 4, col = "red", col.axis = "red")
mtext("Sale", side = 4, col = "red", line = 2.5)
legend("top", legend = c("cost", "sale"), text.col = c("black", "red"), pch = c(1,
2), col = c("black", "red"))