【PyQt5】Python在PyQt5中使用ECharts繪制圖表


能搜到這篇文章的想必對PyQt5和ECharts都有所了解,我也就不多贅述了。
先看看我們要做什么

  1. 用PyQt5寫一個界面;
  2. 用HTML寫一個ECharts圖標,下文以雷達圖為例;
  3. 將圖標嵌入界面;
  4. 調用JavaScript方法改變圖標的值。

PyQt5界面

隨便添加一個Layout就行
PyQt5布局

HTML代碼

就一個簡單的HTML模板,主題內容就是如何在HTML里使用ECharts,寫完之后可以打開這個文件看看能不能順利顯示。具體的圖表option查看ECharts即可。
例如radar.html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <script src="echarts.js"></script>
        <title>Radar</title>
        <style type="text/css">
            body {margin: 0; padding: 0; overflow: hidden}
            #main {height: 100%; width: 100%; position: absolute}
        </style>
    </head>
    <body>
        <div id="main"></div>
        <script type="text/javascript">
            let myChart = echarts.init(document.getElementById("main"))

            let option = {
                radar: {
                    shape: 'circle',
                    indicator: [
                        { name: 'A', max: 100},
                        { name: 'B', max: 100},
                        { name: 'C', max: 100},
                        { name: 'D', max: 100}
                    ]
                },
                series: [{
                    type: 'radar',
                    data: [
                        {
                            value: [0, 0, 0, 0],
                            areaColor: "rgba(151,181,215,0.6)",
                            areaStyle: "color",
                            label: {
                                show: true,
                                formatter: function (params) {
                                	// 可自定義顯示內容
                                    return params.value
                                }
                            }
                        }
                    ]
                }]
            };

            myChart.setOption(option)
            window.onresize = myChart.resize

			// 修改雷達圖的值
            function setValue(vals) {
                option.series[0].data[0].value = vals
                myChart.setOption(option)
            }
        </script>
    </body>
</html>

嵌入PyQt5

由於嵌入的是Web頁面,所以需要新的相關依賴:PyQtWebEngine
直接pip安裝:pip install PyQtWebEngine
並導入:from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
嵌入的過程就是新建一個WebView添加到Layout,如:

radar_view = QWebEngineView()
web_settings = QWebEngineSettings.globalSettings()
web_settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
web_settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
web_settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, True)

radar_view.load(QUrl("file:///radar.html"))  # 注意格式,絕對路徑
radar_layout.addWidget(radar_view)

這樣就可以在Layout里顯示剛才那張雷達圖了。

調用JS方法

比如例子中的方法:修改雷達圖的值,像這樣寫即可順利調用。

js = "setValue({0})".format(values)
radar_view.page().runJavaScript(js)

如果報錯方法未找到,參考Python使用QWebEngineView時報錯Uncaught ReferenceError的解決

對比pyecharts

使用pyecharts時會先生成一個HTML文件,再嵌入PyQt5的UI,而且圖標的豐富與實用程度遠不及原本的ECharts。
但是像pyecharts生成一個文件再加載也有其好處,可以參考Python根據模板生成HTML文件並加載進QWebEngineView


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM