В Python, с Matplotlib, как можно построить график рассеяния с пустыми кругами? Цель состоит в том, чтобы нарисовать пустые круги вокруг некоторых цветных дисков, уже нанесенных на scatter()
, чтобы выделить их, в идеале, без необходимости перерисовывать цветные круги.
Как сделать диаграмму рассеяния с пустыми кругами в Python?
Ответ 1
Из документации для разброса:
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
.
Ответ 2
Будут ли они работать?
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')
Ответ 3
Здесь другой способ: это добавляет круг к текущим осям, сюжету или изображению или что-то еще:
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 )
(Круги на рисунке попадают в эллипсы, потому что imshow aspect="auto"
).
Ответ 4
В matplotlib 2.0 указан параметр fillstyle
что позволяет лучше контролировать способ заполнения маркеров.
В моем случае я использовал его с ошибками, но он работает для маркеров вообще
http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html
fillstyle
принимает следующие значения: ['full | 'Left | 'Право | "Нижний | 'Наверх |" Ни]
При использовании 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')
Ответ 5
Итак, я предполагаю, что вы хотите выделить некоторые моменты, которые соответствуют определенным критериям. Вы можете использовать команду Prelude, чтобы сделать второй график рассеяния точек с подсветкой с пустым кружком и первым вызовом для построения всех точек. Убедитесь, что параметр s достаточно мал, чтобы большие пустые круги закрывали меньшие заполненные.
Другой вариант - не использовать разброс и рисовать патчи по отдельности с помощью команды circle/ellipse. Это в matplotlib.patches, здесь - это пример кода для рисования кругов прямоугольников и т.д.