scatter散点图大小自适应

August 2018 · 1 minute read

我们知道,scatter 散点图的基本绘图参数包括几个方面:

  1. 点的位置坐标 x 和 y
  2. 点的颜色 c
  3. 点的大小 s

至于点的标记样式,以及标记外边线宽度、颜色和整体透明度、colorbar 等等,这些就不讨论了,按照自己的需要设置即可。

今天我们主要关注一下 marker 大小的设置问题。来看一个例子:

import numpy as np
import matplotlib.pyplot as plot


x, y, z = [np.random.randint(-1000, 1000, (10, 10)) for _ in range(3)]

plt.scatter(x, y, c=z, s=np.abs(z))
cbar = plt.colorbar()
plt.axist('scaled')
plt.show()

scatter_plot_0.png

大小 s 必须为正,不能为负,因此这里用的是 s=np.abs(z)。图本质上没有问题,只是点的大小看上去不太合适。 我们来修正一下:

s = 15 * (np.abs(z) / np.mean(np.abs(z)))**2
plt.scatter(x, y, c=z, s=s)
cbar = plt.colorbar()
plt.axist('scaled')
plt.show()

scatter_plot_1.png

上述的处理其实只是用 z 的绝对值与 z 绝对值均值的比值的平方对基准大小(这里是 15)做了调节。 注意,再控制 marker 大小时,绝对值是必须的,这样几乎完全可以避免均值为 0 情况的出现(除非 z 本身全部为 0)。

matplotlib 官网上的例子非常丰富,绝大多数情况查查例子自己试验一下就好了。