HOME/Articles/

matplotlib example make-hello-scatter-point (snippet)

Article Outline

Python matplotlib example 'make-hello-scatter-point'

Functions in program:

  • def make_hello(N=1000, rseed=42):

python make-hello-scatter-point

Python matplotlib example: make-hello-scatter-point

# 用matplotlib画hello的点集
# 1. 基于text生成一个png图像
# 2. 读取图像,随机取点阵,在png图像中有像素的点,就是一个目标点
# 3. 图像用scatter画出

# [from](https://jakevdp.github.io/PythonDataScienceHandbook/05.10-manifold-learning.html)
def make_hello(N=1000, rseed=42):
    # Make a plot with "HELLO" text; save as PNG
    fig, ax = plt.subplots(figsize=(4, 1))
    fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
    ax.axis('off')
    ax.text(0.5, 0.4, 'hello', va='center', ha='center', weight='bold', size=85)
    fig.savefig('img/hello.png')
    plt.close(fig)

    # Open this PNG and draw random points from it
    from matplotlib.image import imread

    # imread得到的结果,按照左上角为原点,(y,x)的方式组织
    # 所以读取后,第一个维度装置,变为左下角为原点;第二个维度保持;取第三个维度的r通道
    # 判断是否存在数据即可;最终再装置一下,得到(x,y) 的排列
    src = imread('img/hello.png')
    data = src[::-1, :, 0].T

    rng = np.random.RandomState(rseed)
    X = rng.rand(4 * N, 2)

    # 乘以data.shape就是将[0, 1.0]的数据扩展到data的维度
    i, j = (X * data.shape).astype(int).T
    mask = (data[i, j] < 1)
    X = X[mask]

    # 找到之后,记得X的数据,x,y的范围都是[0, 1.0],所以将y的长度记作1.0,x的长度需要扩展一下
    X[:, 0] = X[:, 0] * (data.shape[0] / data.shape[1])

    # 取得前N个数,再基于argsoft得到排序后的索引给,进而得到最终排序后的前N个有图像内容的数据点
    X = X[:N]
    return X[np.argsort(X[:, 0])]

X = make_hello()

# 将X离散到[0.0, 4.0]的好处就是可以指定color
# 如果指定离散的color数量,需用get_cmap
plt.scatter(
    X[:, 0], X[:, 1], 
    c=X[:, 0], 
    cmap='rainbow', #plt.cm.get_cmap('rainbow', 5));
    alpha=.5,
    edgecolors=None
)

# 保证X和Y轴的数据1:1的单位长度,调整图片的大小来适配
plt.axis('scaled');