我正在绘制类似于频谱图的东西。我有一些长度为N的一维数组,每个数组对应于2D图中的一条“水平线”。对于频谱图[M,N],我需要M个这样的N长度数组来填充所有M条水平线。
但是,我只有少量行的数据。假设我有m 我希望y轴的范围是0到100,并且仅针对我拥有的y值绘制这些值线,否则绘制0。我该怎么做? 如果我的y值数组在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()
答案 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()
答案 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)