亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

繪制分位數線并連接兩個小提琴圖

繪制分位數線并連接兩個小提琴圖

撒科打諢 2023-06-06 16:31:46
如何在 Python 中繪制分位數線并連接兩個小提琴圖?例如,R ( https://github.com/GRousselet/rogme ) 中有一個庫可以執行此操作。當有兩個以上的組時,提供的庫不一定有效。
查看完整描述

1 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

在 Plotly 中絕對沒有內置方法來做這個特定的事情。你能做的最好的可能是畫一些線,如果你需要為不同分位數的多組數據做這件事,可以考慮寫一個函數或一些循環。

這是我將如何開始。如果要連接分組小提琴圖中的相同分位數,則可以創建一個列表或數組來存儲線條的所有坐標。我承認我現在所擁有的是 hacky,因為它依賴于 Plotly 中的組,其 y 坐標從 0 開始并增加 1??赡苡幸环N方法可以訪問分組小提琴圖的 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()

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

查看完整回答
反對 回復 2023-06-06
  • 1 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號