Je souhaite créer un graphique à barres groupé qui montre la médiane et la moyenne de chaque groupe. J'utilise également un cadre d'animation pour montrer comment chaque médiane et moyenne change en fonction du montant ubi.

Je souhaite regrouper ces graphiques à barres afin qu'ils montrent la médiane et la moyenne pour chaque groupe et comment cela change.

Voici mon code mais je ne sais pas comment les regrouper.

import pandas as pd
import plotly.express as px

summary_med = pd.read_csv('https://github.com/ngpsu22/indigenous-peoples-day/raw/main/native_medians_means')

fig = px.bar(summary_med, x = 'race', y='med_resources_per_person',
         animation_frame='monthly_ubi', range_y=[0,25_000],
         labels={
                 "med_resources_per_person": "Median resources per person",
                 "race": "Race",
                 "monthly_ubi": "Monthly UBI",
                 "native": "Native",
                 "non_native": "Non-native"
             },
            title="Tax funded UBI and median resources per person", 
         color='race', 
         text='med_resources_per_person',
         height=900, width=800,
         color_discrete_map={'native': '#5886a5',
                             'non_native': '#5886a5'})

fig.update_traces(texttemplate='$%{text}')
fig.update_layout(showlegend=False, yaxis_tickprefix='$')
fig.show()
0
user13747020 6 oct. 2020 à 23:11

2 réponses

Meilleure réponse

Je ne sais pas si c'est ce que vous demandez

import pandas as pd
import plotly.express as px

url = 'https://github.com/ngpsu22/indigenous-peoples-day/raw/main/native_medians_means'
df = pd.read_csv(url)

# wide to long
df = pd.melt(df,
        id_vars=["monthly_ubi", "race"],
        value_vars=['med_resources_per_person',
                    'mean_resources_per_person'],
        var_name="resource",
             
        value_name="y")


# Format text
diz_resource = {"med_resources_per_person": "Median",
                "mean_resources_per_person": "Mean"}
diz_race = {"native": "Native",
            "non_native": "Non-native"}

df["resource"] = df["resource"].map(diz_resource)
df["race"] =  df["race"].map(diz_race)

# Range max
range_max = df["y"].max() * 1.2

# Plot
fig = px.bar(df, 
       x='race',
       y="y",
       color="resource",
       barmode='group',
       animation_frame='monthly_ubi',
       text='y',
       height=900, width=800,
       labels={"race": "Race",
               "monthly_ubi": "Monthly UBI",
               "y": "Resource Per Person"
             },
       title="Tax funded UBI and median resources per person",
       range_y=[0, range_max]
    )
fig.update_traces(texttemplate='$ %{text}')
fig.update_layout(title_x=0.5,
#                   showlegend=False,
                  yaxis_tickprefix='$')
fig.show()

enter image description here

2
rpanai 6 oct. 2020 à 21:08

Voici une solution sans modifier le dataframe. Pourtant, je n'ai pas trouvé de bonne méthode pour afficher le nom de la variable (médiane, moyenne) sans légende jusqu'à présent. J'ai également modifié la couleur pour montrer la différence, mais vous pouvez changer la couleur pour la même si vous le souhaitez.

Le code serait:

import pandas as pd 
import plotly.express as px


summary_med = pd.read_csv('https://github.com/ngpsu22/indigenous-peoples-day/raw/main/native_medians_means')

fig = px.bar(summary_med, x="race", y=["med_resources_per_person","mean_resources_per_person"],
             # color='race', 
             animation_frame='monthly_ubi', 
             range_y=[0,50_000],
             barmode='group', # make it side by side 
             # height=400
              labels={
                 "med_resources_per_person": "Median",
                 "mean_resources_per_person":"Mean",
                 "race": "Race",
                 "monthly_ubi": "Monthly UBI",
                 "native": "Native",
                 "non_native": "Non-native"
             },
            title="Tax funded UBI and median resources per person", 

            height=900, width=800,
            color_discrete_map={'med_resources_per_person': '#5886a5','mean_resources_per_person': '#58a577'}

            ) 
fig.update_traces(texttemplate='%{y}') 
fig.update_layout(showlegend=True, yaxis_tickprefix='$') 
fig.show()

entrez la description de l'image ici

1
fenixnano 7 oct. 2020 à 09:35