利用pyecharts绘制分级地图的案例
一、概念介紹
分級統計地圖,或許在以前大家還不常見,但是疫情期間,借助分級地圖向我們呈現全國各省市風險地區情況、確診或死亡人數情況等的應用還是數不勝數的,效果也讓人一目了然。顯然,分級地圖即是在我們整個制圖區域內利用地理行政規劃(或其它規劃單位)劃分若干個小單元,再對各單元按數據分級,利用不同的顏色(飽和度或暈線等等)進行呈現。
分級地圖可以向我們呈現各區現象的一個集中程度,所以在應用上,我們可以用來展現人口普查結果、城市發展結果、疫情嚴重程度、選舉票數情況等等相關數據的可視化。
但一定要注意,分級地圖稍有不慎會帶來錯誤地信息傳導。經典的案例即為美國選舉地圖。
因為美國大選的規則是,獲得該選區過半選票的候選人將獲得選區所有的選票,對應區域在地圖上填充顏色。從可視化的角度,顏色只代表了候選人維度的分組,比較數值大小只能靠面積,那么單看上面這張地圖,我們可以馬上得出結論:應該是紅色方贏得大選,然而事實與我們的結論相悖。
????????為什么會這樣呢?這源于數據分布和地理區域不對稱的問題。通常情況下,人口稀疏的地區反而地理面積大,占據了大幅屏幕;而人口密集,數據量大的區域地理面積相對小,就有了劣勢。在這里我仍然要重提可視化的宗旨,必須是保證正確的信息傳遞,美化都是其次!!!!
二、數據導入
? ? ? ? 本來也沒想好要畫什么數據,就先隨機生成模擬數據來實現全國各省市分級地圖的繪制。
excel中的數據如下:
?數據導入:
import pandas as pddata = pd.read_excel('地圖數據.xlsx',sheet_name=[0,1,2]) datamap = data[0] #現存確診 datamap_xc = list(zip(datamap['地區'],datamap['模擬數據']))我們要繪制圖形的數據結構如下:
三、圖像繪制
? ? ? ? 如題,我們使用的是python語言,借助pyecharts包實現。
from pyecharts.charts import Map from pyecharts import options as optsmap_xc = (Map().add("模擬數據",datamap_xc,maptype='china').set_global_opts(title_opts=opts.TitleOpts(title="pyecharts地圖示例",subtitle="2020年12月07日"),visualmap_opts=opts.VisualMapOpts(max_=100,is_piecewise=True,pieces=[{"min": 10000, "label": '>10000', "color": "#801C1B"},{"min": 1000, "max": 9999,"label": '1000-9999', "color": "#FF3030"}, {"min": 500, "max": 999, "label": '500-999', "color": "#FF4500"},{"min": 100, "max": 499, "label": '100-499', "color": "#FF7F50"},{"min": 10, "max": 99, "label": '10-99', "color": "#FFA500"},{"min": 1, "max": 9, "label": '1-9', "color": "#FFDEAD"},{"max": 0,"label": '0', "color": "white"}])).set_series_opts(label_opts=opts.LabelOpts(is_show=True,position='leftBottom'))) map_xc.render("./分級地圖-示例1.html")?繪制結果如下:(顏色選的不是特別好)
?四、參數解釋
(1) opts.VisualMapOpts是我們的視覺映射配置項
def __init__(self,is_show: bool = True,type_: str = "color",min_: Numeric = 0,max_: Numeric = 100,range_text: Optional[Sequence] = None,range_color: Optional[Sequence[str]] = None,range_size: Optional[Sequence[int]] = None,range_opacity: Optional[Numeric] = None,orient: str = "vertical",pos_left: Optional[str] = None,pos_right: Optional[str] = None,pos_top: Optional[str] = None,pos_bottom: Optional[str] = None,split_number: int = 5,series_index: Union[Numeric, Sequence, None] = None,dimension: Optional[Numeric] = None,is_calculable: bool = True,is_piecewise: bool = False,is_inverse: bool = False,precision: Optional[int] = None,pieces: Optional[Sequence] = None,out_of_range: Optional[Sequence] = None,item_width: int = 0,item_height: int = 0,background_color: Optional[str] = None,border_color: Optional[str] = None,border_width: int = 0,textstyle_opts: Union[TextStyleOpts, dict, None] = None,)? ? ? ? ①is_show=True? :? 是否顯示映射條,默認是True,即顯示我們左下角的這個分級label。
? ? ? ? ②type_='color'? :? 默認是color,即顏色映射。還有一個可選項是‘size’,即大小映射,此時地圖上不顯示顏色。我們如果把is_piecewise和pieces都去掉,選擇大小映射得到的結果如下:
?? ? ? ?③min_=0,max_=100? :? ?【0,100】區間是默認值,可以調整,結合兩張圖,我們可以發現其只在不分段型地圖中有效,注意上下的兩個小三角形是默認可移動的,自定義顯示區間(如下下圖),如果不需要,則增加is_calculable =False 。
? ? ? ? ④range_text=None? :? ?表明程度的文本,只能從高到低標注,并且只能標注首尾的text。比如我們在type_='color'下增加range_text=['高’,‘低’],得到的結果如下:
?? ? ? ?⑤range_color? ?:? ? 默認如上圖,當然也可以自定義,要求填入的顏色順序是從淺色到深色對應由小到大的數值即可,色彩種類數沒有限制,盡量三個以上,保持同色系。這樣的話,實現藍色系列、黃色系列或者紅色系列都行。
? ? ? ? ⑥orient??:? ?映射條的放置方式,默認為‘vertical’,豎直方向;還可以選擇水平,如果我們設置orient=‘horizontal’,得到的結果如下:
? ? ? ? ⑦pos_left? :? 指的是映射條左邊離畫布左側邊緣的距離,自定義的話可以填x%(畫布寬的百分比),或者填像素值,又或者選擇”left“,“right”,“center”其一。pos_right同理,一般情況下上述兩者選擇其一來進行水平位置的定位。
? ? ? ? ⑧pos_top? :? ?指的是映射條上邊離畫布頂部邊緣的距離,數值填法如上;文本填法可以選擇“top”,“middle”或者“bottom”其一。在定位過程中,如果映射條消失,比如pos_top='100%',此時映射條是隱藏在了顯示畫布的下方,所以沒顯示。在使用過程中,我們常常是一水平一數值搭配,比如pos_left='10%',pos_top='5%'。
? ? ? ? ⑨split_number? ? : 分段區間數,默認為5,具體定多少,根據數據的極差來選擇。
? ? ? ? ⑩is_piecewise? ? :? 是否為分段型,默認為False,如果按照我們的案例為True,一般增加pieces,自定義每一段的范圍和text,顏色等。對于pieces中的min/max,若不指定 max,表示 max 為正無窮(Infinity),若不指定min,表示min為負無窮(-Infinity)。
? ? ? ? 另:background_color? : 映射條區域的背景顏色,border_color? : 該區域的邊界顏色border_width :區域邊界的寬度,舉例如下:
background_color='#ff967c',border_color = 'blue',border_width = 1?(2)如何更改地圖所在整個畫布的背景顏色或主題呢?
? ? ? ? 在map的配置項中,我們可以增加畫布主體theme選項更改圖像主題,通過bg
_color更改背景顏色。舉例如下所示:
map_xc = (Map(init_opts=opts.InitOpts(theme='essos',bg_color='#fefcaf')).add("模擬數據",datamap_xc,maptype='china').set_global_opts(title_opts=opts.TitleOpts(title="pyecharts地圖示例",subtitle="林老頭ss"),visualmap_opts=opts.VisualMapOpts(is_piecewise=False,max_=100)).set_series_opts(label_opts=opts.LabelOpts(is_show=True,position='leftBottom'))) map_xc.render("./分級地圖-示例1.html")?theme的可選項如下,大家可以自配:?
class _ThemeType:BUILTIN_THEMES = ["light", "dark", "white"]LIGHT = "light"DARK = "dark"WHITE = "white"CHALK: str = "chalk"ESSOS: str = "essos"INFOGRAPHIC: str = "infographic"MACARONS: str = "macarons"PURPLE_PASSION: str = "purple-passion"ROMA: str = "roma"ROMANTIC: str = "romantic"SHINE: str = "shine"VINTAGE: str = "vintage"WALDEN: str = "walden"WESTEROS: str = "westeros"WONDERLAND: str = "wonderland"HALLOWEEN: str = "halloween"?(3)如何繪制區縣地圖或者世界地圖呢?
? ? ? ? 注意到我們add中有個參數為maptype,默認為’china‘,即中國地圖。如果要畫世界地圖,則對于’world‘,如果要畫某個省的區縣地圖,則maptype='城市名',我們以深圳市為例:
from pyecharts.charts import Map from pyecharts import options as optsdata_sz = [('南山區',5096),('福田區',5000),('羅湖區',4500),('鹽田區',3500),('寶安區',2500),('龍崗區',2200),('龍華區',1500),('坪山區',900)] counties = (Map().add('深圳',data_sz, maptype='深圳',label_opts=opts.LabelOpts(is_show= False),).set_global_opts(title_opts=opts.TitleOpts(),visualmap_opts=opts.VisualMapOpts(is_piecewise=True,pieces=[{"min": 5000, "label": '>5000', "color": "#fc5a50"},{"min": 4000, "max": 4999,"label": '4000-4999', "color": "#fea993"},{"min": 3000, "max": 3999, "label": '3000-3999', "color": "#ffb07c"},{"min": 2000, "max": 2999, "label": '2000-2099', "color": "#f1da7a"},{"min": 1000, "max": 1999, "label": '1000-1999', "color": "#8ab8fe"},{"min": 1, "max": 999, "label": '1-999', "color": "#c1c6fc"},{"max": 0,"label": '其它區縣', "color": "white"}])).set_series_opts(label_opts=opts.LabelOpts(is_show=False,position='leftBottom')).render("./地圖示例2.html") )?注意,我們set_series_opts中is_show= False,所以區縣名稱沒有顯示出來,這么做是因為對某些省份,區縣的標簽容易擠在一起顯示,非常混亂,但在交互中我們仍然可以很容易知道各區縣的信息。繪圖結果如下所示:
希望對您有所幫助~
總結
以上是生活随笔為你收集整理的利用pyecharts绘制分级地图的案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何写一个NES模拟器(三)——精灵的显
- 下一篇: WebIM项目的架构设计以及实现