Як зробити ділянку розкидання з порожніми колами в Python?


167

Як в Python, разом з Matplotlib, як можна розкласти ділянку з порожніми колами? Мета полягає в тому, щоб намалювати порожні кола навколо деяких кольорових дисків, які вже побудовані scatter(), щоб виділити їх, в ідеалі, не потребуючи перемальовування кольорових кіл.

Я намагався facecolors=None, безрезультатно.


1
Люди, які хочуть намалювати порожні / порожнисті ділянки з різними кольорами, можуть поглянути на це питання .
ВажливістьBeingErnest

Відповіді:


243

З документації на розкидання:

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

Спробуйте наступне:

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

Приклад зображення

Примітка. Для інших типів сюжетів дивіться цю публікацію про використання markeredgecolorта markerfacecolor.


4
Дякую! Гатча полягає в тому, що звичніше (в Python) facecolors=Noneне працює, що мене спалохало.
Ерік О Лебігот

24
Дуже корисний. Це так markerfacecolor='none', це зараз.
hesham_EE

2
Я мав свій стиль matplotlib таким чином, щоб встановити ширину країв до нуля. Якщо ви не бачите жодних маркерів, markerfacecolor='none'спробуйте додатиmarkeredgewidth=1.0
oLas

Цей підхід також може бути використаний в Сіборн після виконання стандартного імпорту Matplotlib %matplotlib inlineі import matplotlib.pyplot as plt, а потім встановити Сіборн бути змовницьки по замовчуванням,import seaborn as sns; sns.set()
Якоб

68

Чи працювали б вони?

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

Приклад зображення

або за допомогою сюжету ()

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

Приклад зображення


3
це корисно, коли ви використовуєте plotзамість цьогоscatter
Тревор Бойд Сміт

2
Для цього scatterвам потрібно вказати edgecolorsподібне edgecolors='r'. В іншому випадку кола зникають. Дивіться тут
T_T

14

Ось ще один спосіб: це додає коло до поточних осей, сюжету чи зображення чи ще:

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 текст

(Кола на малюнку розбиваються до еліпсів, тому що imshow aspect="auto").


5

У matplotlib 2.0 є параметр, fillstyle який називається, що дозволяє краще контролювати спосіб заповнення маркерів. У моєму випадку я використовував його з панелями помилок, але він працює для маркерів взагалі http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyleприймає такі значення: ['full' | 'зліва' | 'правильно' | 'дно' | 'верх' | "немає"]

Слід пам’ятати про дві важливі речі при використанні fillstyle,

1) Якщо mfc встановлено на будь-який вид значення, він буде мати пріоритет, отже, якщо ви встановили стиль для "none", він не набере чинності. Тому уникайте використання mfc спільно з fillstyle

2) Ви можете контролювати ширину краю маркера (використовуючи markeredgewidthабо mew), оскільки якщо маркер порівняно невеликий, а ширина краю є товстою, маркери будуть схожі на заповнені, навіть якщо вони не є.

Нижче наводиться приклад використання панелей помилок:

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

2

На основі прикладу Гері Керра та запропонованого тут можна створити порожні кола, пов'язані із вказаними значеннями, із наступним кодом:

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

Це, по суті, ускладнена версія, прийнята відповідь…
Ерік О Лебігот

З моєї точки зору це не так. Використання розкиду ділянки з кольорами не виключає facecolor = "none" в межах команди. Для цього потрібно подальше видалення фарби, як описано в даному посиланні. На жаль, це складне рішення потрібно для видалення кольору обличчя на розкиданих ділянках з кольоровим кодуванням.
Aroc

Підхід у цій відповіді дійсно корисний, якщо хочеться оновити графік, який спочатку не містить порожніх кіл. Однак питання про створення цих кіл безпосередньо, тому прийнятим рішенням є шлях, оскільки він робить те саме, що і ця відповідь, але безпосередньо, без стороннього оновлення першого графа.
Ерік О Лебігот

Ця "складна версія" працювала для мене, коли вбудовувати аргумент всередину .scatter()не було. Для контексту я також застосовував кольорову карту ( c=z, cmap='jet').
Ендрю Сільвер

1

Тож я припускаю, що ви хочете виділити деякі моменти, які відповідають певним критеріям. Ви можете скористатися командою Prelude, щоб зробити другий графік розсіяння виділених точок з порожнім колом та перший дзвінок для побудови всіх точок. Переконайтеся, що параметр s достатньо малий, щоб великі порожні кола містили менші заповнені.

Інший варіант - не використовувати розкидання та малювати патчі окремо за допомогою команди круг / еліпс. Вони є в matplotlib.patches, ось деякий зразок коду про те, як намалювати кола прямокутників тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.