如何在Python中绘制带有空圆圈的散点图?

如何在Python中绘制带有空圆圈的散点图?,python,matplotlib,geometry,scatter-plot,scatter,Python,Matplotlib,Geometry,Scatter Plot,Scatter,在Python中,使用Matplotlib,如何绘制带有空圆的散点图?我们的目标是在已由scatter()绘制的一些彩色磁盘周围绘制空圆圈,以便突出显示它们,理想情况下无需重新绘制彩色圆圈 我尝试了facecolors=None,但没有成功。这些方法有效吗 plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none') 或者使用plot() 来自散射: Optional kwargs control the

在Python中,使用Matplotlib,如何绘制带有空圆的散点图?我们的目标是在已由
scatter()
绘制的一些彩色磁盘周围绘制空圆圈,以便突出显示它们,理想情况下无需重新绘制彩色圆圈

我尝试了
facecolors=None
,但没有成功。

这些方法有效吗

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

或者使用plot()

来自散射:

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

的使用,因此我假设您希望突出显示符合特定标准的一些点。您可以使用Prelude的命令,使用一个空圆圈对高亮点进行第二次散点图,并第一次调用以绘制所有点。确保s参数足够小,以便较大的空圆包围较小的填充圆


另一个选项是不使用“散射”,而是使用“圆/椭圆”命令单独绘制面片。这些都在matplotlib.patches中,是一些关于如何绘制圆、矩形等的示例代码。

还有另一种方法:将圆添加到当前轴、绘图或图像或其他对象:

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”
)。

在matplotlib 2.0中,有一个参数名为
fillstyle
这样可以更好地控制标记的填充方式。 在我的例子中,我将它与errorbars一起使用,但它通常适用于标记

fillstyle
接受以下值:[“满”|“左”|“右”|“下”|“上”|“无”]

在使用
fillstyle
时,需要记住两件重要的事情:

1) 如果mfc设置为任何类型的值,它将具有优先权,因此,如果将fillstyle设置为“无”,它将不会生效。 因此,避免将mfc与fillstyle结合使用

2) 您可能希望控制标记的边缘宽度(使用
markeredgewidth
mew
),因为如果标记相对较小且边缘宽度较厚,则标记看起来就像是填充的,即使它们不是

以下是使用errorbars的示例:

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

以Gary Kerr为例,根据建议,可以使用以下代码创建与指定值相关的空圆:

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

谢谢问题是,更常见的(在Python中)
facecolors=None
不起作用,这让我大吃一惊。非常有用。这是
markerfacecolor='none'
,现在就是这样。我的matplotlib样式将边宽度设置为零。如果您没有看到任何带有
markerfacecolor='none'
的标记,请尝试添加
markeredgewidth=1.0
此方法也可以在Seaborn中使用,方法是在标准导入Matplotlib
%Matplotlib inline
将Matplotlib.pyplot作为plt导入之后,然后通过
import Seaborn as sns将Seaborn设置为绘图默认值;sns.set()
边缘宽度当前(v3.4.2)由参数
linewidths
指定,而不是
markeredgewidth
。希望使用不同颜色绘制空/空散点图的人可以查看。这对于使用
plot
而不是
scatter
来绘制
scatter
散点图非常有用,您需要指定
edgecolors
类似
edgecolors='r'
。否则,圆圈将消失。这本质上是一个复杂的版本,一个公认的答案……从我的观点来看,它不是。使用带有颜色的散点图不会影响命令中的facecolor=“none”。因此,如给定链接中所述,需要随后移除facecolor。不幸的是,这种复杂化的解决方案需要通过颜色编码去除散点图中的facecolor。如果要更新最初不包含空圆的图形,此答案中的方法确实很有用。但是,关于直接创建这些圆的问题,因此公认的解决方案是可行的,因为它与此答案相同,但直接创建,没有对第一个图形进行额外的更新。在
中嵌入参数时,这种“复杂化版本”对我有效。scatter()
没有。在上下文中,我还应用了一个颜色映射(
c=z,cmap='jet'
)。这是唯一一个对具有不同颜色的空圆有效的答案。很好地重新控制了线宽!在matplotlib 3.3.1中,
markeredgewidth
参数称为
linewidths
。请参阅中的最新信息
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()