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

3
我有一个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 图的文本标签。我在以下问题中找到了答案:Is it possible to overlay a marker on top of a plotly.js box plot?

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

enter image description here

1个回答

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()

enter image description here


样本数据结构化的原因是因为我是从官方参考文档中的这个示例开始编写代码的,后来才创建了数据框。 - r-beginners
1
哦,我甚至没有想到我应该使用条带图对象。太棒了,非常感谢你提供如此详细和清晰的答案。 - David Parks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接