Plotly Subplots에서 동시에 다른 Barmodes(Python)

내 첫 번째이자 가장 많이 읽은 블로그 게시물은 대략적으로 다음과 같습니다.




이것이 아마도 최근에 Plotly 서브플롯에서 두 개의 서로 다른 바 모드를 동시에 가질 수 있는 방법에 대해 묻는 이메일을 받은 이유일 것입니다. 첫 번째 것은 쌓이고 두 번째 것은 그룹화해야 합니다. 항상 그렇듯이 다른 사람이 이 문제를 해결했는지 알아보기 위해 검색을 시작했습니다. 그러나 내가 찾을 수 있는 유일한 게시물은 플롯 커뮤니티 포럼에서 수행할 수 없다는 답변이었습니다. 스포일러 경고, 할 수 있습니다. 그것에 들어가자!

참고: 코드를 살펴보고 싶다면 끝에 있는 하나의 큰 블록으로 전체 예제를 찾을 수 있습니다.

자료



이전 블로그 게시물과 동일한 데이터를 사용하고 있습니다.

data = {
    "original":[15, 23, 32, 10, 23],
    "model_1": [4,   8, 18,  6,  0],
    "model_2": [11, 18, 18,  0,  20],
    "labels": [
        "feature",
        "question",
        "bug",
        "documentation",
        "maintenance"
    ]
}


원본, model_1, model_2 및 레이블의 4개 열이 있는 테이블/데이터 프레임으로 생각할 수 있습니다. 목록의 내용은 행입니다.

구성



내 초기 연구 결과에 따르면 이를 수행하는 직접적인 방법은 없습니다. 그러나 자연스러운 출발점은 시작하기 위해 서브플롯을 수행하는 방법을 살펴보는 것입니다. 우선, plotly에서 필요한 것이 무엇인지 살펴보겠습니다.

from plotly.subplots import make_subplots
from plotly import graph_objects as go

graph_objects , 줄여서 go 는 plotly의 핵심 라이브러리입니다. 이 예에서는 막대 차트를 나타내는 Bar 클래스만 사용할 것입니다. 나는 여러분 모두가 우리가 makes_subplots를 사용하여 서브플롯을 만들 것이라는 것을 이미 알아냈다고 생각합니다.

시작할 표준 서브플롯



시작하는 두 개의 막대 차트가 있는 표준 하위 그림입니다.

fig = make_subplots(rows=2, cols=1)

# Subplot 1
fig.add_trace(
    go.Bar(
        name="Original",
        x=data["labels"],
        y=data["original"],
    ),
    row=1,
    col=1,
)

# Subplot 2
fig.add_trace(
    go.Bar(
        name="Model 1",
        x=data["labels"],
        y=data["model_1"],
    ),
    row=2,
    col=1,
)

fig.show()


여기서 흥미로운 일이 많이 일어나지 않습니다. 2개의 행과 1개의 열이 있는 서브플롯을 만듭니다. 그런 다음 두 개의 막대 차트를 추가합니다. 하나는 첫 번째 행에, 다른 하나는 두 번째 행에 추가합니다. 결과는 다음과 같습니다.

각 서브플롯의 다중 막대 차트



자, 이제 확실한 출발점이 생겼습니다. make_subplots 함수는 추적을 추가하는 단일 그림 개체를 반환합니다. 트레이스를 추가할 때 트레이스를 추가해야 하는 서브플롯을 플롯으로 알려줍니다. 각 서브플롯에 여러 막대 차트를 포함하도록 솔루션을 확장해 보겠습니다.

fig = make_subplots(rows=2, cols=1)

# Subplot 1
fig.add_trace(
    go.Bar(
        name="Original",
        x=data["labels"],
        y=data["original"],
    ),
    row=1,
    col=1,
)
fig.add_trace(
    go.Bar(
        name="Model 1",
        x=data["labels"],
        y=data["model_1"],
    ),
    row=1,
    col=1,

)

# Subplot 2
fig.add_trace(
    go.Bar(
        name="Original",
        x=data["labels"],
        y=data["original"],
    ),
    row=2,
    col=1,
)
fig.add_trace(
    go.Bar(
        name="Model 1",
        x=data["labels"],
        y=data["model_1"],
    ),
    row=2,
    col=1,
)

