Наложение двух графиков в Plotly

Используя seaborn, я могу объединить два графика с кодом ниже.

# LINE PLOT
r_30 = r[r['ID']==30] #choosing person 30

g = sns.FacetGrid(r_30, col = "VISIT", sharex=False, sharey=False,aspect=2,col_wrap=2,legend_out=True) # 2 columns, legend is outside of plot

g.map(sns.lineplot, "DATE_TIME", "SBP",color='red',label='SBP',style=r_30['MODE']) # style/shape of line changes with mode

g.map(sns.lineplot, "DATE_TIME", "DBP",color='blue',label='DBP',style=r_30['MODE'])
g.set_axis_labels("DATE_TIME", "Blood Pressure (mmHg)")


Тогда я получаю следующий график:

Я хотел бы иметь такой же сюжет в Plotly, чтобы использовать его в Dash. Для этого я просмотрел старые сообщения и использовал

1)

trace1 = px.scatter(r_30, x = "DATE_TIME", y = "SBP", color = "MODE", facet_col = "VISIT")
trace2 = px.scatter(r_30, x = "DATE_TIME", y = "DBP", color = "MODE", facet_col = "VISIT")
trace1.update_xaxes(matches=None)
trace1.update_yaxes(matches=None)

trace2.update_xaxes(matches=None)
trace2.update_yaxes(matches=None)

fig = go.Figure(data = trace1.data + trace2.data)

app.layout = html.Div(children=[
    html.H1(children='Hello Dash'),

    html.Div(children='''
        Dash: A web application framework for your data.
    '''),

    dcc.Graph(
        id='example-graph',
        figure=sub_fig3
    )
])

if __name__ == '__main__':
    app.run_server(debug=True)

fig = go.Figure(data = trace1.data + trace2.data) работало, но не разделяло графики, как показано выше. Как я могу перестроить код, чтобы у меня были отдельные графики?

Я также использовал другое кодовое решение из SO, но это тоже не разделяет графики.

sub_fig3 = make_subplots(rows=2, cols=2, shared_xaxes=True, vertical_spacing=0.02)

sub_fig3 = sub_fig3.add_trace(trace1.data[0], row=1, col=1)
sub_fig3 = sub_fig3.add_trace(trace1.data[1], row=2, col=1)
sub_fig3 = sub_fig3.add_trace(trace2.data[0], row=1,col=2)
sub_fig3 = sub_fig3.add_trace(trace2.data[1], row=2,col=2)


sub_fig3 = sub_fig3.update_layout(
    xaxis_rangeslider_visible=False,
    xaxis3 = {"anchor": "y3"},
    xaxis2_rangeslider_visible=False,
)

Как я могу получить сюжет в Plotly, как я сделал в Seaborn, как показано на рисунке выше?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Кроме того, не забывайте всегда предоставлять образцы данных. На данный момент я создал образец набора данных.

import pandas as pd
import numpy as np
import random

df = pd.DataFrame({'DATE_TIME':pd.date_range('2022-11-01', '2022-11-05 23:00:00',freq='h'),
                   'SBP':[random.uniform(110, 160) for n in range(120)],
                   'DBP':[random.uniform(60, 100) for n in range(120)]})

df['VISIT'] = df['DATE_TIME'].dt.day

df['MODE'] = np.select([df['VISIT']==1, df['VISIT'].isin([2,3])], ['CKD', 'Dialysis'], 'Late TPL')

fig = px.scatter(df,
         x='DATE_TIME',
         y=['SBP', 'DBP'],
         facet_col='VISIT',
         facet_col_wrap=2,
         symbol='MODE')

fig.update_xaxes(matches=None,
                 showticklabels=True)

fig.show()

спасибо @amance. Это сработало, но сюжетные линии теперь расположены слишком близко друг к другу. Название визита перекрывается с информацией о дате по оси X. Я предполагаю, что проблема возникает, когда showticklabels=True. Есть ли способ обойти это?

dspractician 08.11.2022 13:26

Вы можете настроить интервал, используя facet_row_spacing и facet_col_spacing. Смотрите ссылку здесь.

amance 08.11.2022 18:02

Другие вопросы по теме