Legend는 각 figure 요소가 어떤 의미를 나타내는지를 명시적으로 나타내는 요소이다. 시각적으로 가장 늦게 인식되고, 가장 직관적이지 않은 요소이지만 그래도 한 눈에 알기 쉽게 legend를 달아야 figure 가독성이 올라간다. 최대한 알기 쉽게, 친절하게 달아주자!
Figure 요소 배치를 고려해서 legend 순서를 정하자
Legend가 배치된 순서와, figure 요소가 배치된 순서를 고려해서 legend를 달면 좋다. 각 category에 할당된 색깔을 외워서 plot과 하나하나 시각적으로 매치시키는 것 보다, 배치된 순서를 기억하기가 더 쉽기 때문이다.
먼저 잘못된 예를 보자. 문제점이 무엇일까?
import numpy as np
x1 = np.array(sorted(np.linspace(0, 1, 101)))
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x1, 5 * (x1 - 0.4)**2, label='Alice')
ax.plot(x1, 7 * (x1 - 0.4)**2 - 0.85, label='Bob')
ax.plot(x1, 10 * (x1 - 0.4)**2 + 0.25, label='Carol')
ax.legend()
Python
복사
Lineplot은 위에서 아래로 Carol, Alice, Bob의 순서로 나타나 있지만 legend는 위에서 아래로 Alice, Bob, Carol의 순서로 나타나 있다. 따라서 legend와 plot을 매치시킬 방법은 색깔을 하나하나 외우는 수밖에 없어지게 된다.
좀 더 친절하게 figure를 바꿔 주면 아래와 같다. 작은 차이지만 figure를 이해하기가 조금 더 쉬워진 것을 알 수 있다.
import numpy as np
x1 = np.array(sorted(np.linspace(0, 1, 101)))
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x1, 5 * (x1 - 0.4)**2, label='Alice')
ax.plot(x1, 7 * (x1 - 0.4)**2 - 0.85, label='Bob')
ax.plot(x1, 10 * (x1 - 0.4)**2 + 0.25, label='Carol')
handles, labels = map(np.array, ax.get_legend_handles_labels())
order = [2, 0, 1] # Carol, Bob, Alice
ax.legend(handles[order], labels[order])
Python
복사