import matplotlib.pyplot as plt from matplotlib.backends import backend_pdf import pandas as pd import os dict_color = { 'mood' : {'good_mood': '#0000FF', 'mood': '#d0ef16', 'bad_mood': '#FF0000'}, 'yes/no' : {'oui': '#0000FF', 'non': '#FF0000'}, '+/-': { '+ + +': '#0000FF', '+ +': '#05f57f', '+': '#069f05', '-': '#d0ef16', '- -': '#f57a02', '- - -': '#FF0000' }, 'text': { 'toujours': '#0000FF', 'souvent': '#069f05', 'rarement': '#d0ef16', 'jamais': '#FF0000', } } good_mood = [ 'Passionnant','Bien','apaiser','évoluer','amélioration','entraide','Intérêt','Changement','Enrichissant','passion','Confiance', # Mot clef 1 'Valorisant','Motivant','Convivialité','confiance','Evolutif','varié','Valeurs', # Mot clef 2 'Utile','dynamiser','Reconnaissance','Bienveillance','bonne équipe','Motivation','dialogue', # Mot clef 3 ] bad_mood = [ 'solitude','instabilité','lourd','Frustration','Surcharge','désorganisation', # Mot clef 1 "pas d'évolution",'Usant','Pertinence ?','débordé','fatiguer','trop administratif','Stress','auto-apprentissage','Peu de cadrage','Pression','démotiver', # Mot clef 2 'clivage métier','Bouche-trou','empêché','bloquer','Frustrant','stress','Débordé','Surcharge','peu de moyen','tension','budget serré', # Mot clef 3 ] mood = [ 'responsabilité','intéressant','Diversifié','interrogation','Autonomie', # Mot clef 1 'devoir','initiative','Evolution', # Mot clef 2 'occupation','Routine', # Mot clef 3 ] invers = [ "j'utilise des produits chimiques.", # 12 "il m arrive de supporter seul(e) le poids des décisions et la prise de risques.", # 17 "j'ai un temps contraint.", # 20 "je travaille de nuit.", # 21 "je travaille les weekends ou les jours fériés.", # 22 "il y a des dysfonctionnement dans le déroulement de mon travail.", # 32 "il m'arrive d'avoir peur pendant mon travail.", # 40 "il m'arrive de travailler dans l'urgence (imprévus...).", # 41 "il m'arrive d'être dérangé par des sollicitations (téléphone, conseils, etc.) lorsque j'aurais besoin de me concentrer.", # 42 "il m'arrive de mal dormir parce que je pense à mon travail.", # 43 "il m'arrive de contourner les procédures de travail.", # 44 "il m'arrive de venir au travail à contrecoeur.", # 45 "il m'arrive de ressentir de l'ennui dans mon travail.", # 46 "les mutations technologiques constituent une contrainte dans la mise en oeuvre de mes missions.", # 48 "les mutations stratégiques constituent une contrainte dans la mise en oeuvre de mes missions.", # 49 "Au cours des dernières années, mon travail est devenu de plus en plus exigeant.", # 55 "j'ai fait l'objet de discriminations liées à mon sexe, mon âge, ma religion, mon handicap, ou encore mon orientation sexuelle.", # 57 "j'ai déjà travaillé alors que j'étais malade.", # 58 "j'ai fait l'objet de violences physiques au travail.", # 59 "j'ai souffert de violences psychologiques.", # 60 "j'ai vécu des difficultés relationnelles au travail.", # 62 "je crains de perdre mon emploi.", # 69 "j'envisage de quitter ma structure.", # 72 ] # ajouter "Ma structure" à partir de la diapo 25 jusqu'à la 30 # ajouter "Il m'arrive" à partir de la diapo 40 jusqu'à la 46 def sort_plot(values,colors,invers=False): name_index = values.index.name name_col = values.name df = values.reset_index() df['idx'] = None for i,c in enumerate(colors.keys()): if c in df[name_index].tolist(): df.loc[df[name_index]==c,'idx'] = i df.set_index('idx',inplace=True) df.sort_index(inplace=True) df.set_index(name_index,inplace=True) return df[name_col] def color_plot(data_list): for d in dict_color.values(): if any(k in data_list for k in d.keys()): return d def keyword_plot(data): color = dict_color['mood'] ax = (pd.Series({ 'mots positifs': data.isin(good_mood).value_counts()[True] if any(data.isin(good_mood)) else 0, 'mots neutres': data.isin(mood).value_counts()[True] if any(data.isin(mood)) else 0, 'mots négatifs': data.isin(bad_mood).value_counts()[True] if any(data.isin(bad_mood)) else 0, # 'autre':0 }) .plot .pie( y='quantite', title=data.name, figsize=(5, 5), legend=True, ylabel='', # colors = [*[i for i in color.values()],'#069f05'], colors = [i for i in color.values()], fontsize=11, autopct='%1.1f%%', # pourcentage sur 1 chiffre apres la virgule de chaque portion )) ax.title.set_fontweight('bold') return ax def make_plot(data): color = color_plot(data.unique()) vals = sort_plot(data.value_counts(),color) if data.name in invers: lst_color = [] [[x,*lst_color] for x in color.values()] color = dict(zip(color.keys(),list(reversed(color.values())))) ax = (vals .plot .pie( y='quantite', title=data.name.capitalize(), figsize=(5, 5), legend=True, ylabel='', colors = [color[i] for i in vals.index], fontsize=11, autopct='%1.1f%%', # pourcentage sur 1 chiffre apres la virgule de chaque portion )) ax.title.set_fontweight('bold') ax.title.set_wrap(True) return ax if __name__ == "__main__": PATH = '/media/colas/SRV/FICHIERS/Délégués Personnel_CSE/6_Enquêtes/Enquêtes RPS' file = 'Enquete_Nat_RPS_2023_CEN_ISERE.xlsx' df = pd.read_excel(os.path.join(PATH,file)) df.drop(columns=['Année','Votre CEN','Séquentiel','id'], inplace=True, errors='ignore') pdf = backend_pdf.PdfPages(os.path.join(PATH,'ANALYSE',"Analyse 2023.pdf")) for i,c in enumerate(df.columns): if i in range(24,30): df[c].name = 'ma structure ' + df[c].name if i in range(39,46): df[c].name = "il m'arrive " + df[c].name fig = keyword_plot(df[c]) if c.startswith('Mot clef') else make_plot(df[c]) pdf.savefig( fig.get_figure(), transparent=True ) fig.clear() pdf.close() # c = 'Mot clef 1' # data = df[c]