Plotly:如何使用 go.box 而不是 px.box 对数据进行分组并指定颜色?

Kar*_*rim 7 python boxplot plotly

问题:

color=<group>使用plotly express,您可以对数据进行分组并使用in分配不同的颜色px.box()。但是你怎么能用plotly.graph_objectsand来做同样的事情呢?go.box()

一些细节:

Plotly Express 很好,但有时我们需要的不仅仅是基础知识。因此,我尝试使用 Plotly Go 来代替,但随后我无法弄清楚如何在组中使用方框来绘制方框图,而无需go.Box 像文档中那样手动为每个组添加 a 。

以下是我从 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()
Run Code Online (Sandbox Code Playgroud)

如何在 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()
Run Code Online (Sandbox Code Playgroud)

此外,如何定义盒子的颜色?在 Plotly Go 中使用marker_color仅适用于一种颜色(无法给出列表)并将所有框设置为该颜色,并且它不是 Plotly Express 的有效属性。我尝试使用colorscale,但这也不起作用。

ves*_*and 10

让我们直接跳到答案,然后再阐明一些细节。为了设置go.box图形的颜色,您必须将数据集拆分为要研究的组,并使用 为每个子类别分配颜色line=dict(color=<color>)。下面的代码片段将向您展示如何使用plotlys内置颜色循环来获得与使用plotlyexpress相同的结果,而无需为每个类别指定每种颜色。您还必须设置boxmode='group'图形布局,以防止框显示在彼此之上。

图 1 -使用go.box

在此输入图像描述

代码 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()
Run Code Online (Sandbox Code Playgroud)

现在对于...

如何定义盒子的颜色?

...部分。

框的颜色由fillcolor默认为线条颜色的半透明变体定义。在上面的示例中,您可以使用以下命令为所有框设置透明绿色fillcolor='rgba(0,255,0,0.5)'

情节2: fillcolor='rgba(0,255,0,0.5)'

在此输入图像描述

或者,您可以使用颜色列表的偏移版本来引用与线条颜色相同的颜色循环的不同颜色,例如fillcolor=colors[i+4]

情节 3: fillcolor=colors[i+4]

在此输入图像描述

设置线条和填充颜色最简单的方法就是 为所有组设置line=dict(color='black')和:fillcolor='yellow'

图 4:回到基础

在此输入图像描述

完整代码:

# 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()
Run Code Online (Sandbox Code Playgroud)

关于这一切的一些细节:

如何在 Plotly Go 中实现同样的目标?因为颜色属性未被识别为有效。

如果你研究 的文档go.box,你很快就会发现go.box没有color方法,而px.boxhas 是这样的:

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.
Run Code Online (Sandbox Code Playgroud)

换句话说,它的color作用px.Box是将数据集分割成长格式数据集中的唯一组,例如px.data.tips()

当谈到go.box没有这样的方法时,你只需要接受 ValueError:

ValueError:为plotly.graph_objs.Box类型的对象指定无效属性:'color'