matshow的问题

时间:2018-01-31 12:11:16

标签: python matplotlib matrix

我试图使用matplotlib matshow一起显示矩阵和相关的矢量数据。

vec_data = np.array([[ 0.,  1.,  1.,  1.,  0.,  1.,  1.,  0.,  0.,  0.]])

mat_data = np.array([
       [ 0. ,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  1. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0.5,  0. ,  0.5,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0.1,  0.1,  0.1,  0.1,  0. ,  0.1,  0.1,  0.1,  0. ,  0.1],
       [ 0. ,  0. ,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0. ,  0.1,  0.1],
       [ 0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0. ,  0. ],
       [ 0.1,  0.1,  0.1,  0.1,  0. ,  0.1,  0.1,  0.1,  0.1,  0. ]])

fig, axes = plt.subplots(2,1,figsize=(4,4),sharey=False,sharex=True,gridspec_kw = {'height_ratios':[25,1]})
axes[0].matshow(mat_data)
axes[1].matshow(vec_data)
axes[1].tick_params(direction='out', length=6, width=0)
axes[1].set_yticklabels([''])
axes[1].set_xlabel('vector')

生成的图像如下:

enter image description here

这里的问题是,当把这两个matshow图像放在一起弄乱第一个图像的ylim:它应该显示从0到9的值,但它只显示0.5到8.5的范围。如果我使用命令

单独绘制图像
plt.matshow(mat_data)

我用正确的ylim得到了想要的图像。

enter image description here

有人知道导致问题的原因以及我如何解决问题?我试着用

axes[0].set_ylim([-0.5,9.5])

但它不起作用。

PS:我使用了关键字gridspec_kw = {'height_ratios':[25,1]},以便向量显示为向量 - 否则它将显示为具有空白值的矩阵,如下所示。< / p>

enter image description here

参数sharex = True用于plt.subplots,以便对齐矢量和矩阵。如果没有参数,图表将类似于以下

enter image description here

但请注意,ylim的问题已经消失 - 因此参数可能是此问题的主要原因。我想如果我能找到另一种方法来对齐这两个图像而不使用“sharex = True”就可以解决这个问题。

1 个答案:

答案 0 :(得分:2)

使用sharex=True子图对系统进行过度约束。因此,Matplotlib将释放绘图限制,以便能够显示具有给定规格的绘图。

解决方案是使用sharex=False(默认值)。然后高度比需要与图像的尺寸相匹配,即

fig, axes = plt.subplots(2,1,figsize=(4,4),sharey=False,sharex=False,
                    gridspec_kw = {'height_ratios':[mat_data.shape[0],vec_data.shape[0]]})

完整示例:

import numpy as np
import matplotlib.pyplot as plt

vec_data = np.array([[ 0.,  1.,  1.,  1.,  0.,  1.,  1.,  0.,  0.,  0.]])
mat_data = np.random.choice([0,.1,.5,1], size=(10,10))

fig, axes = plt.subplots(2,1,figsize=(4,4),sharey=False,sharex=False,
                    gridspec_kw = {'height_ratios':[mat_data.shape[0],vec_data.shape[0]]})
axes[0].matshow(mat_data)
axes[1].matshow(vec_data)
axes[1].tick_params(direction='out', length=6, width=0)
axes[1].set_yticklabels([''])
axes[1].set_xlabel('vector')

plt.show()

enter image description here