plot.ly冲刺多组小提琴?

时间:2019-07-09 17:31:36

标签: python python-3.x plotly plotly-dash violin-plot

我想使用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)

1 个答案:

答案 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)

您会得到:

enter image description here