Python 如何在matplotlib中制作不透明散点图

Python 如何在matplotlib中制作不透明散点图,python,matplotlib,Python,Matplotlib,在matplotlib中绘制散点图时,我发现当我更改点的大小时,它们变得透明。我怎样才能防止这种情况发生 我已经试过了alpha=1,facecolor='k',但这些似乎都不起作用 示例代码 X=np.随机.正常(0,15000) Y=np.随机.正常(0,15000) 图,ax=plt.子批次(1,2,figsize=(6,3),dpi=288) ax[0]。散射(X,Y,s=.01,c='k') ax[1]。散射(X,Y,s=1,c='k') plt.show() 结果: 请注意较大的

在matplotlib中绘制散点图时,我发现当我更改点的大小时,它们变得透明。我怎样才能防止这种情况发生

我已经试过了
alpha=1
facecolor='k'
,但这些似乎都不起作用

示例代码

X=np.随机.正常(0,15000)
Y=np.随机.正常(0,15000)
图,ax=plt.子批次(1,2,figsize=(6,3),dpi=288)
ax[0]。散射(X,Y,s=.01,c='k')
ax[1]。散射(X,Y,s=1,c='k')
plt.show()
结果:


请注意较大的点是如何不透明和填充的,而较小的点看起来是透明的,并且具有白色的面颜色。如何将较小的尺寸也填入?

如果您希望正确缩放尺寸,并向下打印到像素限制,则需要调整dpi和图形大小。然后s将正确运行,从最小像素s=1开始。您可能还希望更改默认标记。试试这个:

#divide dpi by four, multiply figsize components by four to keep same area
fig, ax = plt.subplots(1,2, figsize=(24,12), dpi=72)

ax[0].scatter(X,Y, s=1, marker=".", c='k')
ax[1].scatter(X,Y, s=100, marker=".", c='k')
但是,这将使轴标签变小

编辑:我们还可以确保s值永远不是亚最小像素大小,正如评论中指出的那样。这里有一个函数,允许您使用以下命令来处理这些设置:

def scat_rand(size=(24,12), scale=72, smin=1, smax=100, sedge=True, min_pix=1):
    X = np.random.normal(0,1,5000)
    Y = np.random.normal(0,1,5000)
    fig, ax = plt.subplots(1,2, figsize=(size), dpi=scale)

    slimit = (min_pix * 72 / fig.dpi) ** 2
    if smin < slimit + .0001:
        smin = slimit
        print(f"smin too small, reset to {slimit}")

    if sedge:
        ax[0].scatter(X,Y, s=smin, c='k')
        ax[1].scatter(X,Y, s=smax, c='k')
    else:
        ax[0].scatter(X,Y, s=smin, c='k', edgecolor='none')
        ax[1].scatter(X,Y, s=smax, c='k', edgecolor='none')
    plt.suptitle(f"Pixel= {size[0] * scale} x {size[1] * scale}", fontsize=14) 
    plt.show()
另见:

如果您希望大小正确缩放,并向下打印到像素限制,则需要调整dpi和数字大小。然后s将正确运行,从最小像素s=1开始。您可能还希望更改默认标记。试试这个:

#divide dpi by four, multiply figsize components by four to keep same area
fig, ax = plt.subplots(1,2, figsize=(24,12), dpi=72)

ax[0].scatter(X,Y, s=1, marker=".", c='k')
ax[1].scatter(X,Y, s=100, marker=".", c='k')
但是,这将使轴标签变小

编辑:我们还可以确保s值永远不是亚最小像素大小,正如评论中指出的那样。这里有一个函数,允许您使用以下命令来处理这些设置:

def scat_rand(size=(24,12), scale=72, smin=1, smax=100, sedge=True, min_pix=1):
    X = np.random.normal(0,1,5000)
    Y = np.random.normal(0,1,5000)
    fig, ax = plt.subplots(1,2, figsize=(size), dpi=scale)

    slimit = (min_pix * 72 / fig.dpi) ** 2
    if smin < slimit + .0001:
        smin = slimit
        print(f"smin too small, reset to {slimit}")

    if sedge:
        ax[0].scatter(X,Y, s=smin, c='k')
        ax[1].scatter(X,Y, s=smax, c='k')
    else:
        ax[0].scatter(X,Y, s=smin, c='k', edgecolor='none')
        ax[1].scatter(X,Y, s=smax, c='k', edgecolor='none')
    plt.suptitle(f"Pixel= {size[0] * scale} x {size[1] * scale}", fontsize=14) 
    plt.show()
另见:

这有点令人困惑。您无需将dpi设置为72即可获得所需的结果。相反,第一个问题是这些点有一个edgecolor。因此,将其设置为
edgecolor=“none”
。然后确保散射的大小实际上可以被渲染,这意味着它至少需要一个像素大。这将导致散射(X,Y,s=(1*72/图dpi)**2,marker=“o”,c='k',edgecolor=“none”)@ImportanceOfBeingErnest,这确实提供了一种很好的方法来找到正确的一个像素限制。编辑了答案。这有点混乱。您无需将dpi设置为72即可获得所需的结果。相反,第一个问题是这些点有一个edgecolor。因此,将其设置为
edgecolor=“none”
。然后确保散射的大小实际上可以被渲染,这意味着它至少需要一个像素大。这将导致散射(X,Y,s=(1*72/图dpi)**2,marker=“o”,c='k',edgecolor=“none”)@ImportanceOfBeingErnest,这确实提供了一种很好的方法来找到正确的一个像素限制。编辑了答案。