在具有特定颜色和抖动的箱形图上绘制数据点

Plotting data points over a box plot with specific colors & jitter in plotly

我有一个 plotly.graph_objects.Box 图,我在箱形图中显示了所有点。我需要通过数据的属性为标记着色(如下所示)。我也想抖动点数(下图不显示)

使用 Box 我可以绘制点并抖动它们,但我不认为我可以给它们着色。

    fig.add_trace(go.Box(
        name='Data',
        y=y,
        jitter=0.5,
        boxpoints='all',
    ))

为了给图上色,我使用 Scatter 为每个组添加了单独的轨迹。看起来像这样(伪代码):

for data in group_of_data:
    fig.add_trace(go.Scatter(
        name=f'{data.name}',
        x=['trace 0', 'trace 0', ..., 'trace 0'],
        y=data.values,
        marker=dict(color=data.color),
        mode='markers',
    ))

值得注意的是,x 值是 Box 图的文本标签。我在问题中发现:.

现在我可以通过同时使用 go.Scatter + go.Box 以正确的颜色绘制散点叠加层,但是因为我的 x 值是文本标签(将它们与Box 图),我不知道如何向 Scatter 图添加抖动。通常你可以在 x 值上添加一个随机值来使散点图抖动,但是当 x 是文本标签时我不能。

由于没有提供数据,我正在使用适当的示例数据来创建图表。数据结构正在为带状图创建数据框。图形名称列,y0 和 y1 相加,颜色设置为那个。箱线图使用 y0 和 y1。首先,我们绘制一个带状图,然后添加一个额外的箱线图。我认为图例在结果图中没有按数字顺序排列是有原因的。我查了一下,只有标准,倒序,按组,但是目前不能改序。

import plotly.express as px
import numpy as np
import pandas as pd
np.random.seed(1)

y0 = np.random.randn(50) - 1
y1 = np.random.randn(50) + 1

df = pd.DataFrame({'graph_name':['trace 0']*len(y0)+['trace 1']*len(y1),
                  'value': np.concatenate([y0,y1],0),
                   'color':np.random.choice([0,1,2,3,4,5,6,7,8,9], size=100, replace=True)}
                 )

fig = px.strip(df,
         x='graph_name',
         y='value',
         color='color',
         stripmode='overlay')

fig.add_trace(go.Box(y=df.query('graph_name == "trace 0"')['value'], name='trace 0'))
fig.add_trace(go.Box(y=df.query('graph_name == "trace 1"')['value'], name='trace 1'))

fig.update_layout(autosize=False,
                  width=600,
                  height=600,
                  legend={'traceorder':'normal'})

fig.show()