如何使用 cmap 知道目标值使用哪种颜色

Posted

技术标签:

【中文标题】如何使用 cmap 知道目标值使用哪种颜色【英文标题】:How to know which color is being used for target values with cmap 【发布时间】:2019-12-05 15:30:12 【问题描述】:

我正在关注绘制 SVC 的 SO answer,但我想对其进行调整,以便知道哪种颜色与目标值(1 或 0)相关联。我最初的解决方案是递增数据并根据目标值设置标记,但是,我相信由于我使用的是cmapc 预计将是一个数组,但我传入@987654324 @。试图弄清楚如何解决这个问题。

for i in range(X0.shape[0]):
    ax.scatter(X0[i], X1[i], c=y[i], marker=markers[i], cmap=plt.cm.coolwarm, s=20, edgecolors='k')

我也尝试过使用颜色条,但它是黑白的。

PCM=ax.get_children()[2] 
plt.colorbar(PCM, ax=ax) 

y: [1 1 1 1 1 0 0 0 0 0]

X0:[375 378 186 186 186 69 1048 515 1045 730]

X1:[159 73 272 58 108 373 373 373 373 267]

【问题讨论】:

@ImportanceOfBeingErnest 这会导致同样的错误...n_elem = c_array.shape[0] IndexError: tuple index out of range 要获得一个颜色条,您需要创建一个包含所有值的散点图。我不知道 X0、X1 和 y 是什么。 @ImportanceOfBeingErnest 我在数据值中进行了编辑。 在这种情况下只需plt.scatter(X0,X1, c=y) 【参考方案1】:

只是为了替代散点图和颜色条,我会 提及带有标记但没有线条的线图,以及图例。去做 那,您必须事先对数据进行分组,但这只是几行 一个函数...

import numpy as np 
import matplotlib.pyplot as plt                                                                        

y =  [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]                                                                    
X0 = [375, 378, 186, 186, 186, 69, 1048, 515, 1045, 730] 
X1 = [159, 73, 272, 58, 108, 373, 373, 373, 373, 267]                                                  

def group(x, y): 
    groups = [[], []] 
    for val, key in zip(x, y): 
        groups[key].append(val) 
    return groups                                                                                      

for v0, v1, lt, label in zip(group(X0,y), group(X1,y), ('rx','bo'), ('0','1')): 
    plt.plot(v0, v1, lt, label=label) 
plt.legend();                                                                                          


我想在这个想法的基础上再接再厉,即使有优秀的包 这有助于数据分组和绘图。

我们可以这样定义一个函数

def scatter_group(keys, values, ax=None, fmt=str):
    """side effect: scatter plots values grouped by keys, return an axes.

    keys, N vector like of integers or strings;
    values, 2xN vector like of numbers, x = values[0], y = values[1];
    ax, the axes on which we want to plot, by default None;
    fmt, a function to format the key value in the legend label, def `str`.
    """

    from matplotlib.pyplot import subplots
    from itertools import product, cycle 

    # -> 'or', 'ob', 'ok', 'xr', 'xb', ..., 'or', 'ob', ...
    linetypes = cycle((''.join(mc) for mc in product('ox*^>', 'rbk')))

    d =  
    if ax == None: (_, ax) = plt.subplots() 

    for k, *v in zip(keys, *values): d.setdefault(k,[]).append(v) 
    for k, lt in zip(d, linetypes): 
        x, y = list(zip(*d[k])) 
        ax.plot(x, y, lt, label=fmt(k)) 
    ax.legend() 
    return ax                                                                   

按如下方式使用

In [148]: fig, (ax0, ax1) = plt.subplots(1,2)                                             

In [149]: ax00 = scatter_group(y, (X0, X1), ax=ax0)                                               

In [150]: ax0 is ax00                                                                     
Out[150]: True

In [151]: scatter_group(y, (X1, X0), ax=ax1, fmt=lambda k:"The key is %s"%k)                      
Out[151]: <matplotlib.axes._subplots.AxesSubplot at 0x7fc88f57bac8>

In [152]: ax0.set_xlabel('X0')                                                            
Out[152]: Text(0.5, 23.52222222222222, 'X0')

In [153]: ax1.set_xlabel('X1')                                                            
Out[153]: Text(0.5, 23.52222222222222, 'X1')

【讨论】:

以上是关于如何使用 cmap 知道目标值使用哪种颜色的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib如何画渐变颜色的线

Python / Matplotlib:带有contourf的颜色条不尊重自定义cmap的刻度标签

如何反转seaborn热图颜色条的颜色

从 matplotlib 中的颜色图中获取单个颜色

从 matplotlib 中的颜色图中获取单个颜色

pyplot图例中的散点标签颜色错误