0
votes

Nuage de points avec y étant catégorique et x étant une liste d'ensembles

Je veux un tracé où l'axe y est catégorique, par exemple

plt.scatter(x=dic, y=classes)
plt.show()

et l'axe des x est la liste des nombres

dic = 
    {
    1: {"A", "B"},
    2: {"D"},
    3: {"C", "D", "E"},
    4: {},
    ...
    }

Maintenant, chaque numéro peut avoir un ensemble correspondant

nums = [1,2,3,4,5,6,7,8,9]

Pour chaque nombre, je veux tracer un point de dispersion pour la classe correspondante si elle est présente. Quelque chose comme ça. Comment y parvenir avec matplotlib?

J'ai essayé un tas de ceci, par exemple:

classes = ["A","B","C","D","E"]

Mais cela ne fonctionne pas avec l'erreur ValueError: x et y doivent avoir la même taille

entrez la description de l'image ici


0 commentaires

3 Réponses :


0
votes

Si l'ordre de l'axe y n'est pas important, le code ci-dessous devrait faire l'affaire -

import matplotlib.pyplot as plt

dic = {
    1: {"A", "B"},
    2: {"D"},
    3: {"C", "D", "E"},
    4: {}
}

x_values = []
y_values = []

for key in dic:
    for value in dic[key]:
        x_values.append(key)
        y_values.append(value)

print(x_values)
print(y_values)

fig, ax = plt.subplots()
ax.scatter(x_values, y_values)

plt.show()

Cela donnerait le graphique suivant -

entrez la description de l'image ici


0 commentaires

1
votes

Vous devez créer une liste de points pour utiliser le nuage de points. Une doublure est ci-dessous.

x, y = list(zip(*[[a, b] for a in dic for b in dic[a]]))
plt.scatter(x, y)


0 commentaires

1
votes

Faisons une boucle for :

for k,v in dic.items():
    plt.scatter([k]*len(v),list(v))
    
plt.yticks(classes)
plt.xticks(nums)
plt.show()

Production: entrez la description de l'image ici


0 commentaires