Я бы хотел, используя plot.ly dash, строить сгруппированные скрипки с иерархической группировкой.Из документов .
мне не ясно, для ясности рассмотрим набор данных подсказок, который они предоставляют.
Предположим, что я изменил набор данных, чтобы скопировать подсказкина «низкие», «средние» и «высокие» самосвалы.
Тогда я бы хотел, чтобы для каждой группы самосвалов с биннедом (низкий / средний / высокий) построить сгруппированную скрипку самца против самки.
Похоже, мне нужно сделать для массива трассировок что-то в виде:
tip_groups = ['low', 'med', 'big']
for tgrp in tip_groups:
for sex in ['male', 'female']
dff = df[df['tip_group'] == tgrp & (df['sex'] == sex)]
data.append({
'x': dff['tip_group'],
'y': dff['tip'],
'legendgroup':dff['tip'],
'scalegroup': dff['tip_group']
})
, но это не дает желаемых результатов, как я ожидаю увидетьтри группы по две скрипки в каждой.
код:
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv")
def tip_cat(row):
percent = row.tip / row.total_bill * 100
if percent < 10:
return 'low'
if percent < 15:
return 'med'
return 'big'
df['tip_category'] = df.apply(tip_cat, axis=1)
data = []
sexes = np.unique(df.sex)
categories = np.unique(df.tip_category)
colors = [
'#e6194B',
'#3cb44b',
'#ffe119',
'#4363d8',
'#f58231',
'#911eb4',
'#42d4f4',
]
for i, sex in enumerate(sexes):
for j, cat in enumerate(categories):
dff = df[
(df['sex'] == sex)
& (df['tip_category'] == cat)
]
data.append({
'type': 'violin',
'x': dff['sex'],
'y': dff['tip'],
'legendgroup': '{}: {}'.format(sex, cat),
'scalegroup': '{}: {}'.format(sex, cat),
'name': '{}: {}'.format(sex, cat),
'fillcolor': colors[i],
"line": {
"color": 'black'
},
})
fig = {
'data': data,
'layout': {
}
}
# import plotly_express as px # this works, but not with go.Violin
px.violin(df, y="tip", x="sex", color="tip_category", box=True, points="all", hover_data=df.columns)