2017-07-27 3 views
-1

Je voudrais créer un nuage de points à partir d'une image, où chaque point est visualisé avec une couleur unique en fonction de la fréquence à laquelle cette valeur est apparue. A titre d'exemple, je l'dataframe suivante, composée des listes de deux valeurs numériques:Scatterplot Pandas avec points codés en couleur

df = pd.DataFrame({'width': image_widths, 'height': image_heights}) 
df.head(10) 
    height width 
0 1093 640 
1 1136 639 
2 1095 640 
3 1136 639 
4 1095 640 
5 1100 640 
6 1136 640 
7 1136 639 
8 1136 640 
9 1031 640 

Maintenant, comme vous le voyez, une valeur paires occure plusieurs fois. Par exemple (1095/640) apparaît aux index 2 et 4. Comment donner à ce point une couleur représentant "Deux occurrences". Et ce serait encore mieux, si la couleur est prélevée automatiquement à partir d'un spectre continu, comme dans un tracé de barres de couleurs. De telle sorte que déjà l'abat-jour te donne une impression de la fréquence, plutôt que manuellement en recherchant ce que la couleur le représente.

Une alternative à la coloration, j'apprécierais aussi, est d'avoir la fréquence des occurrences codées comme le rayon des points.

EDIT:

Pour préciser ma question, je compris que df.groupby(['width','height']).size() me donne le nombre de toutes les combinaisons. Maintenant, je n'ai pas la compétence pour relier cette information avec la couleur (ou la taille) des points dans l'intrigue.

+0

Vous pouvez affecter à chaque point une valeur Rouge et Vert basée sur hei ght et width et une valeur bleue (ou alpha) basée sur la fréquence. Vous pouvez également jouer avec la couleur de remplissage, la couleur du trait et l'alpha pour chaque point. Il y a des tonnes d'options, c'est vraiment à vous. –

+0

@ alec_djinn: Il y a plus de deux valeurs en largeur, donc je devrais assigner beaucoup de valeurs. Il est regrettable que dans l'exemple, seules ces deux valeurs apparaissent. Il y a également de fortes chances que plus de points avec des dimensions invisibles soient ajoutés à l'avenir. Mais merci pour le commentaire, jusqu'à présent, de toute façon. – muuh

+0

Il y a 256 valeurs pour chaque canal R, G, B ... –

Répondre

1

Vous voulez les tailles ainsi que les largeurs et hauteurs dans un DataFrame:

plot_df = df.groupby(['width','height']).size().reset_index(name='count') 
print(plot_df) 

    width height count 
0 639 1136  3 
1 640 1031  1 
2 640 1093  1 
3 640 1095  2 
4 640 1100  1 
5 640 1136  2 

Les couleurs et tailles dans un nuage de points sont controlés par les c et s mots-clés si vous utilisez DataFrame.plot.scatter:

plot_df.plot.scatter(x='height', y='width', s=10 * plot_df['count']**2, 
        c='count', cmap='viridis') 

Scatter plot

+0

réponse très soignée! ++ :) – MaxU