Python'da boş dairelerle bir dağılım grafiği nasıl yapılır?


167

Python'da, Matplotlib ile, boş daireler içeren bir dağılım grafiği nasıl çizilebilir? Amaç, önceden çizilen bazı renkli disklerin etrafına scatter(), özellikle renkli daireleri yeniden çizmek zorunda kalmadan vurgulamak için boş daireler çizmektir .

Denedim facecolors=None, boşuna.


1
Farklı renklere sahip boş / içi boş dağılım grafikleri çizmek isteyenler bu soruya bakabilir .
ImportanceOfBeingErnest

Yanıtlar:


243

Gönderen belgeler dağılım için:

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

Takip etmeyi dene:

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

örnek resim

Not: parsellerin diğer tür için bkz Bu yayını kullanımına markeredgecolorve markerfacecolor.


4
Teşekkürler! Anladım, daha olağan (Python'da) facecolors=Noneişe yaramıyor, bu da beni tetikledi.
Eric O Lebigot

24
Çok yararlı. Bu markerfacecolor='none', şimdi böyle.
hesham_EE

2
Matplotlib tarzımı, kenar genişliklerini sıfıra ayarlayacak şekilde yaptım. Eğer herhangi bir işaretçileri görmüyorsanız markerfacecolor='none'deneyin ekleyerekmarkeredgewidth=1.0
OLAS

Bu yaklaşım aynı zamanda Matplotlib standart ithalat yaptıktan sonra Seaborn kullanılabilir %matplotlib inlineve import matplotlib.pyplot as pltçizimi varsayılan olarak Seaborn ayarlayarak sonra veimport seaborn as sns; sns.set()
Jakob

68

Bunlar işe yarar mı?

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

örnek resim

veya plot () kullanarak

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

örnek resim


3
Bu, plotyerine kullandığınızda kullanışlıdırscatter
Trevor Boyd Smith

2
İçin scatter, edgecolorsgibi belirtmeniz gerekir edgecolors='r'. Aksi takdirde daireler kaybolur. Buraya bakın
T_T

14

İşte başka bir yol: bu, mevcut eksenlere, çizime veya görüntüye veya herhangi bir şekilde bir daire ekler:

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 )

alternatif metin

(Resimdeki daireler elips şeklinde ezilir çünkü imshow aspect="auto").


5

Matplotlib 2.0'da, fillstyle işaretleyicilerin doldurulma şekli üzerinde daha iyi kontrol sağlayan bir parametre vardır. Benim durumumda hata çubuklarıyla kullandım ama genel olarak işaretçiler için çalışıyor http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyleaşağıdaki değerleri kabul eder: ['full' | 'sol' | 'doğru' | 'alt' | 'üst' | 'Yok']

Kullanırken akılda tutulması gereken iki önemli şey vardır fillstyle,

1) Eğer mfc herhangi bir değere ayarlanırsa, öncelik alacaktır, bu nedenle, doldurma stilini 'none' olarak ayarladıysanız geçerli olmaz. Mfc'yi fillstyle ile birlikte kullanmaktan kaçının

2) İşaretçi kenar genişliğini ( markeredgewidthveya kullanarak mew) kontrol etmek isteyebilirsiniz, çünkü işaretçi nispeten küçükse ve kenar genişliği kalınsa, işaretçiler olmasa da dolu gibi görünür.

Hata çubuklarını kullanan bir örnek aşağıdadır:

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

2

Gary Kerr örneğine dayanır ve burada önerildiği gibi , aşağıdaki kodla belirtilen değerlerle ilgili boş daireler oluşturulabilir:

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

Bu aslında kabul edilen cevap karmaşık bir versiyonu ...
Eric O Lebigot

Benim açımdan öyle değil. Renklerle dağılım grafiğini kullanmak, komuttaki facecolor = "none" dışında değildir. Bu nedenle, verilen bağlantıda açıklandığı gibi yüz renginin daha sonra çıkarılması gerekir. Ne yazık ki bu karmaşıklaştırılmış çözelti, renk kodlaması ile saçılma alanlarındaki yüz rengini kaldırmak için gereklidir.
Aroc

Bu cevaptaki yaklaşım, aslında boş daireler içermeyen bir grafiği güncellemek istiyorsa gerçekten yararlıdır. Bununla birlikte, bu çevreleri doğrudan oluşturma hakkındaki soru , bu nedenle kabul edilen çözüm, bu cevapla aynı şekilde olduğu gibi, ancak ilk grafiğin harici bir güncellemesi olmadan doğrudan gitmenin yoludur.
Eric O Lebigot

Bu "karmaşık versiyon" argümanı içine gömdüğümde benim için çalıştı .scatter(). Bağlam için ayrıca bir colormap ( c=z, cmap='jet') uyguluyordum .
Andrew Silver

1

Bu nedenle, belirli kriterlere uyan bazı noktaları vurgulamak istediğinizi varsayalım. Boş bir daire ve tüm noktaları çizmek için bir ilk çağrı ile vurgulanmış noktaların ikinci bir dağılım grafiğini yapmak için Prelude komutunu kullanabilirsiniz. Daha büyük boş dairelerin daha küçük doldurulmuş olanları kaplaması için parametrenin yeterince küçük olduğundan emin olun.

Diğer seçenek, daire / elips komutunu kullanarak dağılmayı kullanmamak ve yamaları ayrı ayrı çizmektir. Bunlar matplotlib.patches'tedir, burada daire dikdörtgenlerinin nasıl çizileceği hakkında bazı örnek kodlar vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.