如何使用imshow使用Matplotlib绘制具有非线性y轴的图像?

att*_*wad 9 python matplotlib

如何将2D数组绘制为具有相对于y值的两个幂的y比例的Matplotlib的图像?

例如,我的数组的第一行在图像中的高度为1,第二行的高度为4,等等(单位无关紧要)用单词解释并不简单,所以请看这个图像(那是我想要的那种结果):

alt text http://support.sas.com/rnd/app/da/new/802ce/iml/chap1/images/wavex1k.gif

如您所见,第一行比上一行小2倍,依此类推.

对于那些对我为什么要这样做感兴趣的人:

我有一个非常大的浮点阵列(10,700000),表示声音文件的离散小波变换系数.我试图用这些系数绘制尺度图.我可以复制数组x次,直到我得到所需的图像行大小,但内存不能容纳如此多的信息.​​.....

Red*_*yph 8

你试过变换轴吗?例如:

ax = subplot(111)
ax.yaxis.set_ticks([0, 2, 4, 8])
imshow(data)
Run Code Online (Sandbox Code Playgroud)

这意味着不存在坐标的数据必须存在间隙,除非有办法提供转换函数而不仅仅是列表(从未尝试过).

编辑:

我承认这只是一个领先,而不是一个完整的解决方案.这是我在更多细节中的意思.

假设您将数据放在数组中a.你可以使用像这样的变换:

class arr(object):
    @staticmethod
    def mylog2(x):
        lx = 0
        while x > 1:
            x >>= 1
            lx += 1
        return lx
    def __init__(self, array):
        self.array = array
    def __getitem__(self, index):
        return self.array[arr.mylog2(index+1)]
    def __len__(self):
        return 1 << len(self.array)
Run Code Online (Sandbox Code Playgroud)

基本上它会使用mylog2函数转换数组或列表的第一个坐标(您可以根据需要进行转换 - 它是自制的,作为log2的简化).优点是,您可以根据需要重新使用它进行另一次转换,并且您也可以轻松控制它.

然后将您的数组映射到此数组,该数组不会复制,而是实例中的本地引用:

b = arr(a)
Run Code Online (Sandbox Code Playgroud)

现在您可以显示它,例如:

ax = subplot(111)
ax.yaxis.set_ticks([16, 8, 4, 2, 1, 0])
axis([-0.5, 4.5, 31.5, 0.5])
imshow(b, interpolation="nearest")
Run Code Online (Sandbox Code Playgroud)

这是一个示例(包含随机值的数组):

alt text http://img691.imageshack.us/img691/8883/clipboard01f.png