天天看點

解決離線狀态下使用PyEcharts進行資料可視化繪圖時,pyecharts-gallery示例庫中的所有html網頁打不開、不出圖的問題

前面在講述我配置離線的Python資料分析和資料可視化環境虛拟機的時候,遇到了離線狀态下使用PyEcharts進行資料可視化繪圖時,html網頁打不開、不出圖的問題,經過兩天的查找,發現主要原因(對,還有次要原因哈)是由于PyEcharts在更新到1.x版本後,将原來HTML網頁中使用到的很多js檔案換為了線上擷取的方式,例如打開pyecharts-gallery-master\Bar檔案夾裡面的bar_base.html,就會發現利用了https://assets.pyecharts.org/assets/echarts.min.js檔案,是以才會出現離線環境下打不開網頁不出圖的情況:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
            <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

</head>
<body>
    <div id="bfb8150f841b4ea486de8e3047d62ffc" class="chart-container" style="width:900px; height:500px;"></div>
    <script>
        var chart_bfb8150f841b4ea486de8e3047d62ffc = echarts.init(
            document.getElementById('bfb8150f841b4ea486de8e3047d62ffc'), 'white', {renderer: 'canvas'});
        var option_bfb8150f841b4ea486de8e3047d62ffc = {
    "animation": true,
    "animationThreshold": 2000,
    "animationDuration": 1000,
    "animationEasing": "cubicOut",
    "animationDelay": 0,
    "animationDurationUpdate": 300,
    "animationEasingUpdate": "cubicOut",
    "animationDelayUpdate": 0,
    "color": [
        "#c23531",
        "#2f4554",
        "#61a0a8",
        "#d48265",
        "#749f83",
        "#ca8622",
           

知道了原因以後,下面就來看一下如何解決!其實在pyecharts-gallery-master官網上面已經給出了解決的方案:主要是2步:一是下載下傳離線的js檔案,也就是pyecharts-assets-master.zip檔案,然後将其放到本地的某個檔案夾裡面;二是啟動本地服務端,将解壓後的pyecharts-assets-maste檔案夾設為服務位址;三是修改繪圖的py源檔案,添加使用本地js位址的語句,具體操作如下:

一、下載下傳pyecharts-assets-master.zip檔案:https://github.com/pyecharts,這裡面包含了大多數示例中所用到的js檔案:

解決離線狀态下使用PyEcharts進行資料可視化繪圖時,pyecharts-gallery示例庫中的所有html網頁打不開、不出圖的問題

二、啟動本地服務端,具體的方法官網裡面也都講了:https://github.com/pyecharts/pyecharts-assets

$ cd pyecharts-assets
$ python -m http.server
           

上面是Linux中的寫法,實際上在window環境下就是進入到pyecharts-assets檔案夾裡面後,按住shift鍵點選滑鼠右鍵,打開控制台,運作

python -m http.server一句話即可,該指令将會在本地啟動一個預設網址為0.0.0.0,預設端口為8000的廣播伺服器,進而可以開啟js檔案的服務;      

其實,也不一定每次都非要進入到pyecharts-assets檔案夾裡面啟動控制台然後運作啟動伺服器的指令,還可以利用-d選項設定目錄,如下所示:

python -m http.server #在目前檔案夾目錄下預設啟動位址為0.0.0.0,端口為8000的伺服器
python -m http.server -d C:\Users\super\pyecharts-assets-master #指定一個自定義的本地目錄
python -m http.server -d C:\Users\super\pyecharts-assets-master -b 127.0.0.1 8000 #指定自定義的本地目錄,指定自定義的網址和端口
           

我就是利用第二句即可,這樣不用每次都費力的進入到本地的pyecharts-assets檔案夾裡面了!

實際上也不一定非要0.0.0.0的網址,也可以選擇127.0.0.1的本地回路位址,還有就是區域網路裡面的話,可以指定為區域網路伺服器的網址;

最後就是在python源檔案中添加下面的兩句,例如對于pyecharts-gallery-master\Bar中的bar_base.py檔案,就是在最前面添加:

#LocalhostConfig
# 配置CurrentConfig.ONLINE_HOST為本機位址資源
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker


c = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家A", Faker.values())
    .add_yaxis("商家B", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标題"))
    .render("bar_base.html")
)
           

這樣在編譯後,生成的HTML檔案就會使用本機的js檔案網址了:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
            <script type="text/javascript" src="http://127.0.0.1:8000/assets/echarts.min.js"></script>

</head>
<body>
    <div id="9732f9fa310740bbb5c7dafaeba7ee90" class="chart-container" style="width:900px; height:500px;"></div>
    <script>
        var chart_9732f9fa310740bbb5c7dafaeba7ee90 = echarts.init(
            document.getElementById('9732f9fa310740bbb5c7dafaeba7ee90'), 'white', {renderer: 'canvas'});
        var option_9732f9fa310740bbb5c7dafaeba7ee90 = {
    "animation": true,
    "animationThreshold": 2000,
    "animationDuration": 1000,
    "animationEasing": "cubicOut",
    "animationDelay": 0,
    "animationDurationUpdate": 300,
    "animationEasingUpdate": "cubicOut",
    "animationDelayUpdate": 0,
    "color": [
        "#c23531",
        "#2f4554",
        "#61a0a8",
        "#d48265",
        "#749f83",
        "#ca8622",
        "#bda29a",
        "#6e7074",
           

這樣就可以在離線環境下顯示出圖像了!

最後需要說明的是,如果不是想生成HTML網頁,而是想在Jupyter Notebook中直接顯示Echarts圖像,就需要把上面的py源程式改為:

#LocalhostConfig
# 配置CurrentConfig.ONLINE_HOST為本機位址資源
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker


c = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家A", Faker.values())
    .add_yaxis("商家B", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标題"))
)
c.render_notebook()
#c.render("bar_base.html")
           

也就是需要在最後顯示的調用一句:c.render_notebook(),不然,如果還是放在鍊式那個括号裡面,例如下面的樣子,有的時候還是不會出圖的。。。

#LocalhostConfig
# 配置CurrentConfig.ONLINE_HOST為本機位址資源
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker


c = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家A", Faker.values())
    .add_yaxis("商家B", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标題"))
    .render_notebook()
)
           

最後再預告一下下一篇:https://github.com/pyecharts/pyecharts-gallery中給出的可視化繪圖的例子那麼多——

解決離線狀态下使用PyEcharts進行資料可視化繪圖時,pyecharts-gallery示例庫中的所有html網頁打不開、不出圖的問題

顯然依次去為每個*.py源程式都添加from pyecharts.globals import CurrentConfig

CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"指令進而再生成利用本地js資源的HTML網頁無疑太過繁瑣,如何一鍵就生成全部的本地HTML網頁呢?請見下回分解!