分叉图没有绘图/绘图只是没有出现

时间:2016-12-02 09:27:33

标签: python matplotlib plot ipython

我的家庭作业让我编写了一个代码,用泰勒教科书模拟经典力学中的数字。数字12.4012.41如果有人有兴趣知道。

我能够重现其中一个,这是下面的代码(对于我实际上遇到问题的代码可能是很好的参考):

<impact_categories>
    <impact_category>
        <name>Cat1</name>
        <impact_levels>
            <impact_level>
                <name>Insignificant</name>
            </impact_level>
        </impact_levels>
    </impact_category>
    <impact_category>
        <name>Cat2</name>
        <impact_levels>
            <impact_level>
                <name>Lowest</name>
            </impact_level>
        </impact_levels>
    </impact_category>
    <impact_category>
        <name>Cat3</name>
        <impact_levels>
            <impact_level>
                <name>Insignificant</name>
            </impact_level>
        </impact_levels>
    </impact_category>
</impact_categories>

这是第二张图片的代码似乎不起作用。而且我不确定为什么。任何帮助,将不胜感激。这个数字没有图,我不确定为什么。

import nympy as np
import matplotlib.pyplot as plt

# We need to calculate the first fixed point
r1=np.array(np.arange(0,4,0.09))
x1 = np.zeros((len(r1),1))

# Now calculating the second fixed point
r2=np.array(np.arange(1,4,0.1))
x2 = (r2 -1)/r2

# Now finding when the fixed points split up again
r3=np.array(np.arange(3,4,0.1))
y1 = (((r3**2 - 2*r3 - 3)**0.5) + 1 + r3)/(2*r3)
y2 = ((-(r3**2 - 2*r3 - 3)**0.5) + 1 + r3)/(2*r3)

# Now finding the experimental values for 1/2 of a split
x3 = []
for r in np.arange(0,4,0.09):
    x = 0.666
    for i in range(100):
       x = (r**2) * x * (1.0 -x) - (r**3) * (x**2)*((1-x)**2)
    x3.append(x)

# Doing the same as above second 1/2
x4 = []
for r in np.arange(0,4,0.09):
    x = 0.8
    for i in range(100):
       x = (r**2) * x * (1.0 -x) - (r**3) * (x**2)*((1-x)**2)
    x4.append(x)

plt.plot(r1,x3,'bo', label='Experimental')
plt.plot(r1,x4,'bo')
plt.plot(r3,y2,'k-')
plt.plot(r3,y1,'k-')
plt.plot(r1,x1,'k-', label='Theoretical')
plt.plot(r2,x2,'k-')
plt.legend(loc=2)
plt.show()

2 个答案:

答案 0 :(得分:0)

您的代码无法正常运行。

当你想要x和y的数组时,你会用标量值重复调用plt.plot:很难用一行只绘制一个点。 试试这个,你会看到你会得到一个空图:

plt.plot(0,1)
plt.show();

我不知道这是不是你最终要找的东西,但这是一个可以至少用作起点的工作版本。请注意,我更改了i上的循环:而不是i in range(150)后跟if i >=125,更好的是i in range(125,150),您将避免不必要的迭代:

fig, ax = plt.subplots(nrows=1, ncols=1)
r1 = []
x1 = []
for r in np.arange(2.8,4,0.01):
    x=0.5
    # Instead of range(150) then checking if i >= 125...
    for i in range(125,150):
        x = r*x*(1-x)
        r1.append(r)
        x1.append(x)

ax.plot(r1,x1,'k')
plt.show()

Result graph

答案 1 :(得分:0)

我偶然发现了这个一年的帖子,并意识到对OP报告的问题有一个简单的答案。

缺少的是标记参数。

plot(r,x,'k')替换为plot(r,x,'.',color='k'),然后突然显示分叉图。

Bifurcation for logistic regression

import numpy as np
import matplotlib.pyplot as plt

plt.figure()
for r in n.arange(2.8,4,0.01):
    x = 0.5
    for i in range(150):
        x = r*x*(1-x)
        if i >= 125:
            plt.plot(r,x,'.',color='black',markersize=2)
plt.xlim (2.8,4)
plt.show()

这段代码很好,但效率很低。只需拨打plot()一次就快得多。

plt.figure()
def mark(r,x,diagram,v):
    N,M = np.shape(diagram)
    rmin,rmax = r[0],r[-1]
    for (i,j) in zip(r,x):
        nx = int(j*(M-1))
        nr = int((i-rmin)/(rmax-rmin)*(N-1))
        diagram[nx,nr] = v

r = np.arange(2.8,4,0.01)
diagram = np.zeros((200,200))
x0 = 0.5
x = np.ones_like(r)*x0
for i in range(150):
    x = np.multiply(np.multiply(r,x),(1-x))
    if i >= 125:
        mark(r,x,diagram,1)

plt.imshow(np.flipud(diagram), extent=[r[0],r[-1],0,1],
           aspect=(r[-1]-r[0]),cmap=plt.cm.Greys)
plt.show()

Another bifurcation diagram

后一个代码使用

CPU times: user 224 ms, sys: 29 µs, total: 224 ms
Wall time: 261 ms

虽然前者效率较低的代码需要超过30倍

CPU times: user 8.59 s, sys: 91.7 ms, total: 8.68 s
Wall time: 8.68 s