在While循环中不能使用Scatter、Plot、Show()

2024-05-18 21:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

import math
import pylab as plt
import numpy
from numpy import sqrt
from scipy.integrate import quad
import random

numpy.seterr(divide='ignore', invalid='ignore')
def integrand (x):
    return sqrt(1-x**2)

q1area, err = quad(integrand,0,1)

print "This program estimates the convergence of Pi to a ratio of one."
while True:
    print "Please choose from one of the five following options:"
    print " 1. 10^1\n 2. 10^2\n 3. 10^3\n"
    choice = int(raw_input())
    options = {1,2,3}

    if choice == 1:
        plt.xlim([0,15])
        plt.ylim([-5,5])

        x = numpy.linspace(0,15,500)
        y = numpy.sqrt(1-x**2)
        z = 1+x*0

        xcord = []
        ycord = []
        under = []
        above = []
        pratiolist = []
        yvalues = []
        xvalues = range(1,11)

        for i in range(10):
            xcord.append(random.random())
            ycord.append(random.random())

        for j in ycord:
            if (j <= q1area):
                under.append(1)

            else:
                above.append(1)

            punder = len(under)
            if punder == 0:
                punder = punder + 1

            pabove = len(above)
            if pabove == 0:
                pabove = pabove + 1

            pratio = punder / float(pabove)
            pratiolist.append(pratio)

        for k in pratiolist:
            rtpi = k / float(math.pi)
            yvalues.append(rtpi)

        plt.scatter(xvalues,yvalues,c='b')
        plt.plot(x,z,'g')
        plt.show()

    if choice == 2:
        plt.xlim([0,110])
        plt.ylim([-5,5])

        x = numpy.linspace(0,110,500)
        y = numpy.sqrt(1-x**2)
        z = 1+x*0

        xcord = []
        ycord = []
        under = []
        above = []
        pratiolist = []
        yvalues = []
        xvalues = range(1,101)

        for i in range(100):
            xcord.append(random.random())
            ycord.append(random.random())

        for j in ycord:
            if (j <= q1area):
                under.append(1)

            else:
                above.append(1)

            punder = len(under)
            if punder == 0:
                punder = punder + 1

            pabove = len(above)
            if pabove == 0:
                pabove = pabove + 1

            pratio = punder / float(pabove)
            pratiolist.append(pratio)

        for k in pratiolist:
            rtpi = k / float(math.pi)
            yvalues.append(rtpi)

        plt.scatter(xvalues,yvalues,c='b')
        plt.plot(x,z,'g')
        plt.show()

    if choice == 3:
        plt.xlim([0,1100])
        plt.ylim([-5,5])

        x = numpy.linspace(0,1100,500)
        y = numpy.sqrt(1-x**2)
        z = 1+x*0

        xcord = []
        ycord = []
        under = []
        above = []
        pratiolist = []
        yvalues = []
        xvalues = range(1,1001)

        for i in range(1000):
            xcord.append(random.random())
            ycord.append(random.random())

        for j in ycord:
            if (j <= q1area):
                under.append(1)

            else:
                above.append(1)

            punder = len(under)
            if punder == 0:
                punder = punder + 1

            pabove = len(above)
            if pabove == 0:
                pabove = pabove + 1

            pratio = punder / float(pabove)
            pratiolist.append(pratio)

        for k in pratiolist:
            rtpi = k / float(math.pi)
            yvalues.append(rtpi)

        plt.scatter(xvalues,yvalues,c='b')
        plt.plot(x,z,'g')
        plt.show()

    while choice not in options:
        print "Not a valid choice!\n"
        break

#plt.scatter(xvalues,yvalues,c='b')
#plt.plot(x,z,'g')
#plt.show()

唯一能让图形显示的方法是,如果我在每个if choice==1、2、3等的末尾放置break语句,然后放置:

^{pr2}$

在我的代码底部。这是不方便的,我想我的循环无休止地允许1,2,3之间的选择,而不必重新运行程序。为什么Python的图在空闲时崩溃?在

更新

通过使用绘图(),我可以让图形至少显示,但它仍然没有响应。在


Tags: innumpyforifpltrandomaboveunder
1条回答
网友
1楼 · 发布于 2024-05-18 21:24:03

如果不响应表示它不再显示提示,这是因为表演()将导致程序停止,直到窗口关闭。您可以替换表演()与绘图(),但要真正启动windows,您需要处于交互模式。这是通过调用血小板()在任何draw调用之前(我把它放在whiletrue之前:)。我已经测试过了,这应该能完成你想要的行为。

编辑:由于您没有重画相同的数据,调用draw()会将数据附加到特定的绘图中(即反复输入1将继续添加点)。我不知道你想要什么样的行为,但你可以打电话给我plt.clf公司在每次分散呼叫之前,如果你想清除数字。

相关问题 更多 >

    热门问题