Plotly: как сгруппировать данные и указать цвета, используя go .box вместо px.box? - PullRequest
1 голос
/ 08 марта 2020

Вопрос:

Используя plotly express, вы можете группировать данные и назначать разные цвета, используя color=<group> in px.box(). Но как вы можете сделать то же самое, используя plotly.graph_objects и go.box()

Некоторые детали:

Plotly Express это хорошо, но иногда нам нужно больше, чем основы. Поэтому я попытался использовать вместо этого Plotly Go, но тогда я не могу понять, как разбить графики на блоки с группами без добавления go.Box для каждой группы вручную, как в документации.

Вот код, который я взял из документации для Plotly Express:

import plotly.express as px

df = px.data.tips()
fig = px.box(df, x="time", y="total_bill", color="smoker",
             notched=True, # used notched shape
             title="Box plot of total bill",
             hover_data=["day"] # add day column to hover data
            )
fig.show()

Как добиться того же в Plotly Go? Поскольку свойство color не распознается как действительное.

import plotly.graph_objects as go

df = px.data.tips()
fig = go.Figure(go.Box(
    x=df.time, 
    y=df.total_bill, 
    color="smoker",
    notched=True, # used notched shape
            ))
fig.show()

Кроме того, как можно определить цвета для полей? Использование marker_color работает только с одним цветом (не может дать список) в Plotly Go и устанавливает все поля в этот цвет, и это не является допустимым свойством для Plotly Express. Я попытался использовать colorscale, и это тоже не работает.

1 Ответ

2 голосов
/ 09 марта 2020

Давайте прыгнем прямо к ответу и пролить свет на детали позже. Чтобы установить цвета для ваших go.box фигур, вам нужно разделить набор данных по группам, которые вы хотите изучить, и назначить цвет для каждой подкатегории, используя line=dict(color=<color>). Приведенный ниже фрагмент кода покажет вам, как использовать встроенный цветовой цикл plotlys, чтобы получить тот же результат, что и при использовании plotly express без указания каждого цвета для каждой категории. Вам также нужно установить boxmode='group' для макета фигуры, чтобы блоки не отображались сверху друг друга.

График 1 - Использование go.box:

enter image description here

Код 1 - Использование go.box:

# imports
import plotly.graph_objects as go
import plotly.express as px

fig=go.Figure()
for i, smokes in enumerate(df['smoker'].unique()):
    df_plot=df[df['smoker']==smokes]
    #print(df_plot.head())

    fig.add_trace(go.Box(x=df_plot['time'], y=df_plot['total_bill'],
                         notched=True,
                         line=dict(color=colors[i]),
                         name='smoker=' + smokes))

fig.update_layout(boxmode='group', xaxis_tickangle=0)
fig.show()

Теперь для ...

как определить цвета для ящиков?

... part.

Цвет ящиков определяется fillcolor, по умолчанию полупрозрачный вариант цвета линии. В приведенном выше примере вы можете установить прозрачный зеленый цвет для всех ящиков, используя fillcolor='rgba(0,255,0,0.5)':

График 2: fillcolor='rgba(0,255,0,0.5)'

enter image description here

Или вы можете ссылаться на разные цвета одного и того же цветового цикла, который вы используете для цветов линий, используя смещенную версию списка цветов, такую ​​как fillcolor=colors[i+4]

Сюжет 3: fillcolor=colors[i+4]

enter image description here

Абсолютно самая простая вещь, которую нужно сделать, чтобы установить линию и Цвет заливки будет просто установить line=dict(color='black') и fillcolor='yellow' для всех групп:

Сюжет 4: Вернуться к основам

enter image description here

Полный код:

# imports
import plotly.express as px
import plotly.graph_objects as go

# data
df = px.data.tips()

# plotly setup
fig=go.Figure()

# a plotly trace for each subcategory
for i, smokes in enumerate(df['smoker'].unique()):
    df_plot=df[df['smoker']==smokes]

    fig.add_trace(go.Box(x=df_plot['time'], y=df_plot['total_bill'],
                         notched=True,
                         line=dict(color='black'),
                         #line=dict(color=colors[i]),
                         fillcolor='yellow',
                         #fillcolor=colors[i+4],
                         name='smoker=' + smokes))

# figure layout adjustments
fig.update_layout(boxmode='group', xaxis_tickangle=0)
fig.show()

Некоторые подробности обо всем этом:

Как этого добиться то же самое в Plotly Go? Поскольку свойство color не распознается как действительное.

Если вы изучите документацию по go.box, вы быстро обнаружите, что go.box не имеет метода color, а px.box имеет получил это:

color: str or int or Series or array-like
        Either a name of a column in `data_frame`, or a pandas Series or
        array_like object. Values from this column or array_like are used to
        assign color to marks.

Другими словами, что color в px.Box делает для вас, это разбить набор данных, например, на уникальные группы в наборе данных длинного формата, например px.data.tips()

Когда дело доходит до go.box, такого метода не существует, и вам просто нужно принять ValueError:

ValueError: Недопустимое свойство, указанное для объекта типа plotly.graph_ob js .Box: 'color'

...