Как сделать точечный график с пустыми кругами в Python? - PullRequest
134 голосов
/ 10 ноября 2010

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

Я пытался facecolors=None, безрезультатно.

Ответы [ 5 ]

196 голосов
/ 10 ноября 2010

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

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

example image

Примечание: Для других типов графиков см. этот пост об использовании markeredgecolor и markerfacecolor.

60 голосов
/ 10 ноября 2010

Будет ли это работать?

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

example image

или с использованием plot ()

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

example image

14 голосов
/ 23 ноября 2010

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

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").

4 голосов
/ 22 марта 2017

В 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')
1 голос
/ 10 ноября 2010

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

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

...