Bagaimana cara membuat sebar plot dengan lingkaran kosong di Python?

166

Dengan Python, dengan Matplotlib, bagaimana plot sebaran dengan lingkaran kosong bisa diplot? Tujuannya adalah untuk menggambar lingkaran kosong di sekitar beberapa disk berwarna yang telah direncanakan scatter(), sehingga untuk menyorotnya, idealnya tanpa harus menggambar ulang lingkaran berwarna.

Saya mencoba facecolors=None, tetapi tidak berhasil.

Eric O Lebigot
sumber
1
Orang yang ingin menggambar plot hamburan kosong / berlubang dengan warna yang berbeda dapat melihat pertanyaan ini .
ImportanceOfBeingErnest

Jawaban:

242

Dari dokumentasi untuk pencar:

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

Coba yang berikut ini:

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

contoh gambar

Catatan: Untuk jenis plot lainnya, lihat posting ini tentang penggunaan markeredgecolordan markerfacecolor.

Gary Kerr
sumber
4
Terima kasih! Gotcha adalah bahwa semakin biasa (dengan Python) facecolors=Nonetidak berfungsi, yang membuat saya tersandung.
Eric O Lebigot
24
Sangat membantu. Ini markerfacecolor='none', inilah caranya sekarang.
hesham_EE
2
Saya memiliki gaya matplotlib saya dengan cara yang mengatur lebar tepi menjadi nol. Jika Anda tidak melihat spidol dengan markerfacecolor='none'mencoba menambahkanmarkeredgewidth=1.0
oLas
Pendekatan ini juga dapat digunakan di Seaborn setelah melakukan impor standar Matplotlib %matplotlib inlinedan import matplotlib.pyplot as plt, dan kemudian menetapkan Seaborn sebagai standar pembuatan plot olehimport seaborn as sns; sns.set()
Jakob
68

Apakah ini akan berhasil?

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

contoh gambar

atau menggunakan plot ()

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

contoh gambar

Gökhan Sever
sumber
3
ini berguna saat Anda menggunakannya plotsebagai penggantiscatter
Trevor Boyd Smith
2
Untuk scatter, Anda perlu menentukan edgecolorssuka edgecolors='r'. Kalau tidak, lingkarannya akan hilang. Lihat di sini
T_T
14

Berikut cara lain: ini menambahkan lingkaran ke sumbu, plot, atau gambar saat ini atau apa pun:

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 )

teks alternatif

(Lingkaran pada gambar bisa tergencet ke elips karena imshow aspect="auto").

denis
sumber
5

Di matplotlib 2.0 ada parameter yang disebut fillstyle yang memungkinkan kontrol yang lebih baik pada cara penanda diisi. Dalam kasus saya, saya telah menggunakannya dengan errorbars tetapi berfungsi untuk spidol secara umum http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstylemenerima nilai berikut: ['penuh' | 'kiri' | 'benar' | 'bawah' | 'atas' | 'tidak ada']

Ada dua hal penting yang perlu diingat saat menggunakan fillstyle ,

1) Jika mfc diatur ke jenis nilai apa pun akan diprioritaskan, maka, jika Anda menetapkan fillstyle menjadi 'tidak ada' itu tidak akan berpengaruh. Jadi hindari menggunakan mfc bersamaan dengan fillstyle

2) Anda mungkin ingin mengontrol lebar tepi marker (menggunakan markeredgewidthataumew ) karena jika marker relatif kecil dan lebar tepi tebal, marker akan terlihat seperti terisi meskipun sebenarnya tidak.

Berikut ini adalah contoh menggunakan errorbars:

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

Berdasarkan contoh Gary Kerr dan seperti yang diusulkan di sini, seseorang dapat membuat lingkaran kosong terkait dengan nilai yang ditentukan dengan kode berikut:

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()
Aroc
sumber
Ini adalah versi rumit dari jawaban yang diterima ...
Eric O Lebigot
Dari poin saya bukan? Menggunakan sebar plot dengan warna tidak kecuali facecolor = "none" di dalam perintah. Untuk itu diperlukan penghilangan warna depan seperti yang dijelaskan dalam tautan yang diberikan. Sayangnya solusi yang rumit ini diperlukan untuk menghilangkan facecolor dalam plot pencar dengan kode warna.
Aroc
Pendekatan dalam jawaban ini memang berguna jika seseorang ingin memperbarui grafik yang awalnya tidak mengandung lingkaran kosong. Namun, pertanyaan tentang membuat lingkaran ini secara langsung, sehingga solusi yang diterima adalah cara untuk pergi, karena ia melakukan hal yang sama dengan jawaban ini tetapi secara langsung, tanpa pembaruan yang asing dari grafik pertama.
Eric O Lebigot
"Versi yang rumit" ini berhasil bagi saya ketika menanamkan argumen di dalam .scatter()tidak. Untuk konteks, saya juga menerapkan colormap ( c=z, cmap='jet').
Andrew Silver
1

Jadi saya menganggap Anda ingin menyoroti beberapa poin yang sesuai dengan kriteria tertentu. Anda dapat menggunakan perintah Prelude untuk melakukan plot pencar kedua dari titik-titik yang disorot dengan lingkaran kosong dan panggilan pertama untuk memplot semua poin. Pastikan paramter s cukup kecil untuk lingkaran kosong yang lebih besar untuk melampirkan yang lebih kecil diisi.

Opsi lainnya adalah tidak menggunakan sebar dan menggambar tambalan satu per satu menggunakan perintah lingkaran / elips. Ini ada di matplotlib.patches, berikut adalah beberapa contoh kode tentang cara menggambar lingkaran persegi panjang dll.

ada apa
sumber