前言
可视化课程需要一个找一个可视化工具库,刚好最近在学python,python的一大优点就是库多,我就在想有没有一个做可视化的python库,一开始找到了plotly,但说实话使用体验并不好,然后看到很多人推荐百度的可视化JS工具echarts,一查,发现果然有人把python与echarts结合了。这里就使用了pyecharts做了世界地震图。
python自带画图模块matplotlib,但pyecharts使用起来更简单,画的也更好看,动态可交互。
准备条件
pyecharts需要基于python,开发环境是在jupyter notebook中,在windows下的pycharm中应该是可以使用的,但是因为一直想在linux中写python,现在有机会所以换到了linux中,我使用的是ubuntu,下载了anocanda,anocanda自带jupyter notebook,并且对库的管理也更方便。
anocanda最好在清华镜像园中下载,不然太慢了,装的时候有个坑,有一步是是否添加环境变量,最好yes,省的后面还要自己加,我装的时候重装了两次,一次是安装的地址那里,我他喵把文件名搞成了Enter,虽然可以不改,但强迫症受不了,后面修改后又要改环境变量,试了各种方法,都不能完全改好,虽然可以用anocanda的python3,但库总是出错,无奈重装。第二遍熟能生巧,疯狂回车,环境变量又搞错了。
在ubuntu中装anocanda时,推荐一直按默认装,只有最后会让你装vs code,这个可以看你个人意向。
装好anocanda后,python和jupyter notebook就都有了,然后就是装pyecharts相关库。这个可以看pyecharts的官方文档(中文好评)。
画地图
安装pyecharts库,使用anocanda的canda命令无法安装,估计是下载源中未包含该库,使用pip就行
$ pip install pyecharts
有点需要注意的,pyecharts库中没有包含地图,需要另行安装。
全球国家地图: echarts-countries-pypkg (1.9MB): 世界地图和 213 个国家,包括中国地图
中国省级地图: echarts-china-provinces-pypkg (730KB):23 个省,5 个自治区
中国市级地图: echarts-china-cities-pypkg (3.8MB):370 个中国城市
中国县区级地图: echarts-china-counties-pypkg (4.1MB):2882 个中国县·区
中国区域地图: echarts-china-misc-pypkg (148KB):11 个中国区域地图,比如华南、华北。
英国 2016 选区图: echarts-united-kingdom-pypkg (1MB)
$ 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
之后就可以打开jupyter notebook开始编程,linux中可以到自己建立的一个文件夹中直接输入jupyter notebook,就会在浏览器中打开编程界面,而该文件夹就是工作区间。pycharm可以创建jupyter notebook文件。
下面正式开始编程。
from pyecharts import Geo,Style #地理坐标系组件用于地图的绘制,支持在地理坐标系上绘制散点图,线集
import pandas as pd #用来读取csv文件df = pd.read_csv('all_2010s_M6plus.csv')#表中为地震数据geo_cities_coords={
df.place[i]:[df.longitude[i],df.latitude[i]] for i in range(len(df))}
''' 自定义地点,这里是重点。pyecharts的地图库虽然使用很方便,位置可以直接通过地名来确定,但我想要找到没有确切地名的地方, 就要自己来制作地点映射了。geo_cities_coords是一个字典,格式为{地名:【经度,纬度】} '''
attr=list(df['place'])
value=list(df['mag'])#Style用来统一风格化,这里是用在下面Geo中的参数
style = Style(title_color="#fff", #标题颜色title_pos="center", #标题位置width = 1200, #地图大小height=600, background_color="#CCCCCC") #背景色geo = Geo("worldmap",**style.init_style) #主标题
geo.add("", #图例名称,用来标识图中点的名称attr, # 属性名称,也就是地名value, #属性所对应的值,这里是震级visual_range=[5,10], #指定组件允许的最小值和最大值#这里是震级,5到10级visual_split_number= 5, #与上面结合,这里指分五个,即5-6、6-7、7-8、8-9、9-10五类点symbol_size=5, #图标大小visual_text_color="#000", #这是图片两端文本的颜色is_piecewise = True,#是否将组件转换为分段型is_visualmap= True,#地图是否可视maptype = 'world', #这里需要下载地图库,直接输入名字就能获取相关地图,这里是世界地图。geo_cities_coords=geo_cities_coords,#自定义的地点geo_normal_color="#AB82FF",#正常状态下地图区域的颜色geo_emphasis_color="#2a333d",#高亮状态下地图区域的颜色type = "effectScatter")#这里设定地图类型,默认是散点图,这里是带有涟漪特效动画的散点图,还可以设置为热力图
geo.render("EffectScatter.html")
带有涟漪特效动画的散点图
图是动态的,这里截图是静态的。
散点图
更多与地图及其他图相关的参数,可查阅官方文档。
这里复制粘贴Geo(地理坐标系)相关部分
visualMap中的参数可以放在Geo.add()中补充使用
visualMap
是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道)
is_visualmap -> bool
是否使用视觉映射组件
visual_type -> str
制定组件映射方式,默认为’color‘,即通过颜色来映射数值。有’color’, ‘size’可选。‘size’通过数值点的大小,也就是图形点的大小来映射数值。
visual_range -> list
默认 -> [0, 100]
指定组件的允许的最小值与最大值。
visual_text_color -> list
两端文本颜色。
visual_range_text -> list
默认 -> [‘low’, ‘hight’]
两端文本。
visual_range_color -> list
默认 -> [’#50a3ba’, ‘#eac763’, ‘#d94e5d’]
过渡颜色。
visual_range_size -> list
默认 -> [20, 50]
数值映射的范围,也就是图形点大小的范围。
visual_orient -> str
默认 -> ‘vertical’
visualMap 组件条的方向。有’vertical’, ‘horizontal’可选。
visual_pos -> str/int
默认 -> ‘left’
visualmap 组件条距离左侧的位置。有’right’, ‘center’, ‘right’可选,也可为百分数或整数。
visual_top -> str/int
默认 -> ‘top’
visualmap 组件条距离顶部的位置。有’top’, ‘center’, 'bottom’可选,也可为百分数或整数。
visual_split_number -> int
默认 -> 5
分段型中分割的段数,在设置为分段型时生效。
visual_dimension -> int
指定用数据的『哪个维度』,映射到视觉元素上。默认映射到最后一个维度。索引从 0 开始。
在直角坐标系中,x 轴为第一个维度(0),y 轴为第二个维度(1)。
is_calculable -> bool
默认 -> True
是否显示拖拽用的手柄(手柄能拖拽调整选中范围)。
is_piecewise -> bool
默认 -> False
是否将组件转换为分段型(默认为连续型)。
pieces -> list
自定义『分段式视觉映射组件(visualMapPiecewise)』的每一段的范围,以及每一段的文字,以及每一段的特别的样式。
Geo.add() 方法签名
name -> str
图例名称
attr -> list
属性名称
value -> list
属性所对应的值
type -> str
图例类型,有’scatter’, ‘effectScatter’, ‘heatmap’可选。默认为 ‘scatter’
maptype -> str
地图类型。 从 v0.3.2+ 起,地图已经变为扩展包,支持全国省份,全国城市,全国区县,全球国家等地图,具体请参考 地图自定义篇
coordinate_region -> str
城市坐标所属国家。从 v0.5.7 引入,针对国际城市的地理位置的查找。默认为 中国。具体的国家/地区映射表参照 countries_regions_db.json。更多地理坐标信息可以参考 数据集篇
symbol_size -> int
标记图形大小。默认为 12
border_color -> str
地图边界颜色。默认为 ‘#111’
geo_normal_color -> str
正常状态下地图区域的颜色。默认为 ‘#323c48’
geo_emphasis_color -> str
高亮状态下地图区域的颜色。默认为 ‘#2a333d’
geo_cities_coords -> dict
用户自定义地区经纬度,类似如 {‘阿城’: [126.58, 45.32],} 这样的字典。
is_roam -> bool
是否开启鼠标缩放和平移漫游。默认为 True
如果只想要开启缩放或者平移,可以设置成’scale’或者’move’。设置成 True 为都开启
总结
pyecharts使用体验良好,主要是前置条件比较麻烦,需要python和jupyter notebook,还需要装相关库(换用linux和anoconda就是因为在windows中用pycharm装库问题好多)。
pyecharts 还有个优点是有官方中文文档,查阅方便,这里贴下官网,官网主页,主页很容易找到文档,还有github的代码库,在文档中也有教导下载代码的。
有一个问题是地图没有3D的效果,而echarts中好像有,可能还没有完全搬运过来。
还有一个问题是图片,找的这些专门的可视化工具库,都是对一些特定的图表很友好,但如果我想把一张图片放在背景上,我没有找到解决的办法。这个问题的原因是echarts本身是js库,python把代码转换为js代码在浏览器中显示,而图片也必须写成json格式才行,所以不能像processing一样随心所欲的处理。