【问题标题】:Custom colors in matplotlib when using matshow使用 matshow 时 matplotlib 中的自定义颜色
【发布时间】:2017-05-11 02:44:07
【问题描述】:

在使用 matplotlib 时,是否有一种简单的方法可以为给定矩阵的每个元素指示特定颜色。例如,假设我们想用以下三种特定颜色显示“x”:红色、黑色和白色:

但是,我发现的唯一选项是使用“cmap”,它不会直接为您提供“直接”指定颜色的选项。

fig = plt.figure()
ax = fig.add_subplot(111)
x= [[0,0,0,0,0,0],[0,0,0,0,0,0], [0,1,1,2,1,1], [0,0,0,0,0,1], [0,1,1,1,1,1]]    
cax = ax.matshow(x,cmap=plt.cm.gray_r )
plt.show()

我的问题:我应该如何更改代码以显示上述红/黑/白网格? [例如,0 表示黑色,1 表示白色,2 表示红色],一般来说,我们如何才能为更大的颜色列表做到这一点?比如 10-15 种颜色。

另外,如何为matix中的某个元素分配某种颜色?例如在上面,x[i][j] == 0 然后 color ='black' 或 x[i][j] == 2 然后 color ='red'

谢谢。

【问题讨论】:

  • 我最近找到了解决这个问题的简单方法。它涉及创建一个 3d numpy 数组,该数组表示数据的所需颜色并绘制它而不是原始的 2d 数据数组。可以在这里找到解决方案stackoverflow.com/a/66821752/7871710

标签: python matplotlib


【解决方案1】:

您可以创建自己的颜色图:

from matplotlib.colors import ListedColormap

cmap = ListedColormap(['k', 'w', 'r'])
cax = ax.matshow(x,cmap=cmap)

如果您想指定 10-15 种颜色,您可能会用完单字母颜色。在这种情况下,您可以指定 RGB 三元组(例如ListedColormap([[0, 0, 0], [1, 1, 1], [1, 0, 0]]))或其他各种color formats。或者,使用here 列出的预定义离散(“定性”)颜色图之一。

如果矩阵中的值不是连续的整数,您可以在绘图前对其进行转换。

import numpy as np

x = np.array([[0,0,0,0,0,0],[0,77,0,0,22,0], [0,1,1,2,1,1], [0,0,14,0,0,1], [0,1,1,1,1,1]])
u, i = np.unique(x, return_inverse=True)
y = i.reshape(x.shape)
# array([[0, 0, 0, 0, 0, 0],
#        [0, 5, 0, 0, 4, 0],
#        [0, 1, 1, 2, 1, 1],
#        [0, 0, 3, 0, 0, 1],
#        [0, 1, 1, 1, 1, 1]])

【讨论】:

  • 谢谢,@kazemakase。后续问题,如何为 matix 中的某个元素分配某种颜色?例如在上面,x[i][j] == 0 然后 color ='black' 或 x[i][j] == 2 然后 color ='red'
  • @superMind 我不完全理解后续。对每个元素 i、j 执行映射 0->b、1->w、2->r。您想对某些元素进行特殊处理吗?在那种情况下,其他元素呢?
  • 假设x是这样的:x= [[0,0,0,0,0,0],[0,77,0,0,22,0], [0 ,1,1,2,1,1], [0,0,14,0,0,1], [0,1,1,1,1,1]] 并假设我们有 6 种颜色 (c1,c2 ,c3,c4,c5,c6)。问题是 0--> c1, 1-->c2, 2-->c3, 14-->c4, 22--> c5, 77-->c6.
  • @superMind 我认为最简单的方法是将 x 转换为 14->3、22->4、77->5。然后这些值再次很好地映射到颜色。我已经更新了问题,以展示如何使用 numpy 数组和np.unique 的帮助来完成此操作。
  • 很好,这甚至适用于单一颜色和蒙版数组。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2015-02-19
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多