Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib imshow/matshow在绘图上显示值_Python_Numpy_Matplotlib_Visualization - Fatal编程技术网

Python Matplotlib imshow/matshow在绘图上显示值

Python Matplotlib imshow/matshow在绘图上显示值,python,numpy,matplotlib,visualization,Python,Numpy,Matplotlib,Visualization,我正在尝试使用Matplotlib中的imshow或matshow创建一个10x10网格。下面的函数将numpy数组作为输入,并绘制网格。但是,我希望数组中的值也显示在网格定义的单元格中。到目前为止,我还没有找到一个合适的方法来做这件事。我可以使用plt.text在网格上放置东西,但这需要每个单元格的坐标,非常不方便。有没有更好的方法来完成我想要完成的事情 谢谢 注意:下面的代码还没有从数组中获取值,我只是在玩plt.text import numpy as np import matplotl

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

谢谢

注意:下面的代码还没有从数组中获取值,我只是在玩
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

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()

对于图形,您应该尝试使用
pyplot.table

import matplotlib.pyplot as plt
import numpy as np

board = np.zeros((10, 10))
board[0,0] = 1
board[0,1] = -1
board[0,2] = 1
def visBoard(board):
    data = np.empty(board.shape,dtype=np.str)
    data[:,:] = ' '
    data[board==1.0] = 'X'
    data[board==-1.0] = 'O'
    plt.axis('off')
    size = np.ones(board.shape[0])/board.shape[0]
    plt.table(cellText=data,loc='center',colWidths=size,cellLoc='center',bbox=[0,0,1,1])
    plt.show()

visBoard(board)

对@wflynny的代码进行了详细说明,使其成为一个函数,该函数接受任何矩阵,无论其大小,并绘制其值

import numpy as np
import matplotlib.pyplot as plt

cols = np.random.randint(low=1,high=30)
rows = np.random.randint(low=1,high=30)
X = np.random.rand(rows,cols)

def plotMat(X):
    fig, ax = plt.subplots()
    #imshow portion
    ax.imshow(X, interpolation='nearest')
    #text portion
    diff = 1.
    min_val = 0.
    rows = X.shape[0]
    cols = X.shape[1]
    col_array = np.arange(min_val, cols, diff)
    row_array = np.arange(min_val, rows, diff)
    x, y = np.meshgrid(col_array, row_array)
    for col_val, row_val in zip(x.flatten(), y.flatten()):
        c = '+' if X[row_val.astype(int),col_val.astype(int)] < 0.5 else '-' 
        ax.text(col_val, row_val, c, va='center', ha='center')
    #set tick marks for grid
    ax.set_xticks(np.arange(min_val-diff/2, cols-diff/2))
    ax.set_yticks(np.arange(min_val-diff/2, rows-diff/2))
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.set_xlim(min_val-diff/2, cols-diff/2)
    ax.set_ylim(min_val-diff/2, rows-diff/2)
    ax.grid()
    plt.show()

plotMat(X)
将numpy导入为np
将matplotlib.pyplot作为plt导入
cols=np.random.randint(低=1,高=30)
行=np.random.randint(低=1,高=30)
X=np.random.rand(行、列)
def绘图仪(X):
图,ax=plt.子批次()
#imshow部分
ax.imshow(X,插值='nearest')
#文本部分
差异=1。
最小值=0。
行=X.shape[0]
cols=X.shape[1]
列数组=np.arange(最小值、列、差)
行数组=np.arange(最小值,行,差异)
x、 y=np.meshgrid(列数组、行数组)
对于列值,zip中的行值(x.flatte(),y.flatte()):
c='+'如果X[行值astype(int),列值astype(int)]<0.5 else'-'
ax.text(列值、行值、c、va='center',ha='center')
#为网格设置记号标记
最大设定值(np.arange(最小值差异/2,cols差异/2))
最大设定值(np.arange(最小值-差异/2,行差异/2))
ax.setxticklabels([])
ax.设置标签([])
最大设定值(最小值-差值/2,cols差值/2)
ax.set_ylim(最小值-差异/2,行差异/2)
ax.grid()
plt.show()
绘图仪(X)

使用annotate,可以非常灵活地指定文本的坐标。我想知道是否有一种不指定坐标的方法可以做到这一点。到目前为止,我是手动完成的(可能不是最聪明的主意),假设图形大小可能会改变,我将不得不想出一个计算正确坐标的函数。谢谢!我将尝试对此进行迭代。我必须使用imshow/matshow plot作为基础,因为它将显示热图。我正计划在热图上标出数值。不过,我想我可以在我的imshow/matshow情节上覆盖你的内容。让我们试试……谢谢你的代码!请注意,生成的图像可能会颠倒显示。您可以通过交换set_ylim:ax.set_ylim(bottom=max_val-diff/2,top=min_val-diff/2)@dev random的两个参数来防止这种情况,具体取决于您提供给的参数,那么绘图的显示方式可能会与您预期的不同(因为默认值很好地表示图像,这与用于显示数据绘图的标准不同)。这里我使用默认值。但是如果您发现绘图有点旋转/颠倒,请查看
origin
关键字参数。您可能需要将其设置为
origin='lower'
。是否有办法将此表覆盖在imshow/matshow绘图上?我必须保留那些用作热图的东西。我只需要在上面覆盖“x”o。是的,我可以做一些类似于
plt.plot(范围(10),范围(10))
的事情,我看到表格下面的绘图,表格就像另一个绘图。