matplotlib : 동일한 그래프에 2 개의 다른 범례
다른 매개 변수에 다른 색상이 사용되고 다른 알고리즘에 다른 선 스타일이 사용되는 플롯이 있습니다. 목표는 유사한 매개 변수로 수행 된 여러 알고리즘의 결과를 비교하는 것입니다. 즉, 동일한 그래프에 총 12 개의 플롯에 대해 총 4 가지 색상과 3 가지 선 스타일을 사용합니다.
실제로 색상을 기반으로 범례를 작성하고 각 색상을 해당 매개 변수와 연결합니다. 이제 동일한 그래프에 각 선 스타일의 의미와 함께 두 번째 범례를 표시하고 싶습니다. 그것을 달성 할 수 있습니까? 어떻게?
실제로 내 코드는 다음과 같습니다.
colors = ['b', 'r', 'g', 'c']
cc = cycle(c)
for p in parameters:
d1 = algo1(p)
d2 = algo2(p)
d3 = algo3(p)
pyplot.hold(True)
c = next(cc)
pyplot.plot(d1, '-', color=c, label="d1")
pyplot.plot(d1, '--', color=c)
pyplot.plot(d2, '.-', color=c)
pyplot.legend()
해당 주제에 대한 matplotlib 문서의 섹션이 있습니다. http://matplotlib.org/users/legend_guide.html#multiple-legends-on-the-same-axes
구체적인 예에 대한 코드는 다음과 같습니다.
import itertools
from matplotlib import pyplot
colors = ['b', 'r', 'g', 'c']
cc = itertools.cycle(colors)
plot_lines = []
for p in parameters:
d1 = algo1(p)
d2 = algo2(p)
d3 = algo3(p)
pyplot.hold(True)
c = next(cc)
l1, = pyplot.plot(d1, '-', color=c)
l2, = pyplot.plot(d2, '--', color=c)
l3, = pyplot.plot(d3, '.-', color=c)
plot_lines.append([l1, l2, l3])
legend1 = pyplot.legend(plot_lines[0], ["algo1", "algo2", "algo3"], loc=1)
pyplot.legend([l[0] for l in plot_lines], parameters, loc=4)
pyplot.gca().add_artist(legend1)
다음은 출력의 예입니다.
다음은이를 수행하는보다 "실무적인"방법입니다 (즉, 그림 축과 명시 적으로 상호 작용).
import itertools
from matplotlib import pyplot
fig, axes = plt.subplot(1,1)
colors = ['b', 'r', 'g', 'c']
cc = itertools.cycle(colors)
plot_lines = []
for p in parameters:
d1 = algo1(p)
d2 = algo2(p)
d3 = algo3(p)
c = next(cc)
axes.plot(d1, '-', color=c)
axes.plot(d2, '--', color=c)
axes.plot(d3, '.-', color=c)
# In total 3x3 lines have been plotted
lines = axes.get_lines()
legend1 = pyplot.legend([lines[i] for i in [0,1,2]], ["algo1", "algo2", "algo3"], loc=1)
legend2 = pyplot.legend([lines[i] for i in [0,3,6]], parameters, loc=4)
axes.add_artist(legend1)
axes.add_artist(legend2)
덜 모호한 방식으로 다른 축을 가지고 놀 수 있기 때문에 나는 이것을 쓰는 방법을 좋아합니다. 먼저 범례 집합을 만든 다음 "add_artist"메서드를 사용하여 원하는 축에 추가 할 수 있습니다. 또한 저는 matplotlib로 시작하고 있으며 적어도 객체가 명시적일 때 스크립트를 이해하는 것이 더 쉽습니다.
주의 : 표시 / 저장 중에 범례가 잘릴 수 있으니주의하세요. 이 문제를 해결하려면 axes.set_position ([left, bottom, width, length]) 메서드를 사용하여 그림 크기에 비해 서브 플롯을 축소하고 범례를 표시하십시오.
참조 URL : https://stackoverflow.com/questions/12761806/matplotlib-2-different-legends-on-same-graph
'Nice programing' 카테고리의 다른 글
Java에서 분을 시간 및 분 (hh : mm)으로 변환하는 방법 (0) | 2020.12.31 |
---|---|
텍스트 양에 따라 UITableViewCell 높이 변경 (0) | 2020.12.31 |
contenteditable div의 자리 표시 자 (0) | 2020.12.30 |
Android-WebView 언어가 Android 7.0 이상에서 갑자기 변경됨 (0) | 2020.12.30 |
.pde 확장자를 사용하는 언어는 무엇입니까? (0) | 2020.12.30 |