使用特定颜色和抖动在箱形图上绘制数据点

Dav*_*rks 3 python boxplot plotly plotly-python stripplot

我有一个plotly.graph_objects.Box图,我正在显示箱形图中的所有点。我需要根据数据的属性为标记着色(如下所示)。我还想抖动这些点(下面未显示)。

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

    fig.add_trace(go.Box(
        name='Data',
        y=y,
        jitter=0.5,
        boxpoints='all',
    ))
Run Code Online (Sandbox Code Playgroud)

为了给图上色,我为每组添加了一条单独的迹线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',
    ))
Run Code Online (Sandbox Code Playgroud)

值得注意的是,该x值是绘图的文本标签Box。我在问题中发现:是否可以在plotly.js箱形图上叠加标记?

现在我可以通过一起使用go.Scatter+以正确的颜色绘制散点覆盖图go.Box,但由于我的x值是文本标签(将它们与绘图对齐Box),我不知道如何向Scatter绘图添加抖动。通常,您可以向值添加随机值x以使散点图抖动,但是当x是文本标签时我不能。

在此输入图像描述

r-b*_*ers 5

由于没有提供数据,我正在使用适当的示例数据来创建图表。数据的结构正在为带状图创建数据框。将图形名称列、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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述