Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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 Imshow-以不同像素大小分割_Python_Numpy_Matplotlib_Pixel_Imshow - Fatal编程技术网

Python Imshow-以不同像素大小分割

Python Imshow-以不同像素大小分割,python,numpy,matplotlib,pixel,imshow,Python,Numpy,Matplotlib,Pixel,Imshow,我试着得到以下应该在下图中说明的内容 为了简单起见,让我们假设我有一个numpy数组(10x10),我想用matplotlib imshow来绘制它。条件是具有不同的像素大小,例如:前五行的大小应为0.5cm,后五行的大小应为1cm。列的大小应该相同 我怎样才能轻松地实现这一点?我已经试过了,但我不喜欢这个解决方案;特别是我仍然有白色的边框和缩放是可怕的 from matplotlib import pyplot as pl import numpy as np data = np.arang

我试着得到以下应该在下图中说明的内容

为了简单起见,让我们假设我有一个numpy数组(10x10),我想用matplotlib imshow来绘制它。条件是具有不同的像素大小,例如:前五行的大小应为0.5cm,后五行的大小应为1cm。列的大小应该相同

我怎样才能轻松地实现这一点?我已经试过了,但我不喜欢这个解决方案;特别是我仍然有白色的边框和缩放是可怕的

from matplotlib import pyplot as pl
import numpy as np

data = np.arange((100))
data = np.reshape(data, (10,10))

figure, (ax1, ax2) = pl.subplots(2, 1, sharex='col')
figure.subplots_adjust(hspace=0)
data1=data[5:10,:]
ax1.imshow(data1, origin="lower", interpolation="none", aspect=0.5, extent=[-0.5,10.5,5.5,10.5], vmax=np.amax(data), vmin=np.amin(data))
ax1.set_ylim([5.5,10.5])
##
data2=data[0:5,:]
ax2.imshow(data2, origin="lower", interpolation="none", aspect=1, extent=[-0.5,10.5,-0.5,5.5], vmax=np.amax(data), vmin=np.amin(data))
ax2.set_ylim([-0.5,5.5])
pl.show()
谢谢

如果只使用一个轴对象,则此方法更简单。然后,缩放也将完美地工作

代码:

from matplotlib import pyplot as plt
import numpy as np

# prepare the data
data = np.arange((100))
data = np.reshape(data, (10,10))
data1=data[0:5,:]
data2=data[5:10,:]

# create the figure and a single axis
fig, ax = plt.subplots()

# common arguments to imshow
kwargs = dict(
        origin='lower', interpolation='nearest', vmin=np.amin(data),
        vmax=np.amax(data), aspect='auto')

# draw the data
ax.imshow(data1, extent=[0, 10, 0, 5], **kwargs)
ax.imshow(data2, extent=[0, 10, 5, 7.5], **kwargs)

# optional black line between data1 and data2
ax.axhline(5, color='k')

# set the axis limits
ax.set_ylim(0, 7.5)
ax.set_xlim(0, 10)

# set the xticklabels
xticks = np.arange(0,10)
ax.set_xticks(xticks + 0.5)
ax.set_xticklabels(map(str, xticks))

# set the yticks and labels
yticks = np.concatenate((
        np.arange(0, 5) + 0.5,
        np.arange(5, 7.5, 0.5) + 0.25
        ))
ax.set_yticks(yticks)
ax.set_yticklabels(map(str, xticks))

# show the figure
plt.show()
结果:

评论:

  • 我冒昧地以更直观的方式重命名了
    data1
    /
    2
    对象
  • 感谢@kazemakase指出需要调整轴刻度

一个“丑陋”的解决方案是将需要放大的线条加倍。您将使用10*15数组,而不是10*10数组。但是肯定有一个合适的解决方案,你需要行编号来匹配还是可以省略?你也可以使用
ax.set_-yticks
ax.set_-yticklebels
为每行像素获得正确的标签。这一点很好!或者像OP在他的问题中所做的那样将数据限制移动0.5。单独移动是不起作用的,因为需要在下半部分跳过每一秒的滴答声。是的,你完全正确。我会在答案中加上这个。