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

工具與配置
- Python 3.7.3,使用Anaconda安裝
- pyecharts 1.3.1,pip安裝
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")
得到如圖

發(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()
