matplotlib- Y和X轴被交换

3
我正在尝试绘制频谱图。我使用matplotlib中的imshow。
问题是,我从C++生成的文本文件中读取数据(它实际上创建了一个二维向量并将其存储到文本文件中),然后读入文本文件并进行绘图。
下面是我生成的绘图输出(来自C++并导入到python):
这是一张Python中的频谱图(使用matplotlib):
如您所见,x和y轴被交换了,这给了我实际频谱图的错误形状。
这可能是为什么呢?例如,我可能在第一次读取数据时读取错误,导致出现了这种情况吗?还是说我没有设置x、y轴本身?
非常感谢您提供任何帮助
编辑:
我使用以下函数读取数组:
def split_at_empty_lines(filename):

with open(filename) as f:
    arr = [] 
    for line in f:
        if not line.strip() and arr:
            yield arr 
            arr = []
        elif line.strip(): arr.extend(float(x) for x in line.split())
    if arr: yield arr;

制作频谱图的步骤如下:

a = list(split_at_empty_lines("file.txt"); 

hm = ax.imshow(a, interpolation='nearest',origin='lower',aspect='auto')

这里是结果:

[[ 26.9287  30.9089  34.9285 ...,  23.016   28.9027  36.4073]
 [ 26.7964  26.8524  32.7296 ...,  22.9524  28.6145  33.7204]
 [ 26.4222  27.0941  29.094  ...,  22.5309  27.6803  26.7073]
..., 
[ 25.9362  25.8307  29.7039 ...,  22.0084  25.9855  28.9602]
[ 26.4222  27.0941  29.094  ...,  22.5309  27.6803  26.7073]
[ 26.7964  26.8524  32.7296 ...,  22.9524  28.6145  33.7204]]

这里是结果: enter image description here 我不知道为什么会得到如此不同的结果。

看起来你的问题不仅仅是转置。请注意,你的 matplotlib 图表的 y 轴范围从 656 到 4594,这与你第一个图表的 x 轴不匹配。你知道数组的实际尺寸吗? - bogatron
@Bogatron - 你好,我有这些数值.. 只是在这个例子中没包含它们。 - Phorce
你是否查看了文本文件的第一行,以确定值是否与a的第一行相同?而且你确定你的 C++ 文件是按行主序(row-major)写入数据,而不是列主序(column-major)吗? - bogatron
@bogatron - 你好,我还没有考虑过这个问题,因为从C++生成的文本文件中读取1D数组是可以正常工作的。嗯,我会去看一下的。谢谢 :) - Phorce
1个回答

2

如果你使用numpy将数据读入ndarray,你可以在绘图之前转置该数组。

import numpy as np
a = np.array(split_at_empty_lines("file.txt"))
print(a.T)

应该生成。
array([[1, 4],
       [2, 5],
       [3, 6]])

那么问题可能在于我读入数据的方式?我没有使用numpy是因为文本文件的格式设置不同。 - Phorce
也许你可以扩展一下你的问题,展示数据是如何传递给 imshow 函数的?通常情况下,这是因为轴需要交换。 - thengineer
当您将a转换为数组并使用a.T调用imshow时,会发生什么? - thengineer
好的,我已经更新了我的帖子并附上了结果。如果这看起来正确,那么我该如何绘制它? - Phorce
好的,ax.imshow(a.T, interpolation='nearest',origin='lower',aspect='auto') 应该会产生期望的结果。 - thengineer
让我们在聊天室里继续这个讨论 - thengineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接