将列表绘制为颜色条以有效可视化异常值
Plot list as a colorbar to efficiently visualize outliers
我想为存储在列表中的值生成颜色条
def map_values_to_color(data: List, cmap: str, integer=False):
norm = matplotlib.colors.Normalize(vmin=min(data), vmax=max(data), clip=True)
mapper = cm.ScalarMappable(norm=norm, cmap=cmap)
if integer:
color = [[r, g, b] for r, g, b, a in mapper.to_rgba(data, bytes=True)]
else:
color = [[r, g, b] for r, g, b, a in mapper.to_rgba(data)]
colorlist = [(val, color) for val, color in zip(data, color)]
return colorlist
if __name__ == '__main__':
vals = [100, .80, .10, .79, .70, .60, .75, .78, .65, .90]
colorlist = map_values_to_color(data=vals, cmap='bwr_r', integer=True)
关于如何仅生成颜色条的任何建议都非常有用。
编辑:
从以下代码获得的输出:
编辑2:
以下答案可能对没有异常值的列表有用。但是,我的数据有异常值,我仍在寻找有关如何使用颜色条(即某种离散颜色条)有效地可视化异常值数据的建议/输入。
正如他们告诉您的那样,您需要一个二维数组才能使用 imshow
,但您需要一个 1 行 N-columns 数组来表示固有的 mono-dimensionality列表。
此外,我们可以对刻度进行一些修饰以简化绘图(我删除了 y 刻度,因为你实际上没有 y 轴)并更容易识别异常值(我指定了一个更密集的 x 刻度集 — 请注意,对于非常长的列表,必须以某种方式对其进行调整。
最后但并非最不重要的一点是,您对异常值有严格的定义,并且想要一个详细描述 正确 范围并证明异常值的颜色图,在这方面我已经调整 an answer by Joe Kington,其中我们修改颜色图以显示离群值的对比色,并在 imshow
级别指定,这是我们有离群值的范围之外的范围。
这是我的脚本(注意使一维数组成为二维数组的扩展切片语法,vmin
和 vmax
的使用,`extend= 的使用'both' 以及我们如何为异常值设置对比色)
import numpy as np
import matplotlib.pyplot as plt
vals = [100, .80, .10, .79, .70, -80, .75, .78, .65, .90]
arr = np.array(vals)[None, :] # arr.shape ⇒ (1, 10)
### #######################
im = plt.imshow(arr, vmin=0, vmax=1, cmap='bwr')
cbar = plt.colorbar(im, extend='both', orientation='horizontal')
cbar.cmap.set_under('yellow') , cbar.cmap.set_over('green')
plt.xticks(range(len(vals))), plt.yticks(())
plt.show
脚本生成
我想为存储在列表中的值生成颜色条
def map_values_to_color(data: List, cmap: str, integer=False):
norm = matplotlib.colors.Normalize(vmin=min(data), vmax=max(data), clip=True)
mapper = cm.ScalarMappable(norm=norm, cmap=cmap)
if integer:
color = [[r, g, b] for r, g, b, a in mapper.to_rgba(data, bytes=True)]
else:
color = [[r, g, b] for r, g, b, a in mapper.to_rgba(data)]
colorlist = [(val, color) for val, color in zip(data, color)]
return colorlist
if __name__ == '__main__':
vals = [100, .80, .10, .79, .70, .60, .75, .78, .65, .90]
colorlist = map_values_to_color(data=vals, cmap='bwr_r', integer=True)
关于如何仅生成颜色条的任何建议都非常有用。
编辑: 从以下代码获得的输出:
编辑2: 以下答案可能对没有异常值的列表有用。但是,我的数据有异常值,我仍在寻找有关如何使用颜色条(即某种离散颜色条)有效地可视化异常值数据的建议/输入。
正如他们告诉您的那样,您需要一个二维数组才能使用 imshow
,但您需要一个 1 行 N-columns 数组来表示固有的 mono-dimensionality列表。
此外,我们可以对刻度进行一些修饰以简化绘图(我删除了 y 刻度,因为你实际上没有 y 轴)并更容易识别异常值(我指定了一个更密集的 x 刻度集 — 请注意,对于非常长的列表,必须以某种方式对其进行调整。
最后但并非最不重要的一点是,您对异常值有严格的定义,并且想要一个详细描述 正确 范围并证明异常值的颜色图,在这方面我已经调整 an answer by Joe Kington,其中我们修改颜色图以显示离群值的对比色,并在 imshow
级别指定,这是我们有离群值的范围之外的范围。
这是我的脚本(注意使一维数组成为二维数组的扩展切片语法,vmin
和 vmax
的使用,`extend= 的使用'both' 以及我们如何为异常值设置对比色)
import numpy as np
import matplotlib.pyplot as plt
vals = [100, .80, .10, .79, .70, -80, .75, .78, .65, .90]
arr = np.array(vals)[None, :] # arr.shape ⇒ (1, 10)
### #######################
im = plt.imshow(arr, vmin=0, vmax=1, cmap='bwr')
cbar = plt.colorbar(im, extend='both', orientation='horizontal')
cbar.cmap.set_under('yellow') , cbar.cmap.set_over('green')
plt.xticks(range(len(vals))), plt.yticks(())
plt.show
脚本生成