Matplotlib imshow/matshow在绘图上显示值 [英] Matplotlib imshow/matshow display values on plot

查看:224
本文介绍了Matplotlib imshow/matshow在绘图上显示值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Matplotlib中使用imshowmatshow创建10x10网格.下面的函数将一个numpy数组作为输入,并绘制网格.但是,我希望数组中的值也显示在网格定义的单元格内.到目前为止,我找不到合适的方法来做到这一点.我可以使用plt.text在网格上放置东西,但这需要每个单元的坐标,这非常不方便.有没有更好的方法来完成我要完成的工作?

I am trying to create a 10x10 grid using either imshow or matshow in Matplotlib. The function below takes a numpy array as input, and plots the grid. However, I'd like to have values from the array also displayed inside the cells defined by the grid. So far I could not find a proper way to do it. I can use plt.text to place things over the grid, but this requires coordinates of each cell, totally inconvenient. Is there a better way to do what I am trying to accomplish?

谢谢!

注意:下面的代码还没有从数组中获取值,我只是在玩plt.text.

NOTE: The code below does not take the values from the array yet, I was just playing with plt.text.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

board = np.zeros((10, 10))

def visBoard(board):
   cmap = colors.ListedColormap(['white', 'red'])
   bounds=[0,0.5,1]
   norm = colors.BoundaryNorm(bounds, cmap.N)
   plt.figure(figsize=(4,4))
   plt.matshow(board, cmap=cmap, norm=norm, interpolation='none', vmin=0, vmax=1)
   plt.xticks(np.arange(0.5,10.5), [])
   plt.yticks(np.arange(0.5,10.5), [])
   plt.text(-0.1, 0.2, 'x')
   plt.text(0.9, 0.2, 'o')
   plt.text(1.9, 0.2, 'x')
   plt.grid()

   visBoard(board)

输出:

推荐答案

你能做些什么:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

min_val, max_val = 0, 10
ind_array = np.arange(min_val + 0.5, max_val + 0.5, 1.0)
x, y = np.meshgrid(ind_array, ind_array)

for i, (x_val, y_val) in enumerate(zip(x.flatten(), y.flatten())):
    c = 'x' if i%2 else 'o' 
    ax.text(x_val, y_val, c, va='center', ha='center')
#alternatively, you could do something like
#for x_val, y_val in zip(x.flatten(), y.flatten()):
#    c = 'x' if (x_val + y_val)%2 else 'o'

ax.set_xlim(min_val, max_val)
ax.set_ylim(min_val, max_val)
ax.set_xticks(np.arange(max_val))
ax.set_yticks(np.arange(max_val))
ax.grid()

这里是带有imshow背景的更新示例.

Here is an updated example with an imshow background.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

min_val, max_val, diff = 0., 10., 1.

#imshow portion
N_points = (max_val - min_val) / diff
imshow_data = np.random.rand(N_points, N_points)
ax.imshow(imshow_data, interpolation='nearest')

#text portion
ind_array = np.arange(min_val, max_val, diff)
x, y = np.meshgrid(ind_array, ind_array)

for x_val, y_val in zip(x.flatten(), y.flatten()):
    c = 'x' if (x_val + y_val)%2 else 'o'
    ax.text(x_val, y_val, c, va='center', ha='center')

#set tick marks for grid
ax.set_xticks(np.arange(min_val-diff/2, max_val-diff/2))
ax.set_yticks(np.arange(min_val-diff/2, max_val-diff/2))
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.set_xlim(min_val-diff/2, max_val-diff/2)
ax.set_ylim(min_val-diff/2, max_val-diff/2)
ax.grid()
plt.show()

这篇关于Matplotlib imshow/matshow在绘图上显示值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