fig.show()


각 서브플롯에 동일한 데이터를 포함하는 두 개의 막대 차트를 추가합니다. 결과는 다음과 같습니다.



해결책



이제 솔루션의 마지막 단계에 도달할 수 있습니다. 독립 막대 차트의 스타일을 지정합니다. 일반적으로 누적 막대 차트로 변경하려면 다음과 같이 사용했을 것입니다.

fig.update_layout({"barmode":"stack"})


그러나 이것은 자동으로 두 서브플롯을 대상으로 하며 이를 변경할 방법이 없습니다. 그런 다음 해결책은 이전 플롯 게시물에서와 동일한 트릭을 사용하고 수동으로 누적 및 그룹화된 막대 차트를 만드는 것입니다. 이것은 Bar 개체를 직접 변경하고 Figure 의 스타일이 아니기 때문에 작동합니다.

fig = make_subplots(rows=2, cols=1)

# Subplot 1 - Stacked
fig.add_trace(
    go.Bar(
        name="Original",
        x=data["labels"],
        y=data["original"],
        offsetgroup=0,
    ),
    row=1,
    col=1,
)
fig.add_trace(
    go.Bar(
        name="Model 1",
        x=data["labels"],
        y=data["model_1"],
        offsetgroup=0,
        base=data["original"]
    ),
    row=1,
    col=1,

)

# Subplot 2 - Grouped
fig.add_trace(
    go.Bar(
        name="Original",
        x=data["labels"],
        y=data["original"],
        offsetgroup=0,
    ),
    row=2,
    col=1,
)
fig.add_trace(
    go.Bar(
        name="Model 1",
        x=data["labels"],
        y=data["model_1"],
        offsetgroup=1,
    ),
    row=2,
    col=1,
)

fig.show()


스택 버전을 생성할 때 두 객체offsetgroup에 대해 Bar를 0으로 설정했습니다. 이렇게 하면 x축을 따라 동일한 위치에 배치됩니다. 그러나 두 번째는 위가 아닌 첫 번째 앞에만 렌더링됩니다. 따라서 두 번째base 개체에 대한 Bar 매개변수를 다른 개체의 값 목록으로 설정합니다. 이렇게 하면 "Original"의 해당 막대 높이를 기준으로 "Model 1"의 각 막대의 y 위치가 이동하여 누적 막대 차트가 생성됩니다. 그룹화된 서브플롯을 만들려면 offsetgroup 개체의 Bar에 다른 값을 할당하기만 하면 됩니다.

참고: 에서 이 스택 및 그룹화가 작동하는 방식에 대해 자세히 알아볼 수 있습니다.

이제 마지막 공개입니다.

엔터티 예시



완성된 전체 예제에 대한 모든 코드는 다음과 같습니다. 플롯으로 설치했다면 예를 들어 이것을 복사하여 붙여넣을 수 있습니다. Jupyter 노트북으로 최종 플롯을 얻습니다.

from plotly.subplots import make_subplots
from plotly import graph_objects as go

data = {
    "original":[15, 23, 32, 10, 23],
    "model_1": [4,   8, 18,  6,  0],
    "model_2": [11, 18, 18,  0,  20],
    "labels": [
        "feature",
        "question",
        "bug",
        "documentation",
        "maintenance"
    ]
}


fig = make_subplots(rows=2, cols=1)

# Subplot 1 - Stacked
fig.add_trace(
    go.Bar(
        name="Original",
        x=data["labels"],
        y=data["original"],
        offsetgroup=0,
    ),
    row=1,
    col=1,
)
fig.add_trace(
    go.Bar(
        name="Model 1",
        x=data["labels"],
        y=data["model_1"],
        offsetgroup=0,
        base=data["original"]
    ),
    row=1,
    col=1,

)

# Subplot 2 - Grouped
fig.add_trace(
    go.Bar(
        name="Original",
        x=data["labels"],
        y=data["original"],
        offsetgroup=0,
    ),
    row=2,
    col=1,
)
fig.add_trace(
    go.Bar(
        name="Model 1",
        x=data["labels"],
        y=data["model_1"],
        offsetgroup=1,
    ),
    row=2,
    col=1,
)

fig.show()

좋은 웹페이지 즐겨찾기