簡體   English   中英

Visual Stdio Code、PyCharm 和 Thonny 在運行簡單的 matplotlib 演示代碼時表現不同

[英]Visual Stdio Code, PyCharm, and Thonny behave differently running simple matplotlib demo code

我想使用 Python 的 matplotlib 以 3D 和實時方式顯示一些傳感器數據。 我的出發點是嘗試從網絡上的眾多示例之一中繪制一個正弦波。 如果你願意的話,一個“Hello World”。

我開始在我相當新的 Windows 11 PC 上全新安裝 PyCharm。 此設置適用於不涉及 matplotlib 的內容。 過了一會兒,我得出結論,PyCharm 只是沒有按我預期的方式工作,為了好玩,它使用 Thonny 運行代碼(是的,我有幾個 Raspberry Pi),它按預期工作。 正因為可以,我使用 Visual Studio Code 2022 嘗試了相同的代碼。它的工作方式與 PyCharm 不同。

PyCharm 和 VS Code 將輸出打印的“值”並打開“圖形”窗口,但不會顯示正弦波圖。 最終,“數字”窗口會對兩者都顯示“沒有響應”。 Thonny 輸出與預期一致,並且沒有“未響應”消息。

我看到的唯一區別是 PyCharm 和 VS Code 使用虛擬環境,而 Thonny 沒有。

我承認我不是抽屜里最鋒利的刀,並且會感激建議。

編輯——此外,從命令行運行代碼(Windows 終端(管理員)的行為與 PyCharm 和 VS Code 相同。/編輯

有問題的代碼是:

import numpy as np
import time
import matplotlib.pyplot as plt

figure, ax = plt.subplots(figsize=(4,5))
x = np.linspace(0, 20, 80)
y = np.sin(x)

plt.ion()
plot1, = ax.plot(x, y)
plt.xlabel("X-Axis",fontsize=18)
plt.ylabel("Y-Axis",fontsize=18)

for value in range(25):
    update_y_value = np.sin(x-2.5*value)
    
    plot1.set_xdata(x)
    plot1.set_ydata(update_y_value)
    
    figure.canvas.draw()
    figure.canvas.flush_events()
    time.sleep(0.05)
    print(value)

plt.show()

我一度對此感到困惑,基本上是為了在屏幕上顯示圖形,如果直接在機器上運行會容易得多,因為默認情況下虛擬終端無法訪問您的屏幕。 有辦法繞過它並為他們提供這種訪問權限( https://virtualizationreview.com/articles/2017/02/08/graphical-programs-on-windows-subsystem-on-linux.aspx ),但通常很多使用 CMD 之類的東西從 Windows 本地運行程序更容易(或者似乎 Thonny 為您工作)。 您可能還想根據您的工作考慮試用 Jupyter Notebook。 過去,使用像 WSL 這樣的虛擬子系統給我帶來了很多問題。

我終於找到了一個例子,我可以用它作為我真正想做的事情的起點。 以下示例可在所有 VS Code、PyCharm 和 Thonny IDE 中可靠運行。

那個狡猾的小“plt.pause(1e-17)”似乎有很大的不同。

import numpy as np
import matplotlib.pyplot as plt

xdata = []
ydata = []

axes = plt.gca()
axes.set_xlim(0, 100)
axes.set_ylim(-2, +2)
line, = axes.plot(xdata, ydata, 'r-')

x = np.linspace(0, 19, 100)
y = np.sin(x)

plt.xlabel("X-Axis", fontsize=18)
plt.ylabel("Y-Axis", fontsize=18)

for value in range(100):
    xdata.append(value)
    ydata.append(y[value])
    line.set_xdata(xdata)
    line.set_ydata(ydata)
    plt.pause(1e-17)

plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM