web-dev-qa-db-fra.com

Comment tracer une ligne avec matplotlib?

Je ne parviens pas à tracer une ligne arbitraire avec la bibliothèque matplotlib de Python. Il permet de tracer des lignes horizontales et verticales (avec matplotlib.pyplot.axhline et matplotlib.pyplot.axvline, par exemple), mais je ne vois pas comment tracer une ligne entre deux points donnés (x1, y1) et (x2, y2). Y a-t-il un moyen? Y a-t-il un moyen simple?

20
Alexey

Je vérifiais le fonctionnement d'ax.axvline et j'ai écrit une petite fonction qui ressemble en partie à son idée:

import matplotlib.pyplot as plt
import matplotlib.lines as mlines

def newline(p1, p2):
    ax = plt.gca()
    xmin, xmax = ax.get_xbound()

    if(p2[0] == p1[0]):
        xmin = xmax = p1[0]
        ymin, ymax = ax.get_ybound()
    else:
        ymax = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmax-p1[0])
        ymin = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmin-p1[0])

    l = mlines.Line2D([xmin,xmax], [ymin,ymax])
    ax.add_line(l)
    return l

Donc, si vous exécutez le code suivant, vous réaliserez comment cela fonctionne. La ligne s'étend sur toute la plage de votre tracé (indépendamment de sa taille) et sa création ne repose sur aucun point de données de l'axe, mais uniquement sur deux points fixes que vous devez spécifier.

import numpy as np
x = np.linspace(0,10)
y = x**2

p1 = [1,20]
p2 = [6,70]

plt.plot(x, y)
newline(p1,p2)
plt.show()

 enter image description here

15
Alejandro

Cela tracera une ligne qui passe par les points (-1, 1) et (12, 4), et une autre qui passe par les points (1, 3) et (10, 2)

x1 sont les coordonnées x des points pour la première ligne, y1 les coordonnées y pour la même - les éléments de x1 et y1 doivent être en séquence.

x2 et y2 sont les mêmes pour l'autre ligne.

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 4]
x2, y2 = [1, 10], [3, 2]
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

 enter image description here

Je vous suggère de lire et d’étudier les didacticiels de base disponibles sur le très riche site Web de matplotlib afin de vous familiariser avec la bibliothèque.

Et si je ne veux pas de segments?

Il n’existe aucun moyen direct d’étendre les lignes à l’infini ... matplotlib redimensionnera/redimensionnera le tracé de sorte que le point le plus éloigné se trouve sur la limite et l’autre à l’intérieur, en traçant des segments de ligne effectifs; ou vous devez choisir des points extérieurs à la limite de la surface que vous souhaitez définir comme visibles et définir des limites pour les axes x et y.

Comme suit:

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 10]
x2, y2 = [-1, 10], [3, -1]
plt.xlim(0, 8), plt.ylim(-2, 8)
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

 enter image description here

30
Reblochon Masque

Je veux juste mentionner une autre option ici.

Vous pouvez calculer les coefficients à l'aide de numpy.polyfit () et les alimenter en numpy.poly1d (). Cette fonction peut construire des polynômes en utilisant les coefficients, vous pouvez trouver plus d'exemples ici

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.poly1d.html

Disons, étant donné deux points de données (-0,3, -0,5) et (0,8, 0,8)

import numpy as np
import matplotlib.pyplot as plt

# compute coefficients
coefficients = np.polyfit([-0.3, 0.8], [-0.5, 0.8], 1) 

# create a polynomial object with the coefficients
polynomial = np.poly1d(coefficients)

# for the line to extend beyond the two points, 
# create the linespace using the min and max of the x_lim
# I'm using -1 and 1 here
x_axis = np.linspace(-1, 1)

# compute the y for each x using the polynomial
y_axis = polynomial(x_axis)

fig = plt.figure()
axes = fig.add_axes([0.1, 0.1, 1, 1])
axes.set_xlim(-1, 1)
axes.set_ylim(-1, 1)
axes.plot(x_axis, y_axis)
axes.plot(-0.3, -0.5, 0.8, 0.8, marker='o', color='red')

 enter image description here

J'espère que ça aide.

1
Ahaha