首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用matplotlib.colors.Colormap将标量值映射到RGB时的奇怪颜色映射

使用matplotlib.colors.Colormap将标量值映射到RGB时的奇怪颜色映射
EN

Stack Overflow用户
提问于 2017-07-05 21:44:44
回答 2查看 1.2K关注 0票数 2

我正在尝试从输入标量中获取RGB十六进制字符串,给出一个特定的matplot颜色图。我使用matplotlib.get_cmap()获取matplotlib.colors.Colormap对象,并向此映射传递一个标量范围(0,1),以获得RGBA值,然后绘制该颜色。但有时绘制的颜色与imshow()绘制的颜色不同。我在这里做傻事吗?

复制代码

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np
plt.ioff()

cmap = 'RdBu_r'
cmap = plt.get_cmap(cmap)

f = plt.figure(figsize=(8, 4))
ax1 = f.add_subplot(121)
ax2 = f.add_subplot(122)
plot_arr = np.arange(100).reshape((10, 10)) / 99.
ax1.imshow(plot_arr, vmin=0., vmax=1., cmap=cmap, interpolation='nearest')

for i in range(10):
    for j in range(10):
        curr_rgb = cmap(plot_arr[i, j])[0:3]
        curr_rgb = tuple([int(x * 255) for x in curr_rgb])
        r, g, b = curr_rgb
        curr_cstr = '#{:0<2}{:0<2}{:0<2}'.format(hex(r)[2:], hex(g)[2:], hex(b)[2:])
        ax2.plot(j, i, 'o', mfc=curr_cstr, lw=0, mec='none', ms=20)

ax2.set_xlim([-0.5, 9.5])
ax2.set_ylim([9.5, -0.5])
plt.show()

实际结果

输出图像

预期的结果在代码中实现,左边的图被绘制为imshow()。根据输入标量,用彩色地图对象的颜色绘制右图点。如果我的理解是正确的,相同网格单元格的颜色应该是相同的。但在高价值和低价值上显然不同。

Matplotlib版本

代码语言:javascript
运行
复制
 Operating System: windows 7 64-bit
代码语言:javascript
运行
复制
 Matplotlib Version: 2.0.2
代码语言:javascript
运行
复制
 Python Version: 3.5.3
代码语言:javascript
运行
复制
 numpy: 1.13.0
EN

Stack Overflow用户

回答已采纳

发布于 2017-07-05 21:57:44

在您的格式函数中,您是左对齐,而不是右对齐,这会导致奇怪的值跳转。见这一行:

代码语言:javascript
运行
复制
curr_cstr = '#{:0<2}{:0<2}{:0<2}'.format(hex(r)[2:], hex(g)[2:], hex(b)[2:])

以及format的文档。固定版本:

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np
plt.ioff()

cmap = 'RdBu_r'
cmap = plt.get_cmap(cmap)

f = plt.figure(figsize=(8, 4))
ax1 = f.add_subplot(121)
ax2 = f.add_subplot(122)
plot_arr = np.arange(100).reshape((10, 10)) / 99.
ax1.imshow(plot_arr, vmin=0., vmax=1., cmap=cmap, interpolation='nearest')

for i in range(10):
    for j in range(10):
        curr_rgb = cmap(plot_arr[i, j])[0:3]
        curr_rgb = tuple([int(x * 255) for x in curr_rgb])
        r, g, b = curr_rgb
        curr_cstr = '#{:0>2}{:0>2}{:0>2}'.format(hex(r)[2:], hex(g)[2:], hex(b)[2:])
        ax2.plot(j, i, 'o', mfc=curr_cstr, lw=0, mec='none', ms=20)

ax2.set_xlim([-0.5, 9.5])
ax2.set_ylim([9.5, -0.5])
plt.show()

请注意原始文件中不正确的RGB到十六进制转换:

代码语言:javascript
运行
复制
if i==9: print i ,j, curr_rgb, curr_cstr

9 0 (170, 21, 41) #001500
9 1 (161, 18, 40) #001200
9 2 (155, 16, 39) #001000
9 3 (147, 14, 38) #00e000
9 4 (138, 11, 36) #00b000
9 5 (132, 9, 35) #009000
9 6 (123, 6, 34) #006000
9 7 (117, 4, 33) #004000
9 8 (108, 1, 31) #001000
9 9 (103, 0, 31) #000000
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44936488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档