【问题标题】:Setting specific pixel colours on a matplotlib colourmap, depending on value/data type (and preserve range)根据值/数据类型(并保留范围)在 matplotlib 颜色图上设置特定的像素颜色
【发布时间】:2021-08-13 19:45:48
【问题描述】:

我有一个 CSV 数据文件,其中包含(简化)形式的数据:

1.2, 2.2,   o,   s
1.7,   s, 2.4, 2.9
  o, 0.9, 0.1, NaN
1.4,   s, 0.5, 0.9

注意:这包含字符“o”,而不是数字零 (0)。该文件与表示不同类型的“失败”测量的字符混合在一起。这些矩阵通常比 4x4 网格大得多。

我想使用 matplotlib 在颜色图上绘制这些矩阵,但每个失败的测量值在图上分配了自己的颜色,同时保留合法数据的颜色范围。

具有逻辑的东西,例如 `

if data == 'o':
   pixel_colour = 'red'

if data == 's':
   pixel_colour = 'black'

if data == 'NaN':
   pixel_colour = 'white'

` 我已经看过这篇有用的帖子 (Changing colours of pixels of plt.imshow() image.),但我想不出如何让它处理异构数据类型。

【问题讨论】:

  • 你只有o和s吗?还是有更多类别?
  • 现在,只有 'o' 和 's'。在这种情况下,NaN 表示缺失的数据,我应该指定它。
  • 不是您问题的答案,但您可能只想在颜色图中使用“上”和“下”颜色:stackoverflow.com/questions/11386054/…
  • 要回答您的问题,您始终可以将 rgbA 数组传递给 imshow,它只会使用这些值。
  • 感谢分享!这是有道理的,但我认为问题在于将大量数字分配给 's' 会偏离彩色地图的比例。此外,这仅对 2 种不同类型的“失败”测量有用。我们有 3 个,未来可能还会有更多。不过再次感谢!

标签: python matplotlib colormap


【解决方案1】:

要正确回答您的问题,您可以屏蔽不良值、规范、映射到 RGBA,然后根据需要填写其他颜色

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

data = np.array([[1.2, 2.2,   'o',   's', 2.5],
                 [1.7,   's', 2.4, 2.9, 1.7],
                 ['o', 0.9, 0.1, 'NaN', 0.4]])
data[data == 'NaN'] = -4000           
data[data == 'o'] = -5000           
data[data == 's'] = -6000
data = data.astype(np.float64)

norm = mpl.colors.Normalize(vmin=0, vmax=3)
cmap = plt.get_cmap('viridis')

# convert from 0-1:
datan = norm(data)
# convert to rgba:
rgba = cmap(datan)
# Fill in colours for the out of range data:
rgba[data==-4000, :] = [1, 1, 1, 1]
rgba[data==-5000, :] = [1, 0, 0, 1]
rgba[data==-6000, :] = [0, 1, 1, 1]

# plot:
fig, ax = plt.subplots()
ax.imshow(rgba)
plt.show()

【讨论】:

  • 这太好了,谢谢!但是,我似乎无法在情节的一侧使用彩条?出现错误:RuntimeError: 未找到可用于创建颜色条的可映射对象。首先定义一个可映射对象,例如图像(使用 imshow)或轮廓集(使用 contourf)。
  • 供将来参考:我最终通过遵循 matplotlib 颜色栏文档修复了颜色栏问题:matplotlib.org/stable/gallery/color/colorbar_basics.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多