在Python中,如何绘制等距/随机y值的彩色二维图(X,Y,颜色)?

时间:2019-08-21 18:00:51

标签: python matplotlib imshow

我正在绘制类似于频谱图的东西。我有一些长度为N的一维数组,每个数组对应于2D图中的一条“水平线”。对于频谱图[M,N],我需要M个这样的N长度数组来填充所有M条水平线。

但是,我只有少量行的数据。假设我有m

我希望y轴的范围是0到100,并且仅针对我拥有的y值绘制这些值线,否则绘制0。我该怎么做?

如果我的y值数组在Y轴上的间距相等,则可以执行以下操作:

 y_values = np.array(M) # ticks for y axis - equal-spaced. eg: [2, 2.5, 3, 3.5]. These are the only values for which data exists.
 get_y_values(y_values)
 data = np.array([M,N])
 get_data(data)

 fig = pyplot.figure()
 vmax = np.amax(data)
 ax = fig.add_subplot(1, 1, 1)
 ax.imshow(data, origin='lower', aspect='auto', vmin=0, vmax=vmax)

 ax.set_xlabel('Time')
 ax.set_ylabel('Frequency')
 ax.set_yticks(np.arange(0, y_values.size))
 ax.set_yticklabels(yvalues)

 pyplot.show()

但是它不适用于随机的y值,因为当它们不存在时,它们将显示等距。

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但是一种快速简便的方法是遍历每个时间序列并分别绘制它们。

import numpy as np
import matplotlib.pyplot as plt

M = 4
N = 100
dy = 2.0 # The desired vertical thickness of each line

y_values = np.arange(0,100)

y_values = [6, 44, 47, 92]
x = np.arange(0, N)
data = np.random.rand(M,N)

fig = plt.figure()
vmax = np.amax(data)
ax = fig.add_subplot(1, 1, 1)

for i in range(M):
    ax.pcolor(x, [y_values[i], y_values[i] + dy], [data[i],data[i]], vmin=0, vmax=vmax)

ax.set_xlabel('Time')
ax.set_ylabel('Frequency')
ax.set_yticks(y_values)
ax.set_ylim(0,100)

plt.show()

Here's a link to the output figure.

答案 1 :(得分:0)

我着手解决填充缺失数据点的问题。此代码假定您想要一个从0到100的xs列表,并且已经有一些xs和一些相应的ys。然后,它填充其余的xs,并将其相应的y值设置为0。之后,将按x值,邮政编码和打印内容对其进行排序。我想您可以从这里进行调整。希望我没有误会。

current_xs = [6, 44, 44.5, 92] #the x values
current_ys = [7, 2, 45, 5] #corresponding y values I made up

def fill(current_xs, current_ys):
    for i in range(0, 200):
        if i/2 not in current_xs:
            current_xs.append(i/2)
            current_ys.append(0)
    total = list(zip(current_xs, current_ys))
    total = sorted(total, key=lambda x: x[0])
    print(total)

fill(current_xs, current_ys)