我认为应该是一个简单的情节

时间:2013-03-10 13:36:32

标签: graph matplotlib

所以基本上我试图绘制一个图表,其中我的x轴为n,而y轴为r

因此,对于n = 1,它有r = 1,n = 2它有r = 2,n = 3它有r = 4,n = 4它有8,。然后我打算扩展它。

我试过了:

import scipy
import scipy.linalg
import numpy as np
from matplotlib import pyplot as plt


for n in range(1,5):
    A=np.identity(n)
    for i in range(0,n):
        for j in range(0,i):
            A[i,j]=-1
    A[:,n-1]=1
    x=np.random.randn(n,1)
    b=A*x
    P, L, U = scipy.linalg.lu(A)
    print A
    r=U.max()/A.max()
    print r
    print n
    plt.plot(n,r)
    plt.show()

但它只将n的最大值与r的对应值绘制,而不是n的所有值。不确定我做错了什么。

提前致谢

3 个答案:

答案 0 :(得分:1)

plt.plot()可以绘制线条和标记。默认情况下,它仅绘制线条。您只提供一个点,因此不会绘制 行,并且将不会绘制。要启用标记,请设置属性marker="o"plt.plot(x, y, markers="o")。 如果你想要一个折线图,你必须制作nr的列表并绘制它们。 对于带有标记的列表:http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_marker

此外,您可能希望将plt.show()从for循环中取出。它为每次迭代生成一个更新的数字,我不确定你是否想要它。

答案 1 :(得分:0)

首先需要创建要绘制的数组,然后绘制它

rr, nn = [], []
for n in range(1,5):
    A=np.identity(n)
    for i in range(0,n):
        for j in range(0,i):
            A[i,j]=-1
    A[:,n-1]=1
    x=np.random.randn(n,1)
    b=A*x
    P, L, U = scipy.linalg.lu(A)
    print A
    r=U.max()/A.max()
    print r
    print n
    rr.append(r)
    nn.append(n)

plt.plot(nn,rr)
plt.show()

你的方法是创建一个每个循环一个点的新图。

此外,如果您计划增加n,我建议您检查更有效的循环方式(例如列表理解或itertools

答案 2 :(得分:0)

我不确定这是否是你想要的(阅读你的描述,我认为是这样,但看着你的代码,看起来你正试图做一些更困难的事情。)

如果你真的想要获得序列1, 2, 4, 8, 16, ...,我鼓励你在一个操作中处理整个数组,而不是使用for循环。它更具表现力,对大型阵列来说更快。

反正:

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> 
>>> n = np.arange(5)
>>> r = 2 ** n
>>> r
array([ 1,  2,  4,  8, 16])
>>> plt.plot(n, r, 'ob')
[<matplotlib.lines.Line2D object at 0x102d8ee10>]
>>> plt.show()

mpl output