Wie erstelle ich ein Streudiagramm mit leeren Kreisen in Python?


166

Wie kann in Python mit Matplotlib ein Streudiagramm mit leeren Kreisen gezeichnet werden? Ziel ist es, leere Kreise um einige der bereits gezeichneten scatter()Farbscheiben zu zeichnen, um sie hervorzuheben, idealerweise ohne die farbigen Kreise neu zeichnen zu müssen.

Ich versuchte facecolors=Nonees ohne Erfolg.


1
Personen, die leere / hohle Streudiagramme mit unterschiedlichen Farben zeichnen möchten, können sich diese Frage ansehen .
ImportanceOfBeingErnest

Antworten:


242

Aus der Dokumentation zur Streuung:

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

Versuche Folgendes:

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()

Beispielbild

Hinweis: Weitere Arten von Plots finden Sie in diesem Beitrag zur Verwendung von markeredgecolorund markerfacecolor.


4
Vielen Dank! Das Problem ist, dass das üblichere (in Python) facecolors=Nonenicht funktioniert, was mich stolperte.
Eric O Lebigot

24
Sehr hilfreich. So markerfacecolor='none'ist es jetzt.
hesham_EE

2
Ich hatte meinen Matplotlib-Stil so, dass die Kantenbreiten auf Null gesetzt wurden. Wenn Sie keine Marker mit dem markerfacecolor='none'Versuch sehen, hinzuzufügenmarkeredgewidth=1.0
oLas

Dieser Ansatz kann auch in Seaborn verwendet werden, nachdem der Standardimport von Matplotlib %matplotlib inlineund import matplotlib.pyplot as pltanschließend Seaborn als Plot-Standard festgelegt wurdeimport seaborn as sns; sns.set()
Jakob

68

Würden diese funktionieren?

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

Beispielbild

oder mit plot ()

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

Beispielbild


3
Dies ist nützlich, wenn Sie plotanstelle vonscatter
Trevor Boyd Smith

2
Für scatter, müssen Sie angeben , edgecolorswie edgecolors='r'. Ansonsten verschwinden die Kreise. Siehe hier
T_T

14

Hier ist eine andere Möglichkeit: Dies fügt den aktuellen Achsen, Plots oder Bildern oder was auch immer einen Kreis hinzu:

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

(Die Kreise im Bild werden weil zu Ellipsen gequetscht, weil imshow aspect="auto").


5

In matplotlib 2.0 gibt es einen Parameter namens, fillstyle der eine bessere Kontrolle über das Füllen von Markern ermöglicht. In meinem Fall habe ich es mit Fehlerbalken verwendet, aber es funktioniert für Marker im Allgemeinen http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyleakzeptiert die folgenden Werte: ['full' | 'left' | 'richtig' | 'bottom' | 'Nach oben' | 'keiner']

Bei der Verwendung sind zwei wichtige Dinge zu beachten fillstyle:

1) Wenn mfc auf einen beliebigen Wert gesetzt ist, hat dies Priorität. Wenn Sie also den Füllstil auf 'none' setzen, wird er nicht wirksam. Vermeiden Sie daher die Verwendung von mfc in Verbindung mit Fillstyle

2) Möglicherweise möchten Sie die Kantenbreite des Markers steuern (mit markeredgewidthoder mew), da die Marker, wenn der Marker relativ klein und die Kantenbreite dick ist, wie gefüllt aussehen, obwohl dies nicht der Fall ist.

Es folgt ein Beispiel mit Fehlerbalken:

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

2

Basierend auf dem Beispiel von Gary Kerr und wie hier vorgeschlagen , kann man leere Kreise erstellen, die sich auf bestimmte Werte mit folgendem Code beziehen:

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.markers import MarkerStyle

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

g=plt.scatter(x, y, s=80, c=z)
g.set_facecolor('none')
plt.colorbar()
plt.show()

Dies ist die im Wesentlichen komplexierte Version der akzeptierten Antwort…
Eric O Lebigot

Aus meiner Sicht ist es nicht. Die Verwendung eines Streudiagramms mit Farben gilt nicht außer facecolor = "none" innerhalb des Befehls. Daher ist das anschließende Entfernen der Gesichtsfarbe erforderlich, wie im angegebenen Link beschrieben. Leider wird diese komplexierte Lösung benötigt, um die Gesichtsfarbe in Streudiagrammen mit Farbcodierung zu entfernen.
Aroc

Der Ansatz in dieser Antwort ist in der Tat nützlich, wenn ein Diagramm aktualisiert werden soll, das ursprünglich keine leeren Kreise enthält. Die Frage zum direkten Erstellen dieser Kreise, also die akzeptierte Lösung, ist der richtige Weg, da sie genau wie diese Antwort funktioniert, jedoch direkt, ohne dass ein erstes Diagramm überflüssig aktualisiert wird.
Eric O Lebigot

Diese "komplexierte Version" hat bei mir funktioniert, als das Einbetten des Arguments .scatter()nicht funktioniert hat. Für den Kontext habe ich auch eine Farbkarte ( c=z, cmap='jet') angewendet .
Andrew Silver

1

Ich gehe also davon aus, dass Sie einige Punkte hervorheben möchten, die bestimmten Kriterien entsprechen. Mit dem Befehl von Prelude können Sie ein zweites Streudiagramm der hervorgehobenen Punkte mit einem leeren Kreis und einem ersten Aufruf erstellen, um alle Punkte zu zeichnen. Stellen Sie sicher, dass der Parameter s klein genug ist, damit die größeren leeren Kreise die kleineren gefüllten einschließen können.

Die andere Option besteht darin, keine Streuung zu verwenden und die Patches mit dem Befehl circle / ellipse einzeln zu zeichnen. Diese befinden sich in matplotlib.patches. Hier finden Sie einen Beispielcode zum Zeichnen von Kreisrechtecken usw.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.