【问题标题】:How to take continuously take user input and plot them on graph?(python)如何持续获取用户输入并将它们绘制在图表上?(python)
【发布时间】:2021-06-28 14:32:00
【问题描述】:

我正在尝试将国旗绘制为 x、y 平面上的点。所以我试图提示用户输入一个国家名称,并且在绘制之后,我希望用户能够输入另一个国家名称并且也可以绘制它,当然不会丢失第一点。

所以基本上我希望情节在用户输入国家/地区时不断更新。以下是部分代码:

当真时:

user_input = input('Enter Country: ')
for country, i, j, flag in zip(countries, xs, ys, flags):
            if(user_input == item):
                ax.scatter(i, j)
                ab = AnnotationBbox(getImage(path), (i, j), frameon=False)
                ax.add_artist(ab)
                plt.show()
                plt.pause(0.05)
    print("Try Another Country")

它适用于第一个用户输入。例如,如果我输入“意大利”意大利国旗出现在图表上,但是当我输入下一个国家名称时,没有任何变化,并且输出一直显示“尝试另一个国家”

请帮忙!

【问题讨论】:

    标签: python-3.x numpy matplotlib


    【解决方案1】:

    如果无法访问国家/标志列表,显然我不能像你那样做,但这应该显示一种方法,使用line.set_data(X, Y)fig.canvas.draw() 更新情节:

    import matplotlib.pyplot as plt  # type: ignore
    import numpy as np  # type: ignore
    
    X = np.linspace(-5, 5, 100)
    Y = X ** 2
    
    fig, ax = plt.subplots(1, 1)
    fig.show()
    
    # plot returns an iterable of artists, so we unpack it
    (line,) = ax.plot(X, Y)
    ax.set_ylim(np.min(Y), np.max(Y))
    
    # draw the first plot
    fig.canvas.draw()
    
    while True:
        inp = input("Enter the exponent (int): ")
        if inp == "":
            break
    
        # get new data
        Y = X ** int(inp)
    
        # update ylims
        ax.set_ylim(np.min(Y), np.max(Y))
    
        # update the graph
        line.set_data(X, Y)
        fig.canvas.draw()
    

    此示例显示了lineplot,但它应该与scatter 类似。我承认我从未使用过AnnotationBbox,但我认为您应该能够将另一位艺术家添加到轴上。

    干杯!

    【讨论】:

    • 感谢您的回答,非常感谢!我想要做的是,一旦用户输入国家名称,我将输入与我的预制列表中的国家名称(带有循环)进行比较,如果它在那里,我会根据其预制 x 和y 坐标,但我的问题是它只适用于第一个用户输入,然后无论我输入多少次国家名称,都没有任何变化,我认为这与 plt.show() 在多次迭代时不更新有关输入
    • 如果循环/用户输入正常工作,您可以尝试在开头使用fig.show() 并像我一样使用fig.canvas.draw() 来更新情节吗?这会改变什么吗?此外,问题中代码的格式也不好,因此很难调试,因此修复它会有所帮助。同样x2,您迭代country, i, j, flag,然后使用itempath,因此上传更多代码会使问题更清晰。
    • 哦,对不起,我一定忘记将项目更改为国家和标志的路径,当我在这里发布以使其更具可读性时,对不起!至于 fig.show() 它似乎不起作用,我在 jupyter notebook 上,它给了我一个错误......无论如何,如果你有时间我很乐意发送代码
    • 让我上传的代码工作非常棘手,我承认我不知道如何将它移植到 Jupyter。 animation.FuncAnimation 作为一个选项,我知道它适用于笔记本电脑,但它需要固定的帧速率而不是异步的,因此很难等待用户输入。
    • 进一步阅读使用set_datacanvas.draw(所以实际上它可能有效),displayfunc_animation
    【解决方案2】:

    除了@Pietro 示例之外,在您的情况下,print("Try Another Country") 将显示 len(countries) 次,因为一旦您绘制了标志,您就不会中断 for 循环。

    根据我从您的代码中了解到的情况,您应该只在 if 中执行 print("Try Another Country") 并在之后打破 for 循环。

    因为我不能用@Pietro 评论这个帖子,也许你可以在你的笔记本中尝试这样的事情

    import numpy as np
    from IPython import display
    
    X = np.linspace(-5, 5, 100)
    
    while True:
        pp = input("Enter the power (int): ")
        display.clear_output(wait=True)
        if pp == "q":
            break
        Y = X ** int(pp)
        
        plt.plot(X,Y)
        plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多