python pyecharts繪制地圖

效果

本文使用python庫(kù)——pyecharts繪制地圖,修改標(biāo)簽樣式并調(diào)色。重點(diǎn)在于參數(shù)調(diào)用方法(理解Union[Sequence[str]]或者看源碼)。
效果如圖:


image.png

工具與配置

pip install pyecharts

實(shí)操

要繪制地圖,看官方文檔可知可以使用Geo或Map:Geo為地理坐標(biāo)系,畫出來是在地點(diǎn)對(duì)應(yīng)的位置畫點(diǎn);Map是區(qū)域上色。故選用Map實(shí)現(xiàn)。

  • 看官網(wǎng)Demo
from example.commons import Faker
from pyecharts import options as opts
from pyecharts.charts import Map

def map_visualmap() -> Map:
    c = (
        Map()
        .add("商家A", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Map-VisualMap(連續(xù)型)"),
            visualmap_opts=opts.VisualMapOpts(max_=200),
        )
    )
    return c

可知需要在add函數(shù)中傳入數(shù)據(jù),格式為[[name,value]](例如[['北京',25],['廣東',47],...],注意無(wú)‘省’‘市’等)。由于我數(shù)據(jù)是xls,故用pandas讀入,如下。

  • 構(gòu)造數(shù)據(jù)
data = pd.read_excel(path)
# ...
 .add("", [list(z) for z in zip(data['地區(qū)'], data['2018年'])],"china")

得到如圖


image.png

發(fā)現(xiàn)離預(yù)期效果的差別為 標(biāo)簽數(shù)字的顯示 和 調(diào)色盤。

  • 看API
# Map類
class Map(
    # 初始化配置項(xiàng),參考 `global_options.InitOpts`
    init_opts: opts.InitOpts = opts.InitOpts()
)
# Map.add()
def add(
    # 系列名稱,用于 tooltip 的顯示,legend 的圖例篩選。
    series_name: str,
    # 數(shù)據(jù)項(xiàng) (坐標(biāo)點(diǎn)名稱,坐標(biāo)點(diǎn)值)
    data_pair: Sequence,
    # 地圖類型,具體參考 pyecharts.datasets.map_filenames.json 文件
    maptype: str = "china",
    # 是否選中圖例
    is_selected: bool = True,
    # 是否開啟鼠標(biāo)縮放和平移漫游。
    is_roam: bool = True,
    # 當(dāng)前視角的中心點(diǎn),用經(jīng)緯度表示
    center: Optional[Sequence] = None,
    # 當(dāng)前視角的縮放比例。
    zoom: Optional[Numeric] = 1,
    # 自定義地區(qū)的名稱映射
    name_map: Optional[dict] = None,
    # 標(biāo)記圖形形狀
    symbol: Optional[str] = None,
    # 是否顯示標(biāo)記圖形
    is_map_symbol_show: bool = True,
    # 標(biāo)簽配置項(xiàng),參考 `series_options.LabelOpts`
    label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(),
    # 提示框組件配置項(xiàng),參考 `series_options.TooltipOpts`
    tooltip_opts: Union[opts.TooltipOpts, dict, None] = None,
    # 圖元樣式配置項(xiàng),參考 `series_options.ItemStyleOpts`
    itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
    # 高亮標(biāo)簽配置項(xiàng),參考 `series_options.LabelOpts`
    emphasis_label_opts: Union[opts.LabelOpts, dict, None] = None,
    # 高亮圖元樣式配置項(xiàng),參考 `series_options.ItemStyleOpts`
    emphasis_itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
)

首先實(shí)現(xiàn)標(biāo)簽格式化,看add類可知需要修改label_opts。這時(shí)需要找LabelOpts的文檔。依照其中formatter的描述,修改即可實(shí)現(xiàn)(文檔指出是區(qū)域名,{c}是value名)。

# ...
Map().add("", [list(z) for z in zip(data['地區(qū)'], 
    data['2018年'])], "china", 
    label_opts=opts.LabelOpts(formatter='\n{c}'),

接著實(shí)現(xiàn)調(diào)色。首先觀察Map.add()函數(shù),發(fā)現(xiàn)沒有對(duì)應(yīng)參數(shù)。觀察demo樣例,發(fā)現(xiàn)圖例中max_=200這個(gè)參數(shù)標(biāo)定了閾值,故推測(cè)目標(biāo)參數(shù)是global_opts中的VisualMapOpts。
全局配置項(xiàng)查找,根據(jù)名字和提示估計(jì)為range_color參數(shù)。
其參數(shù)類型定義如下:

# visualMap 組件過渡顏色
range_color: Union[Sequence[str]] = None,

這里筆者在初學(xué)時(shí)不知道如何調(diào)用,只好去看源碼。使用PyCharm ctrl+點(diǎn)擊進(jìn)入VisualMapOpts定義,發(fā)現(xiàn)如下:


class VisualMapOpts(BasicOpts):
    def __init__(
        self,
        #...
    ):
        _inrange_op: dict = {}
        if type_ == "color":
            range_color = range_color or ["#50a3ba", "#eac763", "#d94e5d"]
            _inrange_op.update(color=range_color)

可知,在不傳入range_color參數(shù)時(shí),其默認(rèn)為["#50a3ba", "#eac763", "#d94e5d"],是str列表形式傳參。(其實(shí)在文檔定義中 Union[Sequence[str]]已經(jīng)給出了參數(shù)形式,是python3對(duì)于數(shù)據(jù)類型的一種加強(qiáng)型標(biāo)識(shí))
故修改代碼如下,得到預(yù)期結(jié)果。

def geo() -> Map:
    c = (
        Map()
        .add(
            "", [list(z) for z in zip(data['地區(qū)'], data['2018年'])], 
            "china", 
            label_opts=opts.LabelOpts(formatter='\n{c}'),
             )
        .set_global_opts(
            title_opts=opts.TitleOpts(title=""),
            visualmap_opts=opts.VisualMapOpts(
                max_=20,
                range_color=["#90CAF9", "#1E88E5", "#0D47A1"]
            ),
        )
    )
    return c
geo().render_notebook()
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容