Python 使用matplotlib在同一图形中绘制两个矩阵

Python 使用matplotlib在同一图形中绘制两个矩阵,python,matplotlib,matrix,Python,Matplotlib,Matrix,我想在同一张图中画两个矩阵。这些矩阵的形状为3x5。它们是使用meshgrid为大小为3和5的两个阵列创建的(a是大小为3,b是大小为5)。矩阵的条目是使用数组中的值来计算的,我想在图中显示这些值,因此,例如,如果M是用条目a和b计算的,那么M应该显示在图中两个指数相交的地方。此外,图表的轴应标有两个数组的条目 为了更好地理解我的问题,我将在这篇文章中发布所需输出的图片。在我的特定用例中,这两个矩阵的一些值将是NaNs,因此我可以看到这两个矩阵重叠的地方。 两个矩阵的示例如下: M1 = ([5

我想在同一张图中画两个矩阵。这些矩阵的形状为3x5。它们是使用meshgrid为大小为3和5的两个阵列创建的(a是大小为3,b是大小为5)。矩阵的条目是使用数组中的值来计算的,我想在图中显示这些值,因此,例如,如果M是用条目a和b计算的,那么M应该显示在图中两个指数相交的地方。此外,图表的轴应标有两个数组的条目

为了更好地理解我的问题,我将在这篇文章中发布所需输出的图片。在我的特定用例中,这两个矩阵的一些值将是
NaN
s,因此我可以看到这两个矩阵重叠的地方。 两个矩阵的示例如下:

M1 = ([5, 3, nan], 
      [2, 5, nan], 
      [6, 7, nan], 
      [9, 10, nan], 
      [11, 12, nan])
M2 = ([nan, nan, nan],
      [nan, 1, 2], 
      [nan, 8, 5], 
      [nan, 6, 9], 
      [nan, nan, nan])
我相信这是一个基本的问题,但我对python还是新手,非常感谢您的帮助


提前谢谢你

我想找到每个矩阵的外壳形状有多困难,甚至不清楚矩阵中是否有孔。但是我们为什么不让numpy/matplotlib来做所有的工作呢

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

M1 = ([5,      3,      6,      7], 
      [2,      np.nan, 3,      6], 
      [6,      7,      8,      np.nan], 
      [9,      10,     np.nan, np.nan], 
      [11,     12,     np.nan, np.nan])

M2 = ([np.nan, np.nan, np.nan, np.nan],
      [np.nan, np.nan, 1,      2], 
      [np.nan, 4,      8,      5], 
      [np.nan, np.nan, 6,      9], 
      [np.nan, np.nan, np.nan, np.nan])

#convert arrays into truth values regarding the presence of NaNs
M1arr = ~np.isnan(M1)
M2arr = ~np.isnan(M2)

#combine arrays based on False = 0, True = 1
M1M2arr = np.sum([M1arr, 2 * M2arr], axis=0) 

#define color scale for the plot
cmapM1M2 = colors.ListedColormap(["white", "tab:blue", "tab:orange", "tab:red"])

cb = plt.imshow(M1M2arr, cmap=cmapM1M2)
cbt= plt.colorbar(cb, ticks=np.linspace(0, 3, 9)[1::2])
cbt.ax.set_yticklabels(["M1 & M2 NaN", "only M1 values", "only M2 values", "M1 & M2 values"])
plt.xlabel("a[i]")
plt.ylabel("b[i]")

plt.tight_layout()
plt.show()
样本输出:

我保持了
imshow
的方向,因为这是打印时读取矩阵条目的方式。通过更改此线,可以将此图像转换为常用的坐标表示:

cb = plt.imshow(M1M2arr, cmap=cmapM1M2, origin="lower")

你能举一个两个矩阵的例子吗?M1=([5,3,nan],[2,5,nan],[6,7,nan],[9,10,nan],[11,12,nan]);M2=([nan,nan,nan],[nan,1,2],[nan,8,5],[nan,6,9],[nan,nan,nan])我试着用nan's写我贴出的图片中的矩阵没有入口的例子,我希望这是正确的。A)两个矩阵是否总是大小相同(例如,都是5x7)?B) 两个矩阵是否都填充了保证矩形的值(不是M1开始时像
M1=([5,3,nan],[2,5,4],…
)?如果两个答案都是肯定的,则为每个矩阵计算非nan值的最小/最大索引,并将这些坐标绘制为矩形。@Mr.T a)是的,两个矩阵的大小始终相同B)否,它们并不总是矩形。。你给M1的例子是可能的。谢谢你令人惊讶的回答。这正是我想做的。现在唯一要做的就是进一步阅读解决方案文档:我完全支持这一点。matplotlib文档非常优秀,但首先我要看一下。而且,大多数日常问题都可以通过在其应用程序中修改代码来解决。