假设我们有一个列表,其中包含一些包含一些数据的列表,在我的情况下是频率。
model_order = [[],
[1],
[1.1],
[1, 1.5],
[1, 1.55, 3.5],
[1.1, 1.45, 3.45, 3.5, 4.8]]
如您所见,嵌套列表的长度不同,也可以为空。
我想绘制像on the picture,
这样的图表
但坚持使用python和matplotlib如何做到这一点。我该怎么办?
我的第一个想法是多次使用pyplot.plot()并将model_order [i]作为y轴和np.linspace(1,len(model_order [i]),len(model_order [i]的数据。 ]))作为x轴的数据。但是为了使x和y数据具有相同的第一维所必需的。
from matplotlib import pyplot
import numpy as np
def plot_stabilization_diagram(data):
pyplot.figure(figsize=(8, 6), dpi=80)
pyplot.subplot(1, 1, 1)
yaxis = np.linspace(1, len(data), len(data))
for d in xrange(len(data)):
pyplot.plot(data[d], yaxis, 'o')
pyplot.show()
>>> ValueError: x and y must have same first dimension
答案 0 :(得分:0)
你需要一个与model_order相同顺序的数组 - 为此创建一个带有np.ones_like,np.zeros_like的数组 - 然后你可以通过遍历它将你想要的任何值放入这个数组中。然后,您需要遍历数组输入中的每个数组,以获取每个项目的绘图。
from matplotlib import pyplot
import numpy as np
def plot_stabilization_diagram(data):
pyplot.figure(figsize=(8, 6), dpi=80)
pyplot.subplot(1, 1, 1)
yaxis = np.ones_like(data)
for pos, row in enumerate(data):
for pos2, item in enumerate(row):
pyplot.plot(item, yaxis[pos2], 'o')
pyplot.show()
def plot_stabilization_diagram_2(data):
pyplot.figure(figsize=(8, 6), dpi=80)
pyplot.subplot(1, 1, 1)
for pos, row in enumerate(data):
for pos2, item in enumerate(row):
pyplot.plot(pos, item, 'o')
pyplot.show()
model_order = [[],
[1],
[1.1],
[1, 1.5],
[1, 1.55, 3.5],
[1.1, 1.45, 3.45, 3.5, 4.8]]
plot_stabilization_diagram(model_order)
您的代码还会将model_order的所有频率都放在x轴上,而不是y轴上。
第二个版本根据行号绘制频率 - 更像是示例图像中的频率。