我正在尝试从输入标量中获取RGB十六进制字符串,给出一个特定的matplot颜色图。我使用matplotlib.get_cmap()获取matplotlib.colors.Colormap对象,并向此映射传递一个标量范围(0,1),以获得RGBA值,然后绘制该颜色。但有时绘制的颜色与imshow()绘制的颜色不同。我在这里做傻事吗?
复制代码
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版本
Operating System: windows 7 64-bit
Matplotlib Version: 2.0.2
Python Version: 3.5.3
numpy: 1.13.0
发布于 2017-07-05 21:57:44
在您的格式函数中,您是左对齐,而不是右对齐,这会导致奇怪的值跳转。见这一行:
curr_cstr = '#{:0<2}{:0<2}{:0<2}'.format(hex(r)[2:], hex(g)[2:], hex(b)[2:])
以及format
的文档。固定版本:
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到十六进制转换:
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
https://stackoverflow.com/questions/44936488
复制相似问题