Wie ein Streudiagramm mit leeren Kreisen in Python zu tun?
-
30-09-2019 - |
Frage
In Python mit Matplotlib, wie kann ein Streudiagramm mit leer Kreise gezeichnet werden? Ziel ist es, leere Kreise zu ziehen um einig der farbigen Platten bereits von scatter()
aufgetragen, um sie zu markieren, im Idealfall, ohne dass die farbigen Kreise neu zu zeichnen.
Ich habe versucht facecolors=None
, ohne Erfolg.
Lösung
Von der Dokumentation 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
Versuchen Sie 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()
Hinweis: Für andere Arten von Parzellen finden Sie unter dieser Beitrag über die Verwendung von markeredgecolor
und markerfacecolor
.
Andere Tipps
würde diese Arbeit?
plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none')
oder mit plot ()
plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none')
Hier ist eine andere Art und Weise: Dies fügt einen Kreis auf den aktuellen Achsen, Grundstück oder ein Bild oder was auch immer:
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 )
(Die Kreise im Bild zu Ellipsen zerquetscht erhalten, weil imshow aspect="auto"
).
In matplotlib 2.0 gibt es einen Parameter namens fillstyle
das ermöglicht eine bessere Kontrolle über die Art und Weise Marker gefüllt ist.
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
fillstyle
akzeptiert die folgenden Werte: [ ‚voll‘ | ‚Links‘ | ‚Rechts‘ | ‚Bottom‘ | 'Nach oben' | ‚None‘]
Es gibt zwei wichtige Dinge im Auge zu behalten, wenn fillstyle
verwenden,
1) Wenn mfc auf jede Art von Wert gesetzt wird Priorität wird daher, wenn Sie Satz FillStyle tun ‚none‘ wäre es nicht wirksam. So vermeiden Sie mfc in conjuntion mit FillStyle
2) Sie könnten die Markierungskantenbreite (mit markeredgewidth
oder mew
), weil steuern möchten, wenn der Marker relativ klein ist und die Kantenbreite dick ist, werden die Markierungen wie gefüllt aussehen, obwohl sie es nicht sind.
Es folgt ein Beispiel mit Fehlerbalken:
myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue', mec='blue')
Also gehe ich davon aus Sie einige Punkte hervorheben wollen, die bestimmten Kriterien entsprechen. Sie können Prelude Befehl zu tun, um eine zweite Streudiagramm der hightlighted Punkte mit einem leeren Kreis und einem ersten Anruf plotten alle Punkte verwenden. Achten Sie darauf, die s Paramter ausreichend klein ist für die größeren leeren Kreise die kleineren gefüllt diejenigen einzuschließen.
Die andere Option ist nicht streuen zu verwenden und die Patches einzeln mit dem Kreis / Ellipse Befehl zu zeichnen. Diese sind in matplotlib.patches, hier ist ein Beispielcode, wie Kreise zu zeichnen Rechtecke, etc.