世界這麼大,Python 也想去看看

極客挖掘機發表於2020-05-14

把時間線拉回到 2015 年 4 月 13 日,一位河南省實驗中學的心裡老師在辭職信上寫下了「世界那麼大,我想去看看」這句話,後來爆紅網路,我想這位心裡老師當時寫這句話的時候肯定沒想到這句只有十個字的話,成為了當年的網路經典語錄,成為了我們每個人對那個年代的回憶。

這句話直接導致了當年很多營銷號出來炒作概念,亂七八糟瞎炒一氣,蠱惑了不知道多少年輕人當年自認為瀟灑的裸辭掉工作,一個人跑出去看世界。

可惜的是當年腦子一熱裸辭掉工作跑出去看世界的人,不知道有多少人還能穩定的著陸。忽然想起來不知道在哪看到的一句話 「不是工作需要你,而是你需要一份工作」

大家都是成年人,做決定前最好能自己多思考幾分鐘,仔細想想自己是否能承擔後果。

我們想要出去看世界代價有點高,但是 Python 想看世界不是一般的簡單,我們只需要用到一個 pyecharts ,就可以讓 Python 想看啥看啥。

安裝

Echarts 是一個由百度開源的資料視覺化,憑藉著良好的互動性,精巧的圖表設計,得到了眾多開發者的認可。而 Python 是一門富有表達力的語言,很適合用於資料處理。當資料分析遇上資料視覺化時,pyecharts 誕生了。

pyecharts 的安裝非常簡單,只需要一句話:

pip install pyecharts

pyecharts 環境:

  • Python3.6+

pyecharts 文件地址:https://pyecharts.org/#/zh-cn/intro

pyecharts 示例程式碼:https://github.com/pyecharts/pyecharts-gallery

看世界

pyecharts 為我們提供了地圖元件 Map ,我們可以直接使用 Map 元件來看世界。

接下來我們來看下如何使用 pyecharts 的 Map 元件來畫地圖。

以下示例均參考自官方示例

Map 元件的使用非常簡單,我們可以先看下世界地圖:

import pyecharts.options as opts
from pyecharts.charts import MapGlobe
from pyecharts.faker import POPULATION


data = [x for _, x in POPULATION[1:]]
low, high = min(data), max(data)

c = (
    MapGlobe()
    .add_schema()
    .add(
        maptype="world",
        series_name="World Population",
        data_pair=POPULATION[1:],
        is_map_symbol_show=False,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(
            min_=low,
            max_=high,
            range_text=["max", "min"],
            is_calculable=True,
            range_color=["lightskyblue", "yellow", "orangered"],
        )

    )
    .render("map_globe.html")
)

世界看的不想看了還能看看我們偉大的祖國,程式碼也很簡單:

from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType

c = (
    Map(init_opts=opts.InitOpts(
        theme=ThemeType.DARK,
        bg_color='#404a59'
    ))
    .add(
        "中國地圖",
        [list(z) for z in zip(Faker.provinces, Faker.values())],
        "china"
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="中國地圖-示例"),
        visualmap_opts=opts.VisualMapOpts(),
    )
    .render("china_map.html")
)

再來一個我生活的城市上海的地圖:

from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.globals import ThemeType

shanghai_list = ['黃浦區', '徐彙區', '長寧區', '靜安區', '普陀區', '虹口區', '楊浦區', '閔行區', '寶山區', '嘉定區', '金山區', '松江區', '青浦區', '奉賢區', '崇明區', '浦東新區']

shanghai_people = [65.38, 108.44, 69.4, 106.28, 128.19, 79.7, 131.27, 254.35, 204.23, 158.89, 80.5, 176.22, 121.9, 115.2, 68.81, 555.02]

BAIDU_LINK='https://baike.baidu.com/item/%E4%B8%8A%E6%B5%B7%E8%A1%8C%E6%94%BF%E5%8C%BA%E5%88%92/7426389?fr=aladdin'

c = (
    Map(init_opts=opts.InitOpts(theme=ThemeType.DARK, bg_color='#404a59', width='1600px', height='900px'))
    .add("上海市-常住人口", [list(z) for z in zip(shanghai_list, shanghai_people)], "上海")
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="上海地圖-常住人口(單位:萬人)",
            subtitle="常住人口資料來自百度百科",
            subtitle_link=BAIDU_LINK,
        ),
        visualmap_opts=opts.VisualMapOpts()
    )
    .render("map_shanghai.html")
)

看完 2D 的有沒有覺得不過癮, Map 元件還未我們提供了 3D 地圖的元件 Map3D :

from pyecharts import options as opts
from pyecharts.charts import Map3D
from pyecharts.globals import ThemeType
from pyecharts.globals import ChartType

from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"

c = (
    Map3D(init_opts=opts.InitOpts(
        theme=ThemeType.DARK,
        bg_color='#404a59',
        width='1600px',
        height='900px'
    ))
    .add_schema(
        itemstyle_opts=opts.ItemStyleOpts(
            color="#313c48",
            opacity=1,
            border_width=0.8,
            border_color="#000",
        ),
        map3d_label=opts.Map3DLabelOpts(
            is_show=True,
            text_style=opts.TextStyleOpts(
                color="#fff", font_size=16, background_color="rgba(0,0,0,0)"
            ),
        ),
        emphasis_label_opts=opts.LabelOpts(is_show=True),
        light_opts=opts.Map3DLightOpts(
            main_color="#fff",
            main_intensity=1.2,
            is_main_shadow=False,
            main_alpha=55,
            main_beta=10,
            ambient_intensity=0.3,
        ),
    )
    .add(series_name="", data_pair="", maptype=ChartType.MAP3D)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="全國行政區劃地圖"),
        visualmap_opts=opts.VisualMapOpts(is_show=False),
        tooltip_opts=opts.TooltipOpts(is_show=True),
    )
    .render("map3d_china.html")
)

是不是很簡單,這些地圖我都沒有配資料,可以配置上資料做一些看板的展示。

還有一點, pyecharts 的所需要的靜態資源,會預設訪問 https://assets.pyecharts.org/ 獲取(可以檢視生成的 html 檔案):

如果網路條件不好,地圖會展示不出來,我們可以使用官方為我們提供的本地服務:

需要先獲取 pyecharts-assets 專案

git clone https://github.com/pyecharts/pyecharts-assets.git

然後進入 pyecharts-assets 目錄啟動 HTTP file server :

cd pyecharts-assets
python -m http.server

# Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
# 預設會在本地 8000 埠啟動一個檔案伺服器

然後我們在程式碼中配置 pyecharts 全域性 HOST:

# 只需要在頂部宣告 CurrentConfig.ONLINE_HOST 即可
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"

# 接下來所有圖形的靜態資原始檔都會來自剛啟動的伺服器

新增完成後的 html 檔案生成後應該是這樣的:

這時我們再開啟頁面,可以看到頁面基本上是秒重新整理。

需要獲取原始碼的同學可以在公眾號後臺回覆「看世界」獲取。

相關文章