【问题标题】:How to color clusters in scatter plot using an array?如何使用数组为散点图中的簇着色?
【发布时间】:2021-02-17 05:33:42
【问题描述】:

我正在使用 sklearn noisy_circles function 和链接中的 1500 分来创建 2 个圈子。
我有一个点引用数组,其中每个值都应该是不同的簇颜色:

nbrs_array = [ 88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88, 973,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
       973,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88, 984,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88, 992,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88, 972,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88, 992,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88, 984,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88, 972,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
        88,  88,  88,  88,  88]

数组中有 5 个唯一值,因此应该有 5 种不同的颜色。但是当我使用它来绘制它时:

plt.figure(figsize=(10,10))
plt.scatter(x,y, c=nbrs_array)
plt.show()

输出为

【问题讨论】:

    标签: python numpy matplotlib scikit-learn scatter


    【解决方案1】:

    这样的事情应该可以完成:

    import numpy as np
    from matplotlib import cm
    from matplotlib import pyplot as plt
    from matplotlib.colors import Normalize, to_hex
    from sklearn import datasets
    
    
    def get_colors(arr, cmap='viridis'):
        cmap = cm.get_cmap(cmap)
        n = len(np.unique(arr))
        colornorm = Normalize(vmin=1, vmax=n)
        hex_map = dict()
        for i, cl in enumerate(np.unique(arr)):
            hex_map[cl] = to_hex(cmap(colornorm(i + 1)))
        colors = list(map(lambda x: hex_map[x], arr))
        return colors
    
    
    n_samples = 1500
    data, _ = datasets.make_circles(n_samples=n_samples, factor=.5, noise=.05)
    x, y = data[:, 0], data[:, 1]
    nbrs_array = [...]
    
    plt.figure(figsize=(10, 10))
    plt.scatter(x, y, c=get_colors(nbrs_array))
    plt.show()
    

    【讨论】:

    • 耶!非常感谢
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2016-11-20
    • 2015-05-22
    相关资源
    最近更新 更多