web-dev-qa-db-fra.com

Comment faire un nuage de points avec des cercles vides en Python?

En Python, avec Matplotlib, comment peut-on tracer un diagramme de dispersion avec des cercles vide? Le but est de dessiner des cercles vides autour de certains des disques colorés déjà tracés par scatter(), afin de les mettre en évidence, idéalement sans avoir à redessiner les cercles colorés.

J'ai essayé facecolors=None, en vain.

138
Eric O Lebigot

De la documentation pour scatter:

Optional kwargs control the Collection properties; in particular:

    edgecolors:
        The string ‘none’ to plot faces with no outlines
    facecolors:
        The string ‘none’ to plot unfilled outlines

Essayez ce qui suit:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.random.randn(60) 
y = np.random.randn(60)

plt.scatter(x, y, s=80, facecolors='none', edgecolors='r')
plt.show()

example image

Remarque: Pour les autres types de tracé, voir cet article sur l'utilisation de markeredgecolor et markerfacecolor .

201
Gary Kerr

Cela fonctionnerait-il?

plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none')

example image

ou en utilisant plot ()

plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none')

example image

60
Gökhan Sever

Voici une autre manière: cela ajoute un cercle aux axes actuels, au tracé, à l'image ou à quoi que ce soit:

from matplotlib.patches import Circle  # $matplotlib/patches.py

def circle( xy, radius, color="lightsteelblue", facecolor="none", alpha=1, ax=None ):
    """ add a circle to ax= or current axes
    """
        # from .../pylab_examples/ellipse_demo.py
    e = Circle( xy=xy, radius=radius )
    if ax is None:
        ax = pl.gca()  # ax = subplot( 1,1,1 )
    ax.add_artist(e)
    e.set_clip_box(ax.bbox)
    e.set_edgecolor( color )
    e.set_facecolor( facecolor )  # "none" not None
    e.set_alpha( alpha )

alt text

(Les cercles de l'image sont écrasés en ellipses parce que imshow aspect="auto").

14
denis

Dans matplotlib 2.0, il existe un paramètre appelé fillstyle qui permet de mieux contrôler le mode de remplissage des marqueurs. Dans mon cas, je l'ai utilisé avec errorbars mais cela fonctionne pour les marqueurs en général http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyle accepte les valeurs suivantes: [‘full’ | "À gauche" | ‘Droite’ | "Bas" | "Top" | 'aucun']

Il y a deux choses importantes à garder à l’esprit lorsque vous utilisez fillstyle,

1) Si mfc est défini sur n'importe quel type de valeur, il aura la priorité. Par conséquent, si vous définissez fillstyle sur 'aucun', il ne sera pas pris en compte. Donc, évitez d’utiliser mfc en conjonction avec fillstyle

2) Vous voudrez peut-être contrôler le marqueur Largeur du bord (en utilisant markeredgewidth ou mew) car si le marqueur est relativement petit et que la largeur du bord est épaisse, les marqueurs auront l’air rempli, même s’ils ne le sont pas. .

Voici un exemple d'utilisation des barres d'erreur:

myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue',  mec='blue')
4

Je suppose donc que vous souhaitez mettre en évidence certains points correspondant à certains critères. Vous pouvez utiliser la commande de Prelude pour faire un deuxième diagramme de dispersion des points en surbrillance avec un cercle vide et un premier appel pour tracer tous les points. Assurez-vous que le paramètre s est suffisamment petit pour que les plus grands cercles vides entourent les plus petits.

L'autre option consiste à ne pas utiliser scatter et à dessiner les patchs individuellement à l'aide de la commande circle/ellipse. Ce sont dans matplotlib.patches, here voici quelques exemples de code sur la façon de dessiner des rectangles, des cercles, etc.

1
whatnick