Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Python 그림과 대화형 Plotly

그림을 만들 노드의 입력 유형을 코드에 맞춰 선택합니다. Matplotlib과 Seaborn은 plt.show()로 Workbook UI에 결과를 전달하며, 다음의 @synchronous_node_execution은 Workbook이 제공하는 실행 직렬화 decorator입니다.

Spark에서 집계한 히스토그램

입력 input_dataset을 Spark dataframe으로 읽습니다. column_to_plot은 수치 열이며 예시의 구간 수는 20입니다. Spark에서 구간별 개수를 계산하므로 전체 원시 값을 Pandas로 수집하지 않습니다.

@synchronous_node_execution
def viz_plot_univariate_distribution_using_histogram(input_dataset):
    import matplotlib.pyplot as plt

    selected_column = "column_to_plot"
    number_of_bins = 20
    values = input_dataset.select(selected_column).rdd.flatMap(lambda row: row)
    bins, counts = values.histogram(number_of_bins)

    fig, ax = plt.subplots()
    ax.hist(bins[:-1], bins=bins, weights=counts, density=True)
    ax.set_xlabel(selected_column)
    ax.set_ylabel("Probability density")
    ax.set_title("Histogram of " + selected_column)
    fig.tight_layout()
    plt.show()
    plt.close(fig)

density=True는 빈도 수 자체가 아니라 면적의 합이 1인 확률 밀도로 표시합니다. 자동 구간 계산에는 사용할 수치 범위가 있어야 하며 무한대 값은 Spark histogram에서 오류를 냅니다. 빈 입력이나 하나의 값만 있는 분포는 업무상 필요한 구간 경계를 별도로 정하는 것이 적합합니다.

Seaborn

환경 프로필에 Seaborn을 추가해야 합니다. pandas_df는 각각 표시할 열을 가진 Pandas dataframe으로 읽습니다.

관계도

다음은 price와 minimum_nights의 관계를 그립니다.

@synchronous_node_execution
def seaborn_example(pandas_df):
    import matplotlib.pyplot as plt
    import seaborn as sns

    sns.set_theme()
    grid = sns.relplot(data=pandas_df, x="price", y="minimum_nights")
    plt.show()
    plt.close(grid.figure)

바이올린 그림

col_A는 범주, col_B는 수치 열입니다.

@synchronous_node_execution
def seaborn_violinplot(pandas_df):
    import matplotlib.pyplot as plt
    import seaborn as sns

    fig, ax = plt.subplots()
    sns.violinplot(x="col_A", y="col_B", data=pandas_df, ax=ax)
    plt.show()
    plt.close(fig)

Seaborn도 Matplotlib 기반이므로 show()가 있어야 Workbook의 그림 결과로 전달됩니다.

SVG 출력

Matplotlib과 Seaborn의 기본 출력은 PNG입니다. SVG가 필요하면 그리기 전에 함수 안에서 set_output_image_type('svg')를 호출합니다. 또는 함수 정의 위에 @output_image_type('svg')를 붙일 수 있습니다. 두 이름은 일반 Matplotlib 함수가 아니라 Workbook 런타임이 제공하는 설정입니다.

한국어와 일본어 레이블

Noto Sans CJK JP 같은 해당 문자를 포함한 글꼴을 지정합니다. 아래는 글꼴 표시를 위한 가상 좌표값입니다.

@synchronous_node_execution
def japanese_korean_matplotlib_example():
    import matplotlib.pyplot as plt

    with plt.rc_context({"font.family": "Noto Sans CJK JP"}):
        x = [10, 20, 30, 40, 50]
        y = [30, 30, 30, 30, 30]
        fig, ax = plt.subplots()
        ax.plot(x, y, label="ライン1")
        ax.plot(y, x, label="선2")
        ax.set_xlabel("X-軸")
        ax.set_ylabel("Y-축")
        ax.legend()
        ax.set_title("日本語ラベル図の例 // 한글 라벨 도표의 예시")
        plt.show()
        plt.close(fig)

기본 설치 경로와 Matplotlib 2의 TTC 처리 방법은 글꼴 참조에 있습니다.

Plotly Express

환경에 Plotly를 추가합니다. 다음은 Plotly Express가 제공하는 iris 데이터를 사용하므로 별도 입력 노드가 필요하지 않습니다.

def plotly_example():
    import plotly.express as px

    iris = px.data.iris()
    fig = px.scatter(
        iris, x="sepal_width", y="sepal_length", color="species"
    )
    fig.show()

결과는 Visualizations 탭에 나타나며 전체 화면에서 확대와 선택을 사용할 수 있습니다.

Frame 애니메이션

다음은 두 점의 좌표를 세 프레임으로 바꾸는 표시 예제입니다. Play 버튼의 animate와 [None]은 모든 프레임을 재생하도록 지정합니다.

def plotly_animation():
    import plotly.graph_objects as go

    fig = go.Figure(
        data=[go.Scatter(x=[0, 1], y=[0, 1])],
        layout=go.Layout(
            xaxis=dict(range=[0, 5], autorange=False),
            yaxis=dict(range=[0, 5], autorange=False),
            title=dict(text="Start Title"),
            updatemenus=[
                dict(
                    type="buttons",
                    buttons=[dict(label="Play", method="animate", args=[None])],
                )
            ],
        ),
        frames=[
            go.Frame(data=[go.Scatter(x=[1, 2], y=[1, 2])]),
            go.Frame(data=[go.Scatter(x=[1, 4], y=[1, 4])]),
            go.Frame(
                data=[go.Scatter(x=[3, 4], y=[3, 4])],
                layout=go.Layout(title_text="End Title"),
            ),
        ],
    )
    fig.show()

Plotly도 콘솔에서는 정적인 PNG로 표시됩니다. 대화형이나 애니메이션을 사용하려면 변환 노드에서 실행합니다. 큰 산점도의 20,000점 권장 제한과 scattergl 선택은 시각화 실행 조건을 따릅니다.