当前位置: 首页 > 面试题库 >

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

祁烈
2023-03-14
问题内容

如何使用Matplotlib将2D数组绘制为图像,且Matplotlib的y比例相对于y值的2的乘方?

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

替代文字http://support.sas.com/rnd/app/da/new/802ce/iml/chap1/images/wavex1k.gif

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

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

我有一个很大的浮点数组(10,700000),代表一个声音文件的离散小波变换系数。我正在尝试使用这些系数绘制比例图。我可以复制数组x次,直到获得所需的图像行大小,但是内存无法容纳太多信息…


问题答案:

您是否尝试过转换轴?例如:

ax = subplot(111)
ax.yaxis.set_ticks([0, 2, 4, 8])
imshow(data)

这意味着对于不存在的坐标,数据中必须存在间隙,除非有一种方法可以提供转换功能,而不仅仅是列表(从未尝试过)。

编辑

我承认这只是一个线索,而不是一个完整的解决方案。这是我的意思。

假设您的数据位于数组中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)

基本上,它将使用mylog2函数转换数组或列表的第一个坐标(您可以根据需要进行转换-
它是log2的简化形式,是自制的)。好处是,您可以在需要时将其重新用于另一个转换,并且也可以轻松地对其进行控制。

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

b = arr(a)

现在可以显示它,例如:

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")

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

替代文字http://img691.imageshack.us/img691/8883/clipboard01f.png



 类似资料:
  • 问题内容: 我正在使用matplotlib.pyplot模块绘制直方图,并且想知道如何强制y轴标签仅显示整数(例如0、1、2、3等)而不显示小数(例如0.,0.5) ,1,,1.5、2等)。 我正在查看指导说明,怀疑答案在matplotlib.pyplot.ylim周围,但是到目前为止,我只能找到设置最小和最大y轴值的东西。 问题答案: 如果你有y数据 您可以使用此数据的最大值和最小值来创建此范围

  • 本文向大家介绍Python如何使用内置库matplotlib绘制折线图,包括了Python如何使用内置库matplotlib绘制折线图的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python如何使用内置库matplotlib绘制折线图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 环境准备:   需要安装matplotlib,安装

  • 问题内容: 我已经使用样条插值法来平滑时间序列,并且还想在绘图中添加一条水平线。但是似乎有一个我无法控制的问题。任何帮助都会非常有帮助。这是我所拥有的: 问题似乎与我对水平线图的使用有关。 问题答案: 您是正确的,我认为这使您失望。您将要重用原始的x轴变量,并使用另一个包含变量的相同长度的numpy数组对其进行绘制。 希望可以解决问题!

  • 我使用样条插值来平滑时间序列,还想在图中添加一条水平线。但是似乎有一个问题超出了我的控制范围。任何帮助都会很有帮助。这是我所拥有的: 问题似乎在于我使用进行水平线绘制。

  • numpy.histogram()函数将输入数组和作为两个参数。 bin数组中的连续元素用作每个bin的边界。 Matplotlib 可以将直方图的数字表示转换为图形。 pyplot子模块的plt()函数将包含数据和数组的数组作为参数,并转换为直方图。

  • 我正在使用matplotlib绘制直方图。pyplot模块,我想知道如何强制y轴标签只显示整数(例如0、1、2、3等),而不显示小数(例如0、0.5、1、1.5、2等)。 我在看指导说明,怀疑答案就在matplotlib附近。pyplot。但到目前为止,我只能找到设置最小和最大y轴值的东西。