LEATH
在 Plotly 中绝对没有内置方法来做这个特定的事情。你能做的最好的可能是画一些线,如果你需要为不同分位数的多组数据做这件事,可以考虑写一个函数或一些循环。这是我将如何开始。如果要连接分组小提琴图中的相同分位数,则可以创建一个列表或数组来存储线条的所有坐标。我承认我现在所拥有的是 hacky,因为它依赖于 Plotly 中的组,其 y 坐标从 0 开始并增加 1。可能有一种方法可以访问分组小提琴图的 y 坐标,我建议查看文档。如果您想添加文本框来指示分位数的值,则需要做更多的工作。import numpy as npimport pandas as pdimport plotly.express as pximport plotly.graph_objects as go# generate some random data that is normally distributednp.random.seed(42)y1 = np.random.normal(0, 1, 1000) * 1.5 + 6y2 = np.random.normal(0, 5, 1000) + 6# group the data together and combine into one dataframedf1 = 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 1y_diff = 0## these store the coordinates in order to connect the quantile lineslower_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 linesfor 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()