一、问题提出
pyecharts作为python最好用的可视化的库之一,能够绘制各种图。但在地图方面,pyecharts目前主要用于绘制中国及世界地图,网络上几乎没有介绍用pyecharts绘制其他国家地图的资料,其主要原因是pyecharts的地图包仅含全球国家地图、中国省级地图、中国市级地图、中国区县级地图、中国区域地图、英国选区地图,而无美国或其他国家的地图。Windows环境下,能安装的地图包及其安装方式如下:
pip install echarts-countries-pypkg # 全球国家地图
pip install echarts-china-provinces-pypkg # 中国省级地图
pip install echarts-china-cities-pypkg # 中国市级地图
pip install echarts-china-counties-pypkg # 中国区县级地图
pip install echarts-china-misc-pypkg # 中国区域地图
pip install echarts-united-kingdom-pypkg # 英国选区图
那么如何通过pyecharts去绘制世界上其他国家的地图呢?
二、解决方案
在查询大量资料无果后,在pyecharts的官方文档中找到了解决思路。
pyecharts官方文档:http://gallery.pyecharts.org/#/Geo/geo_chart_countries_js
官方文档样例:
# 绘制瑞士地图
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.datasets import register_url
try:
register_url("https://echarts-maps.github.io/echarts-countries-js/")
except Exception:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
register_url("https://echarts-maps.github.io/echarts-countries-js/")
geo = (
Geo()
.add_schema(maptype="瑞士")
.set_global_opts(title_opts=opts.TitleOpts(title="瑞士"))
.render("geo_chart_countries_js.html")
)
效果图:
pyecharts.geo生成瑞士地图
除瑞士地图之外,通过该方法还可以生成包括美国、俄罗斯等国家在内的217个国家。
部分可生成的国家地图
在此基础上,考虑生成美国地图,并在地图上标注各个州的某产品销量。源文件如下图所示,其中State字段包含美国50个州和特区的缩写,Sale字段为某产品在该州的销量。
原始数据文件
from pyecharts.charts import Geo
from pyecharts.datasets import register_url
# 绘制美国地区销量分布图
def draw_usa_map1():
try:
register_url("https://echarts-maps.github.io/echarts-countries-js/")
except Exception:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
register_url("https://echarts-maps.github.io/echarts-countries-js/")
df21 = pd.read_excel('D:/test.xlsx',sheet_name='prod1',header = 0)
states1 = df21['state'].tolist() # pandas转list
sales21 = df21['sale'].tolist()
list21 = [[states1[i],sales21[i]] for i in range(len(states1))] # 合并两个list为一个list
maxsales2 = max(sales21) # 计算最大销量值,用作图例的上限
geo = ( # 添加坐标点
Geo(init_opts=opts.InitOpts(width = "1200px", height = "600px", bg_color = '#EEEEE8'))
.add_schema(maptype="美国",itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"))
.add_coordinate('WA',-120.04,47.56)
.add_coordinate('OR',-120.37,43.77)
.add_coordinate('CA',-120.44,36.44)
.add_coordinate('AK',-122.00,28.46)
.add_coordinate('ID',-114.08,43.80)
.add_coordinate('NV',-116.44,39.61)
.add_coordinate('MT',-109.42,47.13)
.add_coordinate('WY',-107.29,42.96)
.add_coordinate('UT',-111.19,39.35)
.add_coordinate('AZ',-111.70,34.45)
.add_coordinate('HI',-105.25,28.72)
.add_coordinate('CO',-105.52,38.89)
.add_coordinate('NM',-106.11,34.45)
.add_coordinate('ND',-100.22,47.53)
.add_coordinate('SD',-100.52,44.72)
.add_coordinate('NE',-99.64,41.65)
.add_coordinate('KS',-98.53,38.43)
.add_coordinate('OK',-97.13,35.42)
.add_coordinate('TX',-98.16,31.03)
.add_coordinate('MN',-94.26,46.02)
.add_coordinate('IA',-93.60,42.09)
.add_coordinate('MO',-92.57,38.48)
.add_coordinate('AR',-92.43,34.69)
.add_coordinate('LA',-92.49,31.22)
.add_coordinate('WI',-89.55,44.25)
.add_coordinate('MI',-84.62,43.98)
.add_coordinate('IL',-89.11,40.20)
.add_coordinate('IN',-86.17,40.08)
.add_coordinate('OH',-82.71,40.31)
.add_coordinate('KY',-84.92,37.44)
.add_coordinate('TN',-86.32,35.78)
.add_coordinate('MS',-89.63,32.66)
.add_coordinate('AL',-86.68,32.53)
.add_coordinate('FL',-81.68,28.07)
.add_coordinate('GA',-83.22,32.59)
.add_coordinate('SC',-80.65,33.78)
.add_coordinate('NC',-78.88,35.48)
.add_coordinate('VA',-78.24,37.48)
.add_coordinate('WV',-80.63,38.62)
.add_coordinate('PA',-77.57,40.78)
.add_coordinate('NY',-75.22,43.06)
.add_coordinate('MD',-76.29,39.09)
.add_coordinate('DE',-75.55,39.09)
.add_coordinate('NJ',-74.47,40.03)
.add_coordinate('VT',-72.70,44.13)
.add_coordinate('NH',-71.64,43.59)
.add_coordinate('MA',-72.09,42.33)
.add_coordinate('CT',-72.63,41.67)
.add_coordinate('RI',-71.49,41.64)
.add_coordinate('ME',-69.06,45.16)
.add_coordinate('PR',-75.37,26.42)
.add_coordinate('DC',-77.04,38.90)
.add("product1", list21, type_=ChartType.EFFECT_SCATTER)
.set_global_opts(
title_opts=opts.TitleOpts(title="product1销量分布图"),
visualmap_opts=opts.VisualMapOpts(max_ = maxsales2,is_piecewise=True),
)
.render("D:/prod1.html")
)
效果图:
美国销量分布图
三、总结
可以通过访问github上的仓库加载世界各国的js文件来实现绘制217个国家的地图,但该方法需要访问github,因此不适用无法访问github的情况。