PyMCDA - Low level plotting utilities

Sylen·2024년 11월 3일

Dive to MCDA

목록 보기
3/7

다음은 PyMCDA 패키지의 로우 레벨 플로팅 유틸리티를 활용한 튜토리얼의 한글 번역입니다. 이 튜토리얼에서는 성능 테이블 및 다양한 함수 시각화에 대해 다룹니다.


로우 레벨 플로팅 유틸리티

이 노트북은 패키지에서 제공하는 플로팅 유틸리티를 사용해 성능 테이블과 함수 등을 시각화하는 방법을 보여줍니다.

데이터 가져오기

시각화할 데이터를 가져오기 위해 이전에 사용한 성능 테이블 노트북의 데이터를 불러옵니다.

%matplotlib inline
%config Completer.use_jedi = False
%run performance_table_usage.ipynb

성능 테이블 플로팅하기

성능 테이블을 시각화하기 위해 필요한 라이브러리를 불러옵니다.

from mcda.plot import *
from mcda.transformers import normalize
fig = Figure(ncols=2)

x = [*range(len(alternatives))]
xticks = x
xticklabels = alternatives
for i in criteria:
    values = perfTable.criteria_values[i]
    ax = fig.create_add_axis()
    ax.title = i
    ax.xlabel = "alternatives"
    ax.ylabel = "performances"
    yticks = None
    yticklabels = None
    y = values.data
    if isinstance(values.scale, QualitativeScale):
        y = [v.scale.value(v.value) for v in values.values()]
        yticklabels = values.scale.range()
        yticks = [
            values.scale.value(yy) for yy in yticklabels
        ]
    elif isinstance(values.scale, NominalScale):
        yticklabels = values.scale.range()
        yticks = [*range(len(yticklabels))]
        y = [yticks[yticklabels.index(v.value)] for v in values.values()]
    ax.add_plot(
        BarPlot(
            x,
            y,
            xticks=xticks,
            yticks=yticks,
            xticklabels=xticklabels,
            yticklabels=yticklabels,
            xticklabels_tilted=True,
        )
    )
fig.draw()

참고: 위 코드에서는 BarPlot을 이용해 각 대안별 성과를 시각화합니다. 성과 값은 정성적 척도와 명목 척도에 따라 다르게 변환됩니다.

정규화된 성능 테이블 플로팅

성능 테이블을 정규화한 후 기준별로 시각화할 수 있습니다.

norm_table = normalize(perfTable)

ax = Axis()
ax.xlabel = "alternatives"
ax.ylabel = "performances"
x = [*range(len(alternatives))]
xticks = x
xticklabels = alternatives
values = []
for i in criteria:
    y = norm_table.criteria_values[i].data
    values.append(y)
ax.add_plot(
    StackedBarPlot(
        x,
        values,
        xticks=xticks,
        xticklabels=xticklabels,
        labels=criteria
    )
)
ax.add_legend("Criteria :")
ax.draw()

여기서 StackedBarPlot을 사용해 정규화된 각 기준의 성능을 쌓아 표시합니다.

파이 차트 플로팅

기준별로 파이 차트를 생성할 수도 있습니다.

fig = Figure(ncols=2)

for i in criteria:
    values = norm_table.criteria_values[i].data
    ax = fig.create_add_axis()
    ax.title = i
    ax.add_plot(
        PiePlot(
            alternatives,
            values
        )
    )
fig.draw()

레이더 차트 플로팅

다각형 형태의 레이더 차트를 생성하여 대안의 성능을 시각화합니다.

fig = Figure(ncols=2)

create_radar_projection(len(alternatives), frame="polygon")

for i in criteria:
    values = norm_table.criteria_values[i].data
    ax = fig.create_add_axis(
        projection=radar_projection_name(len(alternatives)))
    ax.title = i
    ax.add_plot(
        RadarPlot(
            alternatives,
            values
        )
    )
fig.draw()

함수 플로팅

특정 함수 f1f2를 시각화합니다. f1의 경우 구간별 선형 함수이며, f2는 람다 함수로 정의됩니다.

ax = Axis(title="Function f1")
x = []
y = []
for interval in f1.intervals:
    if len(x) == 0:
        x.append(interval.dmin)
        y.append(f1(interval.dmin))
    x.append(interval.dmax)
    y.append(f1(interval.dmax))
ax.add_plot(
    LinePlot(
        x,
        y,
        marker="o",
    )
)
ax.draw()

f2 함수 플로팅 및 주석 추가

f2 함수는 다음과 같이 플로팅할 수 있으며, 주석도 추가할 수 있습니다.

ax = Axis(title="Function f2")
x = [0, 0.2, 0.4, 0.6, 0.8, 1]
y = [f2(value) for value in x]
ax.add_plot(
    LinePlot(
        x,
        y,
    )
)
ax.add_plot(
    Text(
        0.25,
        1,
        "$f_2(x) = 2x - 0.5$",
        horizontal_alignement="left",
        box=True,
    )
)
ax.draw()

여기서 Text를 이용해 f2 함수의 방정식을 그래프에 표시합니다.

f3 함수 플로팅

불연속 함수인 f3을 수직 및 수평 스트라이프와 함께 플로팅할 수 있습니다.

ax = Axis(title="Function f3")
ax.add_plot(
    HorizontalStripes(
        [0.5, 1.5, 2.5, 3.5, 4.5, 5.5],
        color="black",
        alpha=0.1,
    )
)
ax.add_plot(
    VerticalStripes(
        [-0.5, 0.5, 1.5, 2.5, 3.5, 4.5],
        color="red",
        alpha=0.1,
        attach_xticks=True,
    )
)
ax.add_plot(
    LinePlot(
        [*range(len(f3.values.keys()))],
        [*f3.values.values()],
        xticks=[*range(len(f3.values.keys()))],
        xticklabels=[*f3.values.keys()],
        linestyle=":",
        marker="o",
    )
)
ax.draw()

여기서는 HorizontalStripesVerticalStripes를 사용하여 구분선을 추가하고, 불연속 값 f3을 시각화합니다.

평행 좌표 플로팅

여러 기준에 대한 대안의 성능을 평행 좌표 그래프를 통해 시각화합니다.

ax = Axis(title="Normalized performances")
x = [*range(len(criteria))]
values = norm_table.data
xticks=[*range(len(criteria))]
xticklabels=criteria
ax.add_plot(
    ParallelCoordinatesPlot(
        x,
        values,
        xticks=xticks,
        xticklabels=xticklabels,
        labels=alternatives,
        linestyle="-.",
    )
)
ax.add_legend(title="Alternatives :", location="right")
ax.draw()

레이더 차트를 통한 대안 비교

모든 대안의 성능을 하나의 레이더 차트에 겹쳐서 표시합니다.

ax = Axis(
    projection=radar_projection_name(len(criteria)),
    title='Superposed normalized performances'
)

for a in alternatives:
    ax.add_plot(
        RadarPlot(
            criteria,
            norm_table.alternatives_values[a].data,
            alpha=0.4,
        )
    )
ax.draw()

이렇게 각 대안을 겹쳐 표시하면, 대안 간의 성능을 쉽게 비교할 수 있습니다.


위 튜토리얼을 통해 PyMCDA에서 제공하는 다양한 플로팅 유틸리티의 사용법을 이해하고, 성능 테이블 및 기준 함수를 시각화하는 방법을 익힐 수 있습니다.

profile
AI가 재밌는 걸

0개의 댓글