Nice programing

matplotlib : 동일한 그래프에 2 개의 다른 범례

nicepro 2020. 12. 30. 20:26
반응형

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)

다음은 출력의 예입니다. 2 개의 범례, 매개 변수 별 및 알고리즘 별 플롯


다음은이를 수행하는보다 "실무적인"방법입니다 (즉, 그림 축과 명시 적으로 상호 작용).

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

반응형