J'essaie d'obtenir deux graphiques à barres empilés côte à côte, mais je ne peux pas le comprendre.

Voici un exemple df:

Field       Issue

Police      Budget cuts
Research    Budget cuts
Police      Time consuming
Banking     Lack of oversight
Healthcare  Lack of support
Research    Bureaucracy
Healthcare  Bureaucracy
Banking     Mistrust

Ce que je veux, c'est d'abord un graphique à barres empilées du champ. Il aura une hauteur de 8 décomposée par 2 policiers, 2 x recherche, etc. Ensuite, je veux un graphique à barres empilées du problème à côté du premier graphique. Ce second aura une hauteur de 8 et sera empilé par 2 x coupes budgétaires, 1 x temps, 1 x manque de surveillance, etc.

J'ai essayé:

Pour obtenir le graphique à barres empilées de tous les champs:

trace1 = go.Bar(
    x = df.Field.unique(),
    y = df.Field.value_counts(),
    name='Total Amount of roles'
)

Pour obtenir un graphique à barres empilées des coupes budgétaires (puis répliquer pour d'autres problèmes):

trace2 = go.Bar(
    x = df.Field.unique(),
    y = df[df['Issue'] == 'Budget cuts'].Field.value_counts(),
    name='Budget cuts'
)

data = [trace1, trace2]
layout = go.Layout(barmode='stack')

fig = go.Figure(data=data, layout=layout)
py.plot(fig, filename='test.html')

Mais le code ci-dessus empile les deux graphiques sur un seul. Je veux que la trace 1 soit empilée et la trace 2 empilée. Je veux aussi que cela soit intégré à Dash et pas complotement seul, mais ce serait secondaire pour être honnête. J'apprécierais toute aide!

1
user8322222 19 mars 2019 à 12:56

2 réponses

Meilleure réponse

MODIFIER - après un bref dialogue dans les commentaires, voici ma dernière suggestion:


Voici une solution possible avec le nombre de chaque occurrence de chaque catégorie empilées par colonne (champ ou problème):

Graphique:

enter image description here

Code:

Comme vous pouvez le voir, ce n'est pas très flexible car vous devrez ajouter un go.Bar objet pour chaque catégorie (banque, police, etc.). Mais si l'intrigue ci-dessus correspond à ce que vous recherchez, je vais également régler cette partie.

# import
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)

#%qtconsole

# sample data
Field = ['Police', 'Research', 'Police', 'Banking', 'Healthcare', 'Research', 'Healthcare', 'Banking']
Issue = ['Budget cuts', 'Budget cuts', 'Time consuming', 'Lack of oversight', 'Lack of support', 'Bureaucracy', 'Bureaucracy', 'Mistrust']

# Put the lists in a pandas dataframe for
# easy grouping and indexing
df = pd.DataFrame([Field, Issue]).T
df.columns = ['Field', 'Issue']
grField = df.groupby('Field').count()
grIssue = df.groupby('Issue').count()
dfgr = pd.concat([grField, grIssue], axis = 1, sort = False)
dfgr = dfgr.T

# Make one go.Bar() object for each category
# for corresponing Field / Issue
trace1 = go.Bar(
    x = ['Issue'],
    #y = [dfgr['Field']],
    y = [dfgr['Banking'].loc['Issue']],
    name='Banking')

trace2 = go.Bar(
    x = ['Issue'],
    #y = [dfgr['Field']],
    y = [dfgr['Healthcare'].loc['Issue']],
    name='Healthcare')

trace3 = go.Bar(
    x = ['Issue'],
    #y = [dfgr['Field']],
    y = [dfgr['Police'].loc['Issue']],
    name='Police')

trace4 = go.Bar(
    x = ['Issue'],
    #y = [dfgr['Field']],
    y = [dfgr['Research'].loc['Issue']],
    name='Research')

trace5 = go.Bar(
    x = ['Field'],
    #y = [dfgr['Field']],
    y = [dfgr['Budget cuts'].loc['Field']],
    name='Budget cuts')

trace6 = go.Bar(
    x = ['Field'],
    #y = [dfgr['Field']],
    y = [dfgr['Bureaucracy'].loc['Field']],
    name='Bureaucracy')

trace7 = go.Bar(
    x = ['Field'],
    #y = [dfgr['Field']],
    y = [dfgr['Lack of oversight'].loc['Field']],
    name='Lack of oversight')

trace7 = go.Bar(
    x = ['Field'],
    #y = [dfgr['Field']],
    y = [dfgr['Lack of oversight'].loc['Field']],
    name='Lack of oversight')

trace8 = go.Bar(
    x = ['Field'],
    #y = [dfgr['Field']],
    y = [dfgr['Lack of support'].loc['Field']],
    name='Lack of support')

trace9 = go.Bar(
    x = ['Field'],
    #y = [dfgr['Field']],
    y = [dfgr['Mistrust'].loc['Field']],
    name='Mistrust')

trace10 = go.Bar(
    x = ['Field'],
    #y = [dfgr['Field']],
    y = [dfgr['Time consuming'].loc['Field']],
    name='Time consuming')

# gather data and set up layout
#data = [trace1, trace2, trace3, trace4, trace5, trace6, trace7, trace8, trace9, trace10]
data = [trace10, trace9, trace8, trace7, trace6, trace5, trace4, trace3, trace2, trace1]
layout = go.Layout(barmode='stack', title = 'Stacked bar chart from single column')

# Build figure
fig = go.Figure(data=data, layout=layout)

# PLot figure
iplot(fig, filename='test.html')
1
vestland 19 mars 2019 à 20:17

Des extraits de code de travail, au cas où ce dont vous avez besoin:

import plotly.graph_objects as go

x=['a','b','c','d']
fig = go.Figure(go.Bar(x =x, y=[2,5,1,9], name='Montreal',
                   base = 0, width = 0.2, offset = 0.0,
                   marker = dict(color = 'rgb(0,120,255)')))

fig.add_trace(go.Bar(x=x, y=[1, 4, 9, 16], name='Ottawa',
                width = 0.2, offset = -0.2,
                marker = dict(color = 'rgb(250,60,0)')))
fig.add_trace(go.Bar(x=x, y=[6, 8, 4.5, 8], name='Toronto',
                 width = 0.2, offset = -0.2,
                 marker = dict(color = 'rgb(250,130,0)')))

fig.update_layout(barmode='stack', xaxis={'categoryorder':'array', 'categoryarray':['d','a','c','b']})
fig.show()

Une mise en page alternative: change: base,offset of second figure

import plotly.graph_objects as go

x=['a','b','c','d']
fig = go.Figure(go.Bar(x =x, y=[2,5,1,9], name='Montreal',
                   base = 0, width = 0.2, offset = 0.0,
                   marker = dict(color = 'rgb(0,120,255)')))

fig.add_trace(go.Bar(x=x, y=[1, 4, 9, 16], name='Ottawa',
                width = 0.2, offset = -0.4, base=0,
                marker = dict(color = 'rgb(250,60,0)')))
fig.add_trace(go.Bar(x=x, y=[6, 8, 4.5, 8], name='Toronto',
                 width = 0.2, offset = -0.2,
                 marker = dict(color = 'rgb(250,130,0)')))

fig.update_layout(barmode='stack', xaxis={'categoryorder':'array', 'categoryarray':['d','a','c','b']})
fig.show()
0
penduDev 11 oct. 2019 à 07:05