我想使用plot.ly破折号,用分层分组对分组的小提琴进行绘图。 docs对我来说并不明显。
为清楚起见,请考虑它们提供的提示数据集。
假设我已修改数据集以将提示分类为“低”,“中”和“高”提示。
然后,我想为每组装箱小提琴(低/中/高)绘制男性和女性的小提琴。
对于数据跟踪数组,似乎需要以以下形式进行制作:
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)
答案 0 :(得分:1)
如果我理解正确,则应在代码中修改几行,即:
来自:
'x': dff['sex'],
收件人:
'x': dff['tip_category'],
和
来自:
'layout': {
}
收件人:
"layout" : {
"yaxis": {
"zeroline": False,
},
"violinmode": "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['tip_category'],
'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" : {
"yaxis": {
"zeroline": False,
},
"violinmode": "group"
}
}
iplot(fig, filename = 'violin/grouped', validate = False)
您会得到: