J'ai un Pandas df:

           ro laws  ro ordos  
January        468       579     
February       216       231     
March         1005       276      
April         1044       250     
May            962       276       
June           999       568      
July          1360       298      
August          56       934      
September      202       289       
October        901       324       
November      1056       412       
December      1121       525

Je le trace en utilisant matplotlib et cela fonctionne comme prévu. Je veux remplir entre les deux lignes mais uniquement lorsque l'axe des x est 'January', 'February', 'March'.

J'ai essayé:

ax.fill_between(plotMonths.index, plotMonths['ro laws'], plotMonths['ro ordos'], where=(plotMonths.index in ['January', "February", 'March']),
                       facecolor='lightskyblue', 
                       alpha=0.2)

Mais il renvoie l'erreur :

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

J'ai essayé:

d = plotMonths.index.values.tolist() 
ax.fill_between(d, plotMonths['ro laws'], plotMonths['ro ordos'], where=(d in ['January', "February", 'March']),
                       facecolor='lightskyblue', 
                       alpha=0.2)

Mais cela ne fait rien, l'intrigue est vide.

Comment puis-je réparer cela?

Merci. entrez la description de l'image ici

1
dataadina 24 sept. 2020 à 09:01

2 réponses

Meilleure réponse

Le mot clé Python in recherche un élément dans un itérable, mais vous l'utilisez pour vérifier si un tableau (plotMonths.index) est dans un itérable ['January', "February", 'March'].
La bonne façon de vectoriser le conditionnel est d'utiliser la méthode intégrée .isin().
Donc, vous devriez utiliser:

ax.fill_between(x = plotMonths.index,
                y1 = plotMonths['ro laws'],
                y2 = plotMonths['ro ordos'],
                where = plotMonths.index.isin(['January', "February", 'March']),
                facecolor = 'lightskyblue',
                alpha = 0.2)

enter image description here

2
Konqui 24 sept. 2020 à 06:15

Découpez simplement vos données. Par exemple, trois premiers mois = [0: 3], comme ceci:

import matplotlib.pyplot as plt
ax.plot(plotMonths.index, plotMonths['ro laws'])
ax.plot(plotMonths.index, plotMonths['ro ordos'])
ax.fill_between(plotMonths.index[0:3], plotMonths['ro laws'][0:3])
ax.fill_between(plotMonths.index[0:3], plotMonths['ro ordos'][0:3])
plt.show()

Et il ne remplira que le sous-ensemble souhaité. Voici une image avec le résultat.

1
Gigioz 24 sept. 2020 à 06:36