Matplotlib:使用 imshow 显示数组值

Posted

技术标签:

【中文标题】Matplotlib:使用 imshow 显示数组值【英文标题】:Matplotlib : display array values with imshow 【发布时间】:2016-02-23 01:33:06 【问题描述】:

我正在尝试使用matplotlib 函数(如imshow)创建一个网格。 从这个数组:

[[ 1  8 13 29 17 26 10  4],
[16 25 31  5 21 30 19 15]]

我想在同一个网格上将值绘制为颜色和文本值本身 (1,2, ...)。这就是我目前所拥有的(我只能绘制与每个值相关的颜色):

from matplotlib import pyplot
import numpy as np

grid = np.array([[1,8,13,29,17,26,10,4],[16,25,31,5,21,30,19,15]])
print 'Here is the array'
print grid

fig1, (ax1, ax2)= pyplot.subplots(2, sharex = True, sharey = False)
ax1.imshow(grid, interpolation ='none', aspect = 'auto')
ax2.imshow(grid, interpolation ='bicubic', aspect = 'auto')
pyplot.show()   

【问题讨论】:

【参考方案1】:

如果出于任何原因您必须使用与imshow 自然提供的不同程度,则以下方法(即使更做作)可以完成工作:

size = 4
data = np.arange(size * size).reshape((size, size))

# Limits for the extent
x_start = 3.0
x_end = 9.0
y_start = 6.0
y_end = 12.0

extent = [x_start, x_end, y_start, y_end]

# The normal figure
fig = plt.figure(figsize=(16, 12))
ax = fig.add_subplot(111)
im = ax.imshow(data, extent=extent, origin='lower', interpolation='None', cmap='viridis')

# Add the text
jump_x = (x_end - x_start) / (2.0 * size)
jump_y = (y_end - y_start) / (2.0 * size)
x_positions = np.linspace(start=x_start, stop=x_end, num=size, endpoint=False)
y_positions = np.linspace(start=y_start, stop=y_end, num=size, endpoint=False)

for y_index, y in enumerate(y_positions):
    for x_index, x in enumerate(x_positions):
        label = data[y_index, x_index]
        text_x = x + jump_x
        text_y = y + jump_y
        ax.text(text_x, text_y, label, color='black', ha='center', va='center')

fig.colorbar(im)
plt.show()

如果您想放入其他类型的数据而不一定是您用于图像的值,您可以通过以下方式修改上面的脚本(在数据后添加值):

size = 4
data = np.arange(size * size).reshape((size, size))
values = np.random.rand(size, size)

# Limits for the extent
x_start = 3.0
x_end = 9.0
y_start = 6.0
y_end = 12.0

extent = [x_start, x_end, y_start, y_end]

# The normal figure
fig = plt.figure(figsize=(16, 12))
ax = fig.add_subplot(111)
im = ax.imshow(data, extent=extent, origin='lower', interpolation='None', cmap='viridis')

# Add the text
jump_x = (x_end - x_start) / (2.0 * size)
jump_y = (y_end - y_start) / (2.0 * size)
x_positions = np.linspace(start=x_start, stop=x_end, num=size, endpoint=False)
y_positions = np.linspace(start=y_start, stop=y_end, num=size, endpoint=False)

for y_index, y in enumerate(y_positions):
    for x_index, x in enumerate(x_positions):
        label = values[y_index, x_index]
        text_x = x + jump_x
        text_y = y + jump_y
        ax.text(text_x, text_y, label, color='black', ha='center', va='center')

fig.colorbar(im)
plt.show()

【讨论】:

【参考方案2】:

您想遍历grid 中的值,并使用ax.text 将标签添加到绘图中。

幸运的是,对于 2D 数组,numpy 具有 ndenumerate,这使得这变得非常简单:

for (j,i),label in np.ndenumerate(grid):
    ax1.text(i,j,label,ha='center',va='center')
    ax2.text(i,j,label,ha='center',va='center')

【讨论】:

汤姆;出于好奇:使用ndenumerate 的循环是否比手动循环快? 不,我不这么认为(尽管它可能取决于grid 的大小)。与for j in range(grid.shape[0]): for i in range(grid.shape[1]): ax.text(i,j,grid[j,i])相比,我只是喜欢代码的简单性 我可以使用蓝色文本吗? @Daniel,你在ax.text 行中尝试过color='b' 吗? 是的,它可以工作 :) -- 谢谢 -- 知道了 color='blue'

以上是关于Matplotlib:使用 imshow 显示数组值的主要内容,如果未能解决你的问题,请参考以下文章

Python matplotlib imshow

如何以交互方式更新 matplotlib imshow() 窗口?

如何以交互方式更新 matplotlib imshow() 窗口?

OpenCV 函数学习04-用 matplotlib 显示图像(plt.imshow)

matplotlib imshow - 默认颜色归一化

使用numpy蒙版数组和imshow绘制分段彩色图像