如何在 Python 中用空圆圈绘制散点图?

Posted

技术标签:

【中文标题】如何在 Python 中用空圆圈绘制散点图?【英文标题】:How to do a scatter plot with empty circles in Python? 【发布时间】:2011-05-07 19:24:28 【问题描述】:

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

我尝试了facecolors=None,但无济于事。

【问题讨论】:

想用不同颜色绘制空/空心散点图的人可以看看this question。 【参考方案1】:

基于 Gary Kerr 的示例并按照here 的建议,可以使用以下代码创建与指定值相关的空圆圈:

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" 之外。因此,如给定链接中所述,需要随后删除面部颜色。不幸的是,需要这种复杂的解决方案来使用颜色编码去除散点图中的面部颜色。 如果要更新最初不包含空圆圈的图形,则此答案中的方法确实很有用。但是,关于直接创建这些圆圈的问题,因此接受的解决方案是要走的路,因为它与此答案相同但直接,没有对第一个图的额外更新。 当在.scatter() 中嵌入参数时,这个“复杂版本”对我有用。对于上下文,我还应用了颜色图 (c=z, cmap='jet')。 这是唯一适用于不同颜色的空圆圈的答案【参考方案2】:

在 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) 您可能想要控制标记边缘宽度(使用markeredgewidthmew),因为如果标记相对较小且边缘宽度较厚,则标记看起来会像填充一样,即使它们不是。

以下是使用错误栏的示例:

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

【讨论】:

重新控制线宽的好技巧! markeredgewidth 参数在 matplotlib 3.3.1 中称为 linewidths。在documentation 中查看最新信息【参考方案3】:

来自documentation的分散:

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

注意:对于其他类型的地块,请参阅this post,了解markeredgecolormarkerfacecolor 的使用。

【讨论】:

谢谢!问题是更常见的(在 Python 中)facecolors=None 不起作用,这让我很吃惊。 非常有帮助。是markerfacecolor='none',现在就是这样。 我的 matplotlib 样式将边缘宽度设置为零。如果您没有看到任何带有markerfacecolor='none' 的标记,请尝试添加markeredgewidth=1.0 这种方式也可以在Seaborn中使用,通过标准导入Matplotlib%matplotlib inlineimport matplotlib.pyplot as plt,然后import seaborn as sns; sns.set()将Seaborn设置为默认绘图 边缘宽度当前(v3.4.2)由参数linewidths而不是markeredgewidth指定。 Documentation【参考方案4】:

这些有用吗?

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

【讨论】:

这在您使用plot 而不是scatter 时很有用 对于scatter,您需要指定edgecolors,如edgecolors='r'。否则,圆圈消失。 See here @T_T 如果我指定edgecolors='r',我必须手动指定颜色。有没有办法让空圆圈不消失,而是让 PyPlot 为每个系列自动选择颜色? @becko 不知道,抱歉。【参考方案5】:

这是另一种方式:这会在当前轴、绘图或图像或其他任何内容上添加一个圆圈:

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",图片中的圆圈被压扁成椭圆形)。

【讨论】:

【参考方案6】:

所以我假设你想突出一些符合特定标准的点。您可以使用 Prelude 的命令来绘制带有空圆圈的高亮点的第二个散点图,并第一次调用以绘制所有点。确保 s 参数足够小,以便较大的空圆圈可以包围较小的实心圆圈。

另一个选项是不使用散点图,而是使用圆/椭圆命令单独绘制补丁。这些在 matplotlib.patches 中,here 是一些关于如何绘制圆形矩形等的示例代码。

【讨论】:

以上是关于如何在 Python 中用空圆圈绘制散点图?的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中用 Shiny 绘制散点图;情节没有更新,也没有完全互动

如何使用python绘制散点图?

python 绘制三维图形、三维数据散点图

彩色折线散点图python怎么指定数据

power bi怎么做散点图啊?如何利用power bi绘制散点图??

如何在单个 y 刻度上绘制散点图