为了账号安全,请及时绑定邮箱和手机立即绑定

绘制分位数线并连接两个小提琴图

绘制分位数线并连接两个小提琴图

撒科打诨 2023-06-06 16:31:46
如何在 Python 中绘制分位数线并连接两个小提琴图?例如,R ( https://github.com/GRousselet/rogme ) 中有一个库可以执行此操作。当有两个以上的组时,提供的库不一定有效。
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

在 Plotly 中绝对没有内置方法来做这个特定的事情。你能做的最好的可能是画一些线,如果你需要为不同分位数的多组数据做这件事,可以考虑写一个函数或一些循环。

这是我将如何开始。如果要连接分组小提琴图中的相同分位数,则可以创建一个列表或数组来存储线条的所有坐标。我承认我现在所拥有的是 hacky,因为它依赖于 Plotly 中的组,其 y 坐标从 0 开始并增加 1。可能有一种方法可以访问分组小提琴图的 y 坐标,我建议查看文档。

如果您想添加文本框来指示分位数的值,则需要做更多的工作。

import numpy as np

import pandas as pd


import plotly.express as px

import plotly.graph_objects as go


# generate some random data that is normally distributed

np.random.seed(42)

y1 = np.random.normal(0, 1, 1000) * 1.5 + 6

y2 = np.random.normal(0, 5, 1000) + 6


# group the data together and combine into one dataframe

df1 = pd.DataFrame({'Group': 'Group1', 'Values': y1})

df2 = pd.DataFrame({'Group': 'Group2', 'Values': y2})

df_final = pd.concat([df1, df2])


fig = px.strip(df_final, x='Values', y='Group', color_discrete_sequence=['grey'])


quantiles_list = [0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95]


## this is a bit hacky and relies on y coordinates for groups starting from 0 and increasing by 1

y_diff = 0

## these store the coordinates in order to connect the quantile lines

lower_coordinates, upper_coordinates = [], []

for group_name in df_final.Group.unique():

    for quantile in quantiles_list:

        quantile_value = np.quantile(df_final[df_final['Group'] == group_name].Values, quantile)

        if group_name == 'Group1':

            lower_coordinates.append((quantile_value, 0.2+1*y_diff))

        if group_name == 'Group2':

            upper_coordinates.append((quantile_value, -0.2+1*y_diff))

        fig.add_shape(

                # Vertical Line for Group1

                dict(

                    type="line",

                    x0=quantile_value,

                    y0=-0.2+1*y_diff,

                    x1=quantile_value,

                    y1=0.2+1*y_diff,

                    line=dict(

                        color="black",

                        width=4

                    )

                ),

        )

    y_diff += 1


## draw connecting lines

for idx in range(len(upper_coordinates)):

    fig.add_shape(

            dict(

                type="line",

                x0=lower_coordinates[idx][0],

                y0=lower_coordinates[idx][1],

                x1=upper_coordinates[idx][0],

                y1=upper_coordinates[idx][1],

                line=dict(

                    color="chocolate",

                    width=4

                    )

                ),

    )

fig.show()

//img1.sycdn.imooc.com/647eef2a0001eb8725601166.jpg

查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信