Python - Интерактивный многострочный график с Plotly Express - каждая линия должна быть основана на аналогичных значениях в столбце - PullRequest
1 голос
/ 17 июня 2020

Необходимо построить несколько линий (большой набор данных - будет ~ 4500 линий) на интерактивном двухмерном линейном графике с использованием Plotly Express.

Проблема в том, что мои переменные (оси x и y) находятся в 2 отдельных столбца, и количество точек данных для каждой строки разное. Количество точек данных для каждой строки будет основано на столбце «API / UWI» - строки, в которых значения «API / UWI» являются постоянными, будут представлять все точки данных для 1 строки.

т.е. при изменении значения в столбце «API / UWI» начинается новая строка.

Пример небольшой части моего набора данных для ясности ниже.

Пример набор данных

В моей первой попытке я разделил фрейм данных на несколько фреймов данных на основе уникальных значений в столбце «API / UWI» и построил все эти фреймы данных в виде графиков. Это сработало! Однако он создал 4500 графиков, а не один график с 4500 линиями.

Есть ли лучший способ выполнить sh это и создать один график с 4500 линиями?

Я разместив ниже мой код для попытки, которую я предпринял выше, вместе с примером созданного графика (с одной строкой).

Пожалуйста, подробно опишите свои решения. Это моя ПЕРВАЯ попытка кодирования любого рода. Я очень новичок. ПОЖАЛУЙСТА И СПАСИБО!

    import plotly.express as px
    import pandas as pd
    import numpy as np

    excel_file = r"C:\Users\kevin\Desktop\Bone_Spring_Data_2.xlsx"

    df = pd.read_excel(excel_file)

    split_values_API = df['API/UWI'].unique()

    for API in split_values_API:
        df1 = df[df['API/UWI'] == API]
        df1 = df1.sort_values(by="Monthly Production Date")
        GOR_data = px.line(df1, x='Monthly Production Date' , y='MONTHLY GOR')
        GOR_data.show()

Пример графика с 1 строкой

* Редактировать в ответ на комментарий:

Результат df.head(21).to_dict() следующим образом:

{'API/UWI': {0: 30015209400000,
  1: 30015209400000,
  2: 30015209400000,
  3: 30015209400000,
  4: 30015209400000,
  5: 30015209400000,
  6: 30015209400000,
  7: 30015209400000,
  8: 30015221570000,
  9: 30015221570000,
  10: 30015221570000,
  11: 30015221570000,
  12: 30015221620000,
  13: 30015221620000,
  14: 30015221620000,
  15: 30015221620000,
  16: 30015221620000,
  17: 30015221620000,
  18: 30015221620000,
  19: 30015221620000,
  20: 30015221620000},
 'Monthly Production Date': {0: Timestamp('2002-04-01 00:00:00'),
  1: Timestamp('2002-05-01 00:00:00'),
  2: Timestamp('2002-06-01 00:00:00'),
  3: Timestamp('2002-07-01 00:00:00'),
  4: Timestamp('2002-08-01 00:00:00'),
  5: Timestamp('2002-09-01 00:00:00'),
  6: Timestamp('2002-10-01 00:00:00'),
  7: Timestamp('2006-07-01 00:00:00'),
  8: Timestamp('2008-08-01 00:00:00'),
  9: Timestamp('2008-09-01 00:00:00'),
  10: Timestamp('2008-10-01 00:00:00'),
  11: Timestamp('2008-11-01 00:00:00'),
  12: Timestamp('2016-10-01 00:00:00'),
  13: Timestamp('2016-11-01 00:00:00'),
  14: Timestamp('2016-12-01 00:00:00'),
  15: Timestamp('2017-01-01 00:00:00'),
  16: Timestamp('2017-02-01 00:00:00'),
  17: Timestamp('2017-03-01 00:00:00'),
  18: Timestamp('2017-04-01 00:00:00'),
  19: Timestamp('2017-05-01 00:00:00'),
  20: Timestamp('2017-06-01 00:00:00')},
 'MONTHLY GOR': {0: 1.278688524590164,
  1: 0.8455284552845529,
  2: 1.8529411764705883,
  3: 0.736,
  4: 1.6818181818181819,
  5: 0.9795918367346939,
  6: 0.5303030303030303,
  7: 0.0,
  8: 14.523809523809524,
  9: 17.07622203811102,
  10: 16.334231805929917,
  11: 14.918367346938776,
  12: 1.4124008651766402,
  13: 1.8545081967213115,
  14: 1.2862351868732909,
  15: 1.4340557275541796,
  16: 2.2898674647285167,
  17: 2.7108673978065805,
  18: 14.311827956989248,
  19: 2.871877001921845,
  20: 2.8629370629370627}}

Это пример набора данных, соответствующий моему примеру (прилагаемый рисунок).

1 Ответ

1 голос
/ 17 июня 2020

Прежде всего, если вы хотите использовать plotly.express, вы можете просто использовать

px.line(df,
        x='Monthly Production Date',
        y='MONTHLY GOR',
        color='API/UWI')

, параметр color позволяет вам иметь строку для каждого другого 'API / UWI' в вашем df.

Если вы хотите использовать plotly.graph_objs вместо этого, вы можете сделать

import plotly.graph_objs as go
fig = go.Figure()
for ts in df.groupby("API/UWI"):
    ts = ts[1]
    fig.add_trace(go.Scatter(x=ts['Monthly Production Date'],
                             y=ts['MONTHLY GOR']))
fig.show()

В этом случае вы добавляете трассировку для каждого «API / UWI».

...