Как использовать столбец в качестве цветового измерения при рисовании с plotly.graph_objects.Scatter? - PullRequest
0 голосов
/ 31 марта 2020

Я смог легко использовать столбец в качестве цветовой переменной при рисовании с помощью plotly express, но изо всех сил пытался сделать то же самое с plotly.graph_objects.Scatter. Также все линии связаны, как их разделить?

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

x_values = range(1, 11)
y_values = ['a', 'b', 'c']

xs, ys, zs = [], [], []

for y in y_values:
    for x in x_values:
        #print(x, y)
        xs.append(x)
        ys.append(y)
        zs.append(np.random.rand())
d = pd.DataFrame({'x': xs, 'y': ys, 'z': zs})

px.line(d, x='x', y='z', color='y')


fig = go.Figure(data=go.Scatter(
    x=d['x'],
    y=d['y'],
    mode='lines'
))

fig.show()

РЕДАКТИРОВАТЬ: Я понимаю, что мы можем использовать различные линии для линий, но я действительно хочу повторить то, что может сделать Plotly Express.

enter image description here

1 Ответ

1 голос
/ 31 марта 2020

Здесь вы должны преобразовать ваш df длинный в широкий, например, с помощью pd.pivot_table и добавить след для каждого нужного столбца.

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

x_values = list(range(1, 11))
y_values = ['a', 'b', 'c']
df = pd.DataFrame({"x":x_values*len(y_values),
                   "y":np.repeat(y_values,len(x_values)),
                   "z":np.random.rand(len(x_values)*len(y_values))})

# px.line(df, x='x', y='z', color='y')

# long 2 wide
pv = pd.pivot_table(df,
                    index = "x",
                    columns="y",
                    values = "z")\
       .reset_index()

fig = go.Figure()
for col in pv.columns[1:]:
    fig.add_trace(go.Scatter(
        x=pv['x'],
        y=pv[col],
        mode='lines',
        name=col
    ))

fig.show()

enter image description here

...