Matplotlib: ValueError: x et y doivent avoir la même dimension
Je suis en train de monter un linéaire de la ligne de meilleur ajustement à mon matplotlib graphique. Je reçois le message d'erreur que x et y n'ont pas la même dimension. Mais ils ont tous deux longueurs de 15 ans. Ce que je fais mal?
import matplotlib.pyplot as plt
from scipy import stats
import numpy as np
x = [0.46,0.59,0.68,0.99,0.39,0.31,1.09,0.77,0.72,0.49,0.55,0.62,0.58,0.88,0.78]
y = [0.315,0.383,0.452,0.650,0.279,0.215,0.727,0.512,0.478,0.335,0.365,0.424,0.390,0.585,0.511]
xerr = [0.01]*15
yerr = [0.001]*15
plt.rc('font', family='serif', size=13)
m, b = np.polyfit(x, y, 1)
plt.plot(x,y,'s',color='#0066FF')
plt.plot(x, m*x + b, 'r-') #BREAKS ON THIS LINE
plt.errorbar(x,y,xerr=xerr,yerr=0,linestyle="None",color='black')
plt.xlabel('$\Delta t$ $(s)$',fontsize=20)
plt.ylabel('$\Delta p$ $(hPa)$',fontsize=20)
plt.autoscale(enable=True, axis=u'both', tight=False)
plt.grid(False)
plt.xlim(0.2,1.2)
plt.ylim(0,0.8)
plt.show()
- alors, comment vous êtes vous retrouvé à la résolution de votre problème, seulement de la conversion de tableaux numpy?
Vous devez vous connecter pour publier un commentaire.
Vous devriez faire
x
ety
tableaux numpy, et non pas des listes:Avec ce changement, il produit le fait de s'attendre de la parcelle. Si ce sont des listes,
m * x
ne produira pas le résultat que vous attendez, mais la liste est vide. Notez quem
est unnumpy.float64
scalaire, pas un standard de Pythonfloat
.En fait je considère que c'est un peu dubitatif comportement de Numpy. Normal Python, la multiplication d'une liste avec un nombre entier ne fait que répéter la liste:
tout en multipliant une liste avec un flotteur donne une erreur (car je pense qu'il devrait):
La chose étrange est que la multiplication d'une liste Python avec un Numpy scalaire fonctionne apparemment:
Il semble donc que le flotteur soit tronquée à un int, après que vous obtenez le standard de Python comportement de répéter la liste, ce qui est tout à fait un comportement inattendu. La meilleure chose aurait été de relever une erreur (de sorte que vous avez repéré le problème vous-même au lieu d'avoir à poser votre question sur Stackoverflow) ou juste montrer les attendus de l'élément de sage de multiplication (dans lequel votre code, aurait travaillé). Il est intéressant de noter, d'autre part entre une liste et un Numpy scalaire fonctionne:
np.array
's résout des choses?m,b=np.polyfit(x,y,1)
, ici, vous obtenezm
être un float64 valeur, par exemplem=0.642
dans le cas ci-dessus. Maintenant, quand vous essayez de multiplier un flotteurm
avec une listex
, vous obtenez une liste vide[]
. C'est parce que de multiplier chaque élément d'une liste avec une valeur, vous avez besoin de convertir la liste pour unnumpy array
ou utiliser le construit enmap
fonction. Voir cette réponse pour plus d'info.Changer vos listes de
numpy
tableaux fera l'affaire!!m,b=np.polyfit(x,y,1)
, ici, vous obtenezm
être un float64 valeur, par exemplem=0.642
dans le cas ci-dessus. Maintenant, quand vous essayez de multiplier un flotteurm
avec une listex
, vous obtenez une liste vide[]
. C'est parce que de multiplier chaque élément d'une liste avec une valeur, vous avez besoin de convertir la liste pour unnumpy array
ou utiliser le construit enmap
fonction. Voir cette réponse pour plus d'info.