如何在 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) 您可能想要控制标记边缘宽度(使用markeredgewidth
或mew
),因为如果标记相对较小且边缘宽度较厚,则标记看起来会像填充一样,即使它们不是。
以下是使用错误栏的示例:
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,了解markeredgecolor
和markerfacecolor
的使用。
【讨论】:
谢谢!问题是更常见的(在 Python 中)facecolors=None
不起作用,这让我很吃惊。
非常有帮助。是markerfacecolor='none'
,现在就是这样。
我的 matplotlib 样式将边缘宽度设置为零。如果您没有看到任何带有markerfacecolor='none'
的标记,请尝试添加markeredgewidth=1.0
这种方式也可以在Seaborn中使用,通过标准导入Matplotlib%matplotlib inline
和import 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 绘制散点图;情节没有更新,也没有完全互动