web-dev-qa-db-fra.com

Ajout de y = x à un nuage de points matplotlib si je n'ai pas suivi tous les points de données entrés

Voici du code qui fait un nuage de points d'un certain nombre de séries différentes en utilisant matplotlib, puis ajoute la ligne y = x:

import numpy as np, matplotlib.pyplot as plt, matplotlib.cm as cm, pylab

nseries = 10
colors = cm.Rainbow(np.linspace(0, 1, nseries))

all_x = []
all_y = []
for i in range(nseries):
    x = np.random.random(12)+i/10.0
    y = np.random.random(12)+i/5.0
    plt.scatter(x, y, color=colors[i])
    all_x.extend(x)
    all_y.extend(y)

# Could I somehow do the next part (add identity_line) if I haven't been keeping track of all the x and y values I've seen?
identity_line = np.linspace(max(min(all_x), min(all_y)),
                            min(max(all_x), max(all_y)))
plt.plot(identity_line, identity_line, color="black", linestyle="dashed", linewidth=3.0)

plt.show()

Pour y parvenir, j'ai dû garder une trace de toutes les valeurs x et y entrées dans le nuage de points afin de savoir où identity_line devrait commencer et se terminer. Existe-t-il un moyen de faire apparaître y = x même si je n'ai pas de liste de tous les points que j'ai tracés? Je pense que quelque chose dans matplotlib peut me donner une liste de tous les points après coup, mais je n'ai pas pu trouver comment obtenir cette liste.

18
kuzzooroo

Vous n'avez besoin de rien savoir de vos données en soi. Vous pouvez vous en sortir avec ce que votre objet matplotlib Axes vous dira sur les données.

Voir ci-dessous:

import numpy as np
import matplotlib.pyplot as plt

# random data 
N = 37
x = np.random.normal(loc=3.5, scale=1.25, size=N)
y = np.random.normal(loc=3.4, scale=1.5, size=N)
c = x**2 + y**2

# now sort it just to make it look like it's related
x.sort()
y.sort()

fig, ax = plt.subplots()
ax.scatter(x, y, s=25, c=c, cmap=plt.cm.coolwarm, zorder=10)

Voici la bonne partie:

lims = [
    np.min([ax.get_xlim(), ax.get_ylim()]),  # min of both axes
    np.max([ax.get_xlim(), ax.get_ylim()]),  # max of both axes
]

# now plot both limits against eachother
ax.plot(lims, lims, 'k-', alpha=0.75, zorder=0)
ax.set_aspect('equal')
ax.set_xlim(lims)
ax.set_ylim(lims)
fig.savefig('/Users/paul/Desktop/so.png', dpi=300)

Et voilà

enter image description here

42
Paul H