Как сделать диаграмму рассеяния с пустыми кружками в Python?

Как в Python с помощью Matplotlib построить диаграмму рассеяния с пустыми кругами? Цель состоит в том, чтобы нарисовать пустые круги вокруг некоторых цветных дисков, уже нанесенных scatter(), чтобы выделить их, в идеале без необходимости перерисовывать цветные круги.

Я пробовал facecolors=None, но безуспешно.


person Eric O Lebigot    schedule 10.11.2010    source источник
comment
Люди, которые хотят рисовать пустые / полые диаграммы рассеяния разными цветами, могут посмотреть на этот вопрос.   -  person ImportanceOfBeingErnest    schedule 25.03.2018


Ответы (6)


Из документации для разброса:

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.

person Gary Kerr    schedule 10.11.2010
comment
Спасибо! Проблема в том, что более обычный (в Python) facecolors=None не работает, что меня сбило с толку. - person Eric O Lebigot; 01.03.2015
comment
Очень полезно. Это markerfacecolor='none', так и сейчас. - person hesham_EE; 28.05.2015
comment
У меня был стиль matplotlib таким образом, чтобы ширина краев была равна нулю. Если вы не видите маркеров с markerfacecolor='none', попробуйте добавить markeredgewidth=1.0 - person oLas; 19.09.2017
comment
Этот подход также можно использовать в Seaborn после выполнения стандартного импорта Matplotlib %matplotlib inline и import matplotlib.pyplot as plt, а затем установки Seaborn в качестве значения по умолчанию для построения графиков с помощью import seaborn as sns; sns.set() - person Jakob; 30.07.2019
comment
Ширина кромки в настоящее время (v3.4.2) определяется параметром linewidths вместо markeredgewidth. Документация - person Mr G; 11.06.2021

Это сработает?

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

пример изображения

или используя plot ()

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

пример изображения

person Gökhan Sever    schedule 10.11.2010
comment
это полезно, когда вы используете plot вместо scatter - person Trevor Boyd Smith; 15.05.2018
comment
Для scatter необходимо указать edgecolors как edgecolors='r'. В противном случае круги исчезнут. См. здесь - person T_T; 30.01.2019

Вот другой способ: это добавляет круг к текущим осям, сюжету, изображению или чему-то еще:

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

(Круги на картинке превращаются в эллипсы, потому что imshow aspect="auto").

person denis    schedule 23.11.2010

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

fillstyle принимает следующие значения: [‘full’ | «Левый» | «Правильно» | «Дно» | «Верх» | 'никто']

При использовании fillstyle следует помнить о двух важных вещах:

1) Если для mfc установлено любое значение, оно будет иметь приоритет, следовательно, если вы установили для fillstyle значение «none», это не сработает. Поэтому избегайте использования mfc вместе с fillstyle.

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

Ниже приведен пример использования полос ошибок:

myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue',  mec='blue')
person Salvatore Cosentino    schedule 22.03.2017
comment
Хороший совет по контролю ширины линии! Параметр markeredgewidth называется linewidths в matplotlib 3.3.1. Актуальную информацию см. В документации - person XavierStuvw; 21.10.2020

На основе примера Гэри Керра и предложенного здесь одного может создавать пустые круги, связанные с указанными значениями, со следующим кодом:

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()
person Aroc    schedule 27.11.2019
comment
Это, по сути, усложненная версия принятого ответа ... - person Eric O Lebigot; 02.12.2019
comment
С моей точки зрения, это не так. Использование точечной диаграммы с цветами не исключает facecolor = none внутри команды. Для этого необходимо последующее удаление цвета лица, как описано в данной ссылке. К сожалению, это сложное решение необходимо для удаления цвета лица на диаграммах рассеяния с цветовым кодированием. - person Aroc; 03.12.2019
comment
Подход в этом ответе действительно полезен, если кто-то хочет обновить граф, который изначально не содержит пустых кружков. Однако вопрос о создании этих кругов напрямую, поэтому принятое решение - это выход, поскольку он делает то же самое, что и этот ответ, но напрямую, без постороннего обновления первого графика. - person Eric O Lebigot; 04.12.2019
comment
Эта усложненная версия сработала для меня, а встраивание аргумента в .scatter() - нет. Для контекста я также применил цветовую карту (c=z, cmap='jet'). - person fact_finder; 14.05.2020
comment
это был единственный ответ, который действительно работал для пустых кругов разного цвета - person raphael; 11.08.2020

Итак, я предполагаю, что вы хотите выделить некоторые моменты, которые соответствуют определенным критериям. Вы можете использовать команду Prelude для построения второй диаграммы рассеяния выделенных точек с пустым кружком и первого вызова для построения всех точек. Убедитесь, что параметр s достаточно мал, чтобы большие пустые кружки охватывали меньшие закрашенные.

Другой вариант - не использовать разброс и рисовать участки по отдельности с помощью команды круг / эллипс. Они находятся в matplotlib.patches, здесь приведен пример кода о том, как рисовать круги. прямоугольники и т. д.

person whatnick    schedule 10.11.2010