如何绘制稳定图?

时间:2014-01-23 12:47:06

标签: python matplotlib

假设我们有一个列表,其中包含一些包含一些数据的列表,在我的情况下是频率。

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

这样的图表

enter image description here

但坚持使用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

1 个答案:

答案 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轴上。

第二个版本根据行号绘制频率 - 更像是示例图像中的频率。

http://imgur.com/a/CQgcU