如何使用 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)相关联。我最初的解决方案是递增数据并根据目标值设置标记,但是,我相信由于我使用的是cmap
,c
预计将是一个数组,但我传入@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 知道目标值使用哪种颜色的主要内容,如果未能解决你的问题,请参考以下文章