Plotly: Как создать субплоты с несколькими трассами

Вопрос или проблема

Я строю две фигуры в Plotly, используя этот код:

d = {'1': pd.DataFrame({'x': [1,2,3], 'y': [2,4,6]}), '2': pd.DataFrame({'x': [2,4,6], 'y': [4,6,8]})}


def p1(df, n):
    x = df.x.tolist()
    y = df.y.tolist()
    y_upper = (2*df.y).tolist()
    y_lower = (0.5*df.y).tolist()

    fig = go.Figure([
        go.Scatter(
            x=x,
            y=y,
            mode="lines",
            name=n,
            showlegend=True
        ),
        go.Scatter(
            x=x+x[::-1],
            y=y_upper+y_lower[::-1],
            fill="toself",
            line=dict(color="rgba(255,255,255,0)"),
            hoverinfo='skip',
            showlegend=False
        )
    ])
    return fig


def p2():
    fig_data = tuple(p1(df, n).data for n, df in d.items())
    fig = go.Figure(sum(zip(*fig_data), ()))
    fig.update_layout(xaxis=dict(range=[0, 5],
                                 showgrid=True),
                      yaxis=dict(showgrid=True))
    return fig


def p3():    
    fig = go.Figure()
    for (n, df) in d.items():
        y = df.iloc[1]
        fig.add_trace(go.Bar(
            x=['x', 'y', 'z'],
            y=y,
            name=n,
            text=y,
            textposition='outside'
        ))
    fig.update_layout(bargroupgap=0.1, barmode="group")
    return fig

Я хочу построить эти две фигуры в подграфиках и следую примеру на официальном сайте Plotly:

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

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

fig.add_trace(
    p3().data[0],
    row=1, col=1
)

fig.add_trace(
    p2().data[0],
    row=1, col=2
)

fig.update_layout(height=600, width=800, title_text="Боковые подграфики")
fig.show()

Это не сработает, так как у моих фигур есть больше, чем просто элемент data[0]. Есть ли способ включить все элементы data двух графиков в подграфик?

Вы можете добавить каждую трассу в цикле.

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

for trace in p3().data:
    fig.add_trace(trace,
                  row=1, col=1
                  )

for trace in p2().data:
    fig.add_trace(trace,
                  row=1, col=2
                  )

fig.update_layout(height=600, width=800, title_text="Боковые подграфики")
fig.show()

fig

Ответ или решение

Создание Подграфиков с Несколькими Следами в Plotly

Ваша задача заключается в построении подграфиков для визуализации данных с использованием библиотеки Plotly. Основная проблема, с которой вы столкнулись, заключается в том, что фигуры содержат несколько трасс (следов), и вы хотите отобразить их все на подграфиках. В этом ответе мы подойдем к решению вашей задачи с помощью функции make_subplots.

Пошаговое руководство

  1. Импорт необходимых библиотек:
    Убедитесь, что вы импортировали все необходимые модули Plotly и Pandas:

    import plotly.graph_objects as go
    import pandas as pd
    from plotly.subplots import make_subplots
  2. Создание данных:
    Заполняем ваши данные в формате словаря, где ключами являются идентификаторы, а значениями — датафреймы Pandas.

    d = {
       '1': pd.DataFrame({'x': [1, 2, 3], 'y': [2, 4, 6]}),
       '2': pd.DataFrame({'x': [2, 4, 6], 'y': [4, 6, 8]})
    }
  3. Определение функций для построения графиков:
    Вы уже определили функции p1, p2, и p3, которые создают различные графики. Убедитесь, что они корректно работают, и возвращают объекты Figure с нужными следами.

  4. Использование make_subplots:
    Теперь мы можем создать фигуру с подграфиками и добавить все следы из обеих функций, используя цикл. Это позволит вам избежать проблемы с использованием только первого следа (data[0]).

    # Создание объекта Figure с подграфиками
    fig = make_subplots(rows=1, cols=2, subplot_titles=("График 1", "График 2"))
    
    # Добавление следов от p3 в первый подграфик
    for trace in p3().data:
       fig.add_trace(trace, row=1, col=1)
    
    # Добавление следов от p2 во второй подграфик
    for trace in p2().data:
       fig.add_trace(trace, row=1, col=2)
    
    # Обновление макета графика
    fig.update_layout(height=600, width=800, title_text="Сторонние подграфики")
  5. Отображение графика:
    Теперь, когда все следы добавлены, вы можете отобразить график.

    fig.show()

Заключение

С помощью данного подхода вы сможете легко создать подграфики с несколькими следами и надписями, улучшая читабельность и информативность ваших визуализаций. Совмещение разных типов графиков, таких как линейные графики и гистограммы, может помочь пользователям лучше воспринимать данные и делать выводы.

В случае возникновения дальнейших вопросов или необходимости в помощи, не стесняйтесь обращаться за поддержкой по работе с библиотекой Plotly.

Оцените материал
Добавить комментарий

Капча загружается...