我试图使用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')
生成的图像如下:
这里的问题是,当把这两个matshow图像放在一起弄乱第一个图像的ylim:它应该显示从0到9的值,但它只显示0.5到8.5的范围。如果我使用命令
单独绘制图像plt.matshow(mat_data)
我用正确的ylim得到了想要的图像。
有人知道导致问题的原因以及我如何解决问题?我试着用
axes[0].set_ylim([-0.5,9.5])
但它不起作用。
PS:我使用了关键字gridspec_kw = {'height_ratios':[25,1]},以便向量显示为向量 - 否则它将显示为具有空白值的矩阵,如下所示。< / p>
参数sharex = True用于plt.subplots,以便对齐矢量和矩阵。如果没有参数,图表将类似于以下
但请注意,ylim的问题已经消失 - 因此参数可能是此问题的主要原因。我想如果我能找到另一种方法来对齐这两个图像而不使用“sharex = True”就可以解决这个问题。
答案 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()