数据可视化
可视化效果一:2020年印美日新冠累计确诊人数
2020年是新冠疫情爆发的一年,随着疫情的爆发,国内外确诊人数成了大家关心的热点,相信大家都有看过类似的疫情报告.本案例对印度美国日本三个国家确诊人数的进行了可视化处理,形成了可视化的疫情确诊人数报告.
可视化效果二:全国疫情地图可视化
可视化效果三:动态GDP增长图
此处没有办法进行动态变化,希望大家自行想象,接下来开始可视化的学习。
1.json数据转换
JSON是一种轻量级的数据交互格式,可以按照JSON指定的格式去组织和封装数据
JSON本质上是一种带有特定格式的字符串
主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互 类似于:国际通用语言-英语,中国56个民族不同地区的通用语言-普通话
各种编程语言存储数据的容器不尽相同,在Python中有字典dict这样的数据类型,而其它语言可能没有对应的字典
为了让不同的语言都能够相互通用的互相传递数据,JSON就是一种非常良好的中转数据格式。
json格式数据转化
#json数据的格式可以是: {"name":"admin","age":18} # 也可以是: [{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
json格式说白了就是python的列表或者字典,唯一的要求就是列表内部嵌套的必须是字典,二对于字典本身的话,就没有任何格式或者形式上的要求。
json本质上是字符串。
Python数据和Json数据之间的相互转化
通过代码来对该知识点进行熟悉
列表嵌套字典形式:
# 导入json模块
import json
# 准备符合格式json格式要求的python数据
data1 = [{"name":"William","age":18},{"name":"Jeff","age":18}]
data2 = [{"name":"张三","age":18},{"name":"李四","age":18}]
json_str1 = json.dumps(data1)
print(type(json_str1))
print(json_str1)
json_str2 = json.dumps(data2,ensure_ascii=False)
print(type(json_str2))
print(json_str2)
如果包含中文,那么要加上ensure_ascii=False
字典形式:
import json
# 准备字典,将字典转换为Json
d = {"name":"张三","address":"浙江"}
json_str = json.dumps(d,ensure_ascii=False)
print(type(json_str))
print(json_str)
# 将python字符串转换为Python数据类型[{k:v,k:v},{k:v,k:v}]
s = '[{"name":"张三","address":"浙江"},{"name":"李四","address":"江苏"}]'
l = json.loads(s)
print(type(l))
print(l)
2.pyecharts模块介绍
概况:
Echarts是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而Python是门富有表达力的语言,很适合用于数据处理.当数据分析遇上数据可视化时pyecharts诞生了。
打开官方网站pyecharts.org
然后打开一个画廊的功能网站 Document
pyecharts模块安装
使用在前面学过的pip命令即可快速安装PyEcharts模块
打开命令提示符,再输入pip install pyecharts
然后输入python,再导入import pyecharts
显示到这里,说明安装没有错误,可以正常使用。
3.pyecharts快速入门
1.基础折线图
# 导包,导入Line功能构建折线图对象
from pyecharts.charts import Line
# 得到折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
line.add_yaxis("GDP",[30,20,10])
# 生成图表
line.render()
构建完成我们的折线图之后进行运行操作,会发现旁边文件栏中出现了render.html,点击该文件的网页功能就可以查看相应的网页功能。
2.pyecharts的配置选项
全局配置选项:
set_global_opts方法:
这里全局配置选项可以通过set_global_opts方法来进行配置,相应的选项和选项的功能如下:
当我们完成了图表后,就可以通过set_global_opts方法
Line.set_global_opts( title_opts=TitleOpts("测试",pos_left="center",pos_bottom="1%"), legend_opts=LegendOpts(is_show=True), toolbox_opts=ToolboxOpts(is_show=True), visualmap_opts=VisualMapOpts(is_show=True), tooltip_opts=TooltipOpts(is_show=True), )
在我们上面原有的基础上进行如下操作:
-
配置图表的标题
-
配置图例
-
配置鼠标移动效果
-
配置工具栏
-
等整体配置项
# 导包,导入Line功能构建折线图对象
from pyecharts.charts import Line
# 得到折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
line.add_yaxis("GDP",[30,20,10])
# 设置全局配置项
line.set_global_opts(
title_
)
# 生成图表
line.render()
在进行查看就会发现这个全局配置出来的可视化图相当不错啦,当然要对这个图进一步改善,引入更多的全局配置内容,那么就需要通过pyecharts的官网了解啦。
3.数据处理
打开一个网站ab173,这是一个懒人工具网站。在里面找到Json视图,然后可以把你选中的数据存放到如下的格式化处理器中,点击校验或者回车操作,这时候可以通过点击视图,将一大串的内容整合成相应的字典、列表包形式。
很多需要的数据都可以通过第三方网站进行展示和模拟。
打开pycharm,进行相应的编码:
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts
# 处理数据
f_us = open("D:/美国.txt",'r',encoding="UTF-8")
us_data = f_us.read() # 获得文件美国的全部内容
# 去掉不合JSON规范的开头
us_data = us_data.replcae("jsonp_1629344292311_69436(", ")
# 去掉不合JSON规范的结尾
us_data = us_data[:-2]
# JSON转Python字典
us_dict = json.loads(us_data)
print(type(us_dict))
print(us_dict)
# 获取trend key
trend_data = us_dict['data'][0]['trend']
# 获取日期数据,用于x轴,取2020年(到315下表结束)
x_data = json.loads['updateDate'][:314]
# 获取确认数据,用于y轴,去2020年(到315下标结束)
y_data = trend_data['list'][0]['data']
# 生成图表
line = line()
# 添加x轴数据
line.add_xaxis(us_x_data) # 使用一个国家的数据即可
# 添加y轴数据
line.add_yaxis('美国确诊人数',us_y_data,label_opts=LabelOpts)
# 设置全局设置
line.set_global_opts(
# 标题设置
title_opts = TitleOpts(title='2020年美国确诊人数折线图',pos_left='center',pos_bottom='1%')
)
# 生成图表
line.render()
# 关闭文件
f.close()
再打开json视图,将我们简化过的内容放置于该网站的Json视图中即可,可以查看
遗憾的是我这边暂时没有相应的数据文件和内容,没有办法在网页上对该可视化图进行显示。
可视化案例
1.地图-基础地图使用
基本地图演示:
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map = Map()
data = [
("浙江",9),
("江苏",19),
("北京",99),
("上海",199),
("海南",299),
("台湾",199),
("安徽",299),
("广州",399),
("湖北",599),
]
map.add("地图",data,"china")
# 全局设置
map.set_global_opts(
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min": 1, "max": 9, "label": "1-9", "color": "#CCFFFF"},
{"min": 10, "max": 99, "label": "10-99", "color": "#FF6666"},
{"min": 100, "max": 600, "label": "100-600", "color": "#990033"}
]
)
)
# 绘图
map.render()
通过ab173网站,在其中的前端中找到rgb颜色对照表
2.全国疫情地图构建
虽然没有相应的数据,但是不妨碍我们对代码进行熟悉和操作,让我们打开pychart
"""
演示全国疫情可视化地图开发
"""
import json
from pyecharts.charts import Map
from pyecharts.options import *
# 读取文件
f = open("D:/疫情.txt","r",encoding="UTF-8")
data = f.read() # 全国疫情数据获取
# 关闭文件
f.close()
# 获取到各省的数据
# 将字符串json转化为python的字典
data_dict = json.loads(data)
#从字典中取出每个省份的数据
province_data_list = data_dict["areaTree"][0]["children"]
# 组装每个省份和确诊人数为元组,并各省的数据都封装入列表
for province_data in province_data_list:
province_name = province_data["name"] #省份名称
province_confirm = province_data["total"]["confirm"] # 确诊人数
data_list.append(province_name,province_confirm)
print(data_list)
# 创建地图
map = Map()
# 添加数据
map.add("各省份确诊人数",data_list,"china")
# 设置全局配置,定制分段的视觉映射
map.set_global_opts{
title_opts=TitleOpts(title="全国疫情地图"),
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min":1,"max":99,"lable":"1~99人","color":"#CCFFFF"},
{"min":100,"max":999,"lable":"100~999人","color":"#FFFF99"},
{"min":1000,"max":4999,"lable":"1000~4999人","color":"#FF9966"},
{"min":5000,"max":9999,"lable":"5000~9999人","color":"#FF6666"},
{"min":10000,"max":99999,"lable":"10000~99999人","color":"#CC3333"},
{"min":100000,"lable":"100000+人","color":"#990033"}
]
),
}
# 绘图
map.render()
3.浙江省空气质量地图绘制
import json
from pyecharts.charts import Map
from pyecharts.options import *
#f = open("D:/空气质量.txt","r",encording="UTF-8")
#data = f.read()
#f.close()
#data_dict = json.loads(data)
#cities_data = data_dict["areaTree"][3]["children"]
data_list = []
#for city_data in cities_data:
#city_name = city_data["name"]+"市"
#city_confirm = city_data["total"]["confirm"]
#data_list(city_name,city_confirm)
#print(data_list)
data_list.append(("杭州",12))
data_list.append(("湖州",13))
data_list.append(("宁波",15))
data_list.append(("温州",18))
data_list.append(("嘉兴",20))
data_list.append(("丽水",34))
data_list.append(("台州",56))
data_list.append(("衢州",53))
data_list.append(("绍兴",18))
map = Map()
map.add("浙江省空气质量监测",data_list,"浙江")
map.set_global_opts(
title_opts=TitleOpts(title="浙江省空气质量监测地图"),
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min":1,"max":15,"lable":"优秀","color":"#CCFFFF"},
{"min": 16, "max": 30, "lable": "良好", "color": "#FFFF99"},
{"min": 31, "max": 45, "lable": "一般", "color": "#CC9966"},
{"min": 46, "max": 60, "lable": "较差", "color": "#FF6666"},
{"min": 61, "max": 75, "lable": "优秀", "color": "#CC3333"}
]
)
)
map.render("浙江省空气质量监测.html")
4.模仿百度空气可视化
下面是百度的空气质量可视化图:
import pyecharts.options as opts
from pyecharts.charts import BMap
data = [
["海门", 9],
["鄂尔多斯", 12],
["招远", 12],
["舟山", 12],
["齐齐哈尔", 14],
["盐城", 15],
["赤峰", 16],
["青岛", 18],
["乳山", 18],
["金昌", 19],
["泉州", 21],
["莱西", 21],
["日照", 21],
["胶南", 22],
["南通", 23],
["拉萨", 24],
["云浮", 24],
["梅州", 25],
["文登", 25],
["上海", 25],
["攀枝花", 25],
["威海", 25],
["承德", 25],
["厦门", 26],
["汕尾", 26],
["潮州", 26],
["丹东", 27],
["太仓", 27],
["曲靖", 27],
["烟台", 28],
["福州", 29],
["瓦房店", 30],
["即墨", 30],
["抚顺", 31],
["玉溪", 31],
["张家口", 31],
["阳泉", 31],
["莱州", 32],
["湖州", 32],
["汕头", 32],
["昆山", 33],
["宁波", 33],
["湛江", 33],
["揭阳", 34],
["荣成", 34],
["连云港", 35],
["葫芦岛", 35],
["常熟", 36],
["东莞", 36],
["河源", 36],
["淮安", 36],
["泰州", 36],
["南宁", 37],
["营口", 37],
["惠州", 37],
["江阴", 37],
["蓬莱", 37],
["韶关", 38],
["嘉峪关", 38],
["广州", 38],
["延安", 38],
["太原", 39],
["清远", 39],
["中山", 39],
["昆明", 39],
["寿光", 40],
["盘锦", 40],
["长治", 41],
["深圳", 41],
["珠海", 42],
["宿迁", 43],
["咸阳", 43],
["铜川", 44],
["平度", 44],
["佛山", 44],
["海口", 44],
["江门", 45],
["章丘", 45],
["肇庆", 46],
["大连", 47],
["临汾", 47],
["吴江", 47],
["石嘴山", 49],
["沈阳", 50],
["苏州", 50],
["茂名", 50],
["嘉兴", 51],
["长春", 51],
["胶州", 52],
["银川", 52],
["张家港", 52],
["三门峡", 53],
["锦州", 54],
["南昌", 54],
["柳州", 54],
["三亚", 54],
["自贡", 56],
["吉林", 56],
["阳江", 57],
["泸州", 57],
["西宁", 57],
["宜宾", 58],
["呼和浩特", 58],
["成都", 58],
["大同", 58],
["镇江", 59],
["桂林", 59],
["张家界", 59],
["宜兴", 59],
["北海", 60],
["西安", 61],
["金坛", 62],
["东营", 62],
["牡丹江", 63],
["遵义", 63],
["绍兴", 63],
["扬州", 64],
["常州", 64],
["潍坊", 65],
["重庆", 66],
["台州", 67],
["南京", 67],
["滨州", 70],
["贵阳", 71],
["无锡", 71],
["本溪", 71],
["克拉玛依", 72],
["渭南", 72],
["马鞍山", 72],
["宝鸡", 72],
["焦作", 75],
["句容", 75],
["北京", 79],
["徐州", 79],
["衡水", 80],
["包头", 80],
["绵阳", 80],
["乌鲁木齐", 84],
["枣庄", 84],
["杭州", 84],
["淄博", 85],
["鞍山", 86],
["溧阳", 86],
["库尔勒", 86],
["安阳", 90],
["开封", 90],
["济南", 92],
["德阳", 93],
["温州", 95],
["九江", 96],
["邯郸", 98],
["临安", 99],
["兰州", 99],
["沧州", 100],
["临沂", 103],
["南充", 104],
["天津", 105],
["富阳", 106],
["泰安", 112],
["诸暨", 112],
["郑州", 113],
["哈尔滨", 114],
["聊城", 116],
["芜湖", 117],
["唐山", 119],
["平顶山", 119],
["邢台", 119],
["德州", 120],
["济宁", 120],
["荆州", 127],
["宜昌", 130],
["义乌", 132],
["丽水", 133],
["洛阳", 134],
["秦皇岛", 136],
["株洲", 143],
["石家庄", 147],
["莱芜", 148],
["常德", 152],
["保定", 153],
["湘潭", 154],
["金华", 157],
["岳阳", 169],
["长沙", 175],
["衢州", 177],
["廊坊", 193],
["菏泽", 194],
["合肥", 229],
["武汉", 273],
["大庆", 279],
]
geoCoordMap = {
"海门": [121.15, 31.89],
"鄂尔多斯": [109.781327, 39.608266],
"招远": [120.38, 37.35],
"舟山": [122.207216, 29.985295],
"齐齐哈尔": [123.97, 47.33],
"盐城": [120.13, 33.38],
"赤峰": [118.87, 42.28],
"青岛": [120.33, 36.07],
"乳山": [121.52, 36.89],
"金昌": [102.188043, 38.520089],
"泉州": [118.58, 24.93],
"莱西": [120.53, 36.86],
"日照": [119.46, 35.42],
"胶南": [119.97, 35.88],
"南通": [121.05, 32.08],
"拉萨": [91.11, 29.97],
"云浮": [112.02, 22.93],
"梅州": [116.1, 24.55],
"文登": [122.05, 37.2],
"上海": [121.48, 31.22],
"攀枝花": [101.718637, 26.582347],
"威海": [122.1, 37.5],
"承德": [117.93, 40.97],
"厦门": [118.1, 24.46],
"汕尾": [115.375279, 22.786211],
"潮州": [116.63, 23.68],
"丹东": [124.37, 40.13],
"太仓": [121.1, 31.45],
"曲靖": [103.79, 25.51],
"烟台": [121.39, 37.52],
"福州": [119.3, 26.08],
"瓦房店": [121.979603, 39.627114],
"即墨": [120.45, 36.38],
"抚顺": [123.97, 41.97],
"玉溪": [102.52, 24.35],
"张家口": [114.87, 40.82],
"阳泉": [113.57, 37.85],
"莱州": [119.942327, 37.177017],
"湖州": [120.1, 30.86],
"汕头": [116.69, 23.39],
"昆山": [120.95, 31.39],
"宁波": [121.56, 29.86],
"湛江": [110.359377, 21.270708],
"揭阳": [116.35, 23.55],
"荣成": [122.41, 37.16],
"连云港": [119.16, 34.59],
"葫芦岛": [120.836932, 40.711052],
"常熟": [120.74, 31.64],
"东莞": [113.75, 23.04],
"河源": [114.68, 23.73],
"淮安": [119.15, 33.5],
"泰州": [119.9, 32.49],
"南宁": [108.33, 22.84],
"营口": [122.18, 40.65],
"惠州": [114.4, 23.09],
"江阴": [120.26, 31.91],
"蓬莱": [120.75, 37.8],
"韶关": [113.62, 24.84],
"嘉峪关": [98.289152, 39.77313],
"广州": [113.23, 23.16],
"延安": [109.47, 36.6],
"太原": [112.53, 37.87],
"清远": [113.01, 23.7],
"中山": [113.38, 22.52],
"昆明": [102.73, 25.04],
"寿光": [118.73, 36.86],
"盘锦": [122.070714, 41.119997],
"长治": [113.08, 36.18],
"深圳": [114.07, 22.62],
"珠海": [113.52, 22.3],
"宿迁": [118.3, 33.96],
"咸阳": [108.72, 34.36],
"铜川": [109.11, 35.09],
"平度": [119.97, 36.77],
"佛山": [113.11, 23.05],
"海口": [110.35, 20.02],
"江门": [113.06, 22.61],
"章丘": [117.53, 36.72],
"肇庆": [112.44, 23.05],
"大连": [121.62, 38.92],
"临汾": [111.5, 36.08],
"吴江": [120.63, 31.16],
"石嘴山": [106.39, 39.04],
"沈阳": [123.38, 41.8],
"苏州": [120.62, 31.32],
"茂名": [110.88, 21.68],
"嘉兴": [120.76, 30.77],
"长春": [125.35, 43.88],
"胶州": [120.03336, 36.264622],
"银川": [106.27, 38.47],
"张家港": [120.555821, 31.875428],
"三门峡": [111.19, 34.76],
"锦州": [121.15, 41.13],
"南昌": [115.89, 28.68],
"柳州": [109.4, 24.33],
"三亚": [109.511909, 18.252847],
"自贡": [104.778442, 29.33903],
"吉林": [126.57, 43.87],
"阳江": [111.95, 21.85],
"泸州": [105.39, 28.91],
"西宁": [101.74, 36.56],
"宜宾": [104.56, 29.77],
"呼和浩特": [111.65, 40.82],
"成都": [104.06, 30.67],
"大同": [113.3, 40.12],
"镇江": [119.44, 32.2],
"桂林": [110.28, 25.29],
"张家界": [110.479191, 29.117096],
"宜兴": [119.82, 31.36],
"北海": [109.12, 21.49],
"西安": [108.95, 34.27],
"金坛": [119.56, 31.74],
"东营": [118.49, 37.46],
"牡丹江": [129.58, 44.6],
"遵义": [106.9, 27.7],
"绍兴": [120.58, 30.01],
"扬州": [119.42, 32.39],
"常州": [119.95, 31.79],
"潍坊": [119.1, 36.62],
"重庆": [106.54, 29.59],
"台州": [121.420757, 28.656386],
"南京": [118.78, 32.04],
"滨州": [118.03, 37.36],
"贵阳": [106.71, 26.57],
"无锡": [120.29, 31.59],
"本溪": [123.73, 41.3],
"克拉玛依": [84.77, 45.59],
"渭南": [109.5, 34.52],
"马鞍山": [118.48, 31.56],
"宝鸡": [107.15, 34.38],
"焦作": [113.21, 35.24],
"句容": [119.16, 31.95],
"北京": [116.46, 39.92],
"徐州": [117.2, 34.26],
"衡水": [115.72, 37.72],
"包头": [110, 40.58],
"绵阳": [104.73, 31.48],
"乌鲁木齐": [87.68, 43.77],
"枣庄": [117.57, 34.86],
"杭州": [120.19, 30.26],
"淄博": [118.05, 36.78],
"鞍山": [122.85, 41.12],
"溧阳": [119.48, 31.43],
"库尔勒": [86.06, 41.68],
"安阳": [114.35, 36.1],
"开封": [114.35, 34.79],
"济南": [117, 36.65],
"德阳": [104.37, 31.13],
"温州": [120.65, 28.01],
"九江": [115.97, 29.71],
"邯郸": [114.47, 36.6],
"临安": [119.72, 30.23],
"兰州": [103.73, 36.03],
"沧州": [116.83, 38.33],
"临沂": [118.35, 35.05],
"南充": [106.110698, 30.837793],
"天津": [117.2, 39.13],
"富阳": [119.95, 30.07],
"泰安": [117.13, 36.18],
"诸暨": [120.23, 29.71],
"郑州": [113.65, 34.76],
"哈尔滨": [126.63, 45.75],
"聊城": [115.97, 36.45],
"芜湖": [118.38, 31.33],
"唐山": [118.02, 39.63],
"平顶山": [113.29, 33.75],
"邢台": [114.48, 37.05],
"德州": [116.29, 37.45],
"济宁": [116.59, 35.38],
"荆州": [112.239741, 30.335165],
"宜昌": [111.3, 30.7],
"义乌": [120.06, 29.32],
"丽水": [119.92, 28.45],
"洛阳": [112.44, 34.7],
"秦皇岛": [119.57, 39.95],
"株洲": [113.16, 27.83],
"石家庄": [114.48, 38.03],
"莱芜": [117.67, 36.19],
"常德": [111.69, 29.05],
"保定": [115.48, 38.85],
"湘潭": [112.91, 27.87],
"金华": [119.64, 29.12],
"岳阳": [113.09, 29.37],
"长沙": [113, 28.21],
"衢州": [118.88, 28.97],
"廊坊": [116.7, 39.53],
"菏泽": [115.480656, 35.23375],
"合肥": [117.27, 31.86],
"武汉": [114.31, 30.52],
"大庆": [125.03, 46.58],
}
def convert_data():
res = []
for i in range(len(data)):
geo_coord = geoCoordMap[data[i][0]]
geo_coord.append(data[i][1])
res.append([data[i][0], geo_coord])
return res
(
BMap(init_opts=opts.InitOpts(width="1200px", height="800px"))
.add(
type_="effectScatter",
series_name="pm2.5",
data_pair=convert_data(),
symbol_size=10,
effect_opts=opts.EffectOpts(),
label_opts=opts.LabelOpts(formatter="{b}", position="right", is_show=False),
itemstyle_opts=opts.ItemStyleOpts(color="purple"),
)
.add_schema(
baidu_ak="FAKE_AK",
center=[104.114129, 37.550339],
zoom=5,
is_roam=True,
map_style={
"styleJson": [
{
"featureType": "water",
"elementType": "all",
"stylers": {"color": "#044161"},
},
{
"featureType": "land",
"elementType": "all",
"stylers": {"color": "#004981"},
},
{
"featureType": "boundary",
"elementType": "geometry",
"stylers": {"color": "#064f85"},
},
{
"featureType": "railway",
"elementType": "all",
"stylers": {"visibility": "off"},
},
{
"featureType": "highway",
"elementType": "geometry",
"stylers": {"color": "#004981"},
},
{
"featureType": "highway",
"elementType": "geometry.fill",
"stylers": {"color": "#005b96", "lightness": 1},
},
{
"featureType": "highway",
"elementType": "labels",
"stylers": {"visibility": "off"},
},
{
"featureType": "arterial",
"elementType": "geometry",
"stylers": {"color": "#004981"},
},
{
"featureType": "arterial",
"elementType": "geometry.fill",
"stylers": {"color": "#00508b"},
},
{
"featureType": "poi",
"elementType": "all",
"stylers": {"visibility": "off"},
},
{
"featureType": "green",
"elementType": "all",
"stylers": {"color": "#056197", "visibility": "off"},
},
{
"featureType": "subway",
"elementType": "all",
"stylers": {"visibility": "off"},
},
{
"featureType": "manmade",
"elementType": "all",
"stylers": {"visibility": "off"},
},
{
"featureType": "local",
"elementType": "all",
"stylers": {"visibility": "off"},
},
{
"featureType": "arterial",
"elementType": "labels",
"stylers": {"visibility": "off"},
},
{
"featureType": "boundary",
"elementType": "geometry.fill",
"stylers": {"color": "#029fd4"},
},
{
"featureType": "building",
"elementType": "all",
"stylers": {"color": "#1a5787"},
},
{
"featureType": "label",
"elementType": "all",
"stylers": {"visibility": "off"},
},
]
},
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="全国主要城市空气质量",
subtitle="data from PM25.in",
subtitle_link="http://www.pm25.in",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
),
tooltip_opts=opts.TooltipOpts(trigger="item"),
)
.render("air_quality_baidu_map.html")
)
目前还是以熟悉为主,多多借鉴官网上的代码,能够有效提升自己的构图水平!
柱状图构建
1.基础柱状图
掌握构建一个基础的柱状图并能够反转x和y轴
通过Bar构建基础柱状图
from pyecharts.charts import Bar
from pyecharts.options import *
# 构建柱状图对象
bar = Bar()
# 添加x轴数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
bar.add_yaxis("GDP",[30, 20, 10])
# 绘图
bar.render("基础柱状图.html")
如果想要反转x、y轴的话,实际上只需要用到bar.reversal_axis()即可
from pyecharts.charts import Bar
from pyecharts.options import *
# 构建柱状图对象
bar = Bar()
# 添加x轴数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
bar.add_yaxis("GDP",[30, 20, 10])
# 反转x、y轴
bar.reversal_axis()
# 绘图
bar.render("基础柱状图.html")
为了将数字标签全都移到右边,我们可以在其中增加相应的label_opts="right"
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts
# 构建柱状图对象
bar = Bar()
# 添加x轴数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
bar.add_yaxis("GDP",[30, 20, 10],label_opts=LabelOpts(position="right"))
# 反转x、y轴
bar.reversal_axis()
# 绘图
bar.render("基础柱状图.html")
2.基础时间线柱状图
Timeline()——时间线
柱状图描述的是分类数据,回答的是每一个分类中「有多少?」这个问题。这是柱状图的主要特点,同时柱状图很难动态的描述一个趋势性的数据.这里pyecharts.为我们提供了一种解决方案——时间线
如果说一个Bar、Line对象是一张图表的话,时间线就是创建一个一维的x轴,轴上每一个点就是一个图表对象。
创建时间线的代码:
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
bar1.add_yaxis("GDP",[30, 20, 10], label_opts=LabelOpts(position="right"))
bar1.reversal_axis()
bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP",[50, 30, 20], label_opts=LabelOpts(position="right"))
bar2.reversal_axis()
bar3 = Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",[70, 50, 40], label_opts=LabelOpts(position="right"))
bar3.reversal_axis()
# 创建时间线对象
timeline = Timeline()
# timeline对象添加bar柱状图
timeline.add(bar1,"2021年GDP")
timeline.add(bar2,"2022年GDP")
timeline.add(bar3,"2023年GDP")
# 通过时间线绘图
timeline.render("基础柱状图-时间线.html")
下面的时间线可以来回移动,显示2021或者2022的GDP数据。
如果想要添加自动播放功能的话,可以加上下面的设置代码
# 设置自动播放
timeline.add_schema(
play_interval=1000,# 自动播放的时间间隔,单位毫秒
is_timeline_show=True,# 是否在自动播放的时候,显示时间线
is_auto_play=True,# 是否自动播放
is_loop_play=True# 是否循环自动播放
)
加上主题的话,可以再增加,如下是目前该可视化代码的完整版本啦:
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
bar1.add_yaxis("GDP",[30, 20, 10], label_opts=LabelOpts(position="right"))
bar1.reversal_axis()
bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP",[50, 30, 20], label_opts=LabelOpts(position="right"))
bar2.reversal_axis()
bar3 = Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",[70, 50, 40], label_opts=LabelOpts(position="right"))
bar3.reversal_axis()
# 创建时间线对象
timeline = Timeline({"theme":ThemeType.ESSOS})
# timeline对象添加bar柱状图
timeline.add(bar1,"2021年GDP")
timeline.add(bar2,"2022年GDP")
timeline.add(bar3,"2023年GDP")
# 设置自动播放
timeline.add_schema(
play_interval=1000,# 自动播放的时间间隔,单位毫秒
is_timeline_show=True,# 是否在自动播放的时候,显示时间线
is_auto_play=True,# 是否自动播放
is_loop_play=True# 是否循环自动播放
)
# 通过时间线绘图
timeline.render("基础柱状图-时间线.html")
3.GDP动态柱状图绘制
列表的sort方法
在前面我们学习过sorted函数,可以对数据容器进行排序。
在后面的数据处理中,我们需要对列表进行排序,并指定排序规则,sorted函数就无法完成了。
我们补充学习列表的sort方法。
使用方式:
列表.sort(key=选择排序依据的函数, reverse=True|False)
参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
参数reverse,是否反转排序结果,True表示降序,False表示升序
列表的sort方法:
带名函数形式
# 准备列表
my_list = [["a",33],["b",55],["c",11]]
# 排序,基于带名函数
# 定义排序的方法
def choose_sort_key(element):
return element[1]
my_list.sort(key=choose_sort_key, reverse=True)
print(my_list)
[['b', 55], ['a', 33], ['c', 11]]
需求分析:
简单分析后,发现最终效果图中需要:
-
GDP数据处理为亿级
-
有时间轴,按照年份为时间轴的点
-
x轴和y轴反转,同时每一年的数据只要前8名国家
-
有标题,标题的年份会动态更改
-
设置了主题为LIGHT
首先先编一个GDP数据,存储在记事本上,至于是否合理暂且不论,嘿嘿。
"""
演示第三个图表:GDP动态柱状图开发
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
# 读取数据
f = open("C:/Users/asus/Desktop/C2唐祎敏学习笔记/黑马Python/test文件/1960-2019年全球八国GDP数据.txt","r",encoding="UTF-8")
data_lines = f.readlines()
f.close()
data_lines.pop(0)
# 先定义一个字典对象
data_dict = {}
for line in data_lines:
year = int(line.split(",")[0])
country = line.split(",")[1]
gdp = float(line.split(",")[2])
# 判断字典key
try:
data_dict[year].append([country, gdp])
except KeyError:
data_dict[year] = []
data_dict[year].append([country, gdp])
timeline = Timeline({"theme": ThemeType.LIGHT})
sorted_year_list = sorted(data_dict.keys())
# 排序年份
for year in sorted_year_list:
data_dict[year].sort(key=lambda element: element[1], reverse=True)
# 取出本年份前8名国家
year_data = data_dict[year][0:8]
x_data = []
y_data = []
for country_gdp in year_data:
x_data.append(country_gdp[0])
y_data.append(country_gdp[1] / 100000000)
bar = Bar()
bar.add_xaxis(x_data)
bar.add_yaxis("GDP(亿)",y_data,label_opts=LabelOpts(position="right"))
bar.reversal_axis()
# 每一年的标题
bar.set_global_opts(
title_opts=TitleOpts(title=f"{year}年全球前8GDP数据")
)
timeline.add(bar, str(year))
# 时间自动播放
timeline.add_schema(
play_interval=1000,
is_timeline_show=True,
is_auto_play=True,
is_loop_play=False
)
timeline.render("1960~2020全国GDP前8国家.html")
有亿点点夸张,嘿嘿,但是我们确实实现了这个可视化图像
下面是我捏造的数据:
year,GDP,rate 1960,美国,5.433E+11 1960,英国,73233967692 1960,法国,62225478000 1960,中国,59716467625 1960,日本,44307342950 1960,加拿大,40461721692 1960,意大利,40385288344 1960,印度,37029883875 1960,澳大利亚,18577668271 1960,瑞典,15822585033 1960,巴西,15165569912 1960,土耳其,13995067817 1960,墨西哥,13040000000 1960,荷兰,12276734172 1960,西班牙,12072126075 1960,比利时,11658722590 1960,瑞士,9522746719 1960,委内瑞拉,7779090909 1960,南非,7575396972 1960,菲律宾,6684568805 1960,奥地利,6592693841 1960,丹麦,6248946880 1960,新西兰,5485854791 1960,芬兰,5224102195 1960,挪威,5163271598 1960,希腊,4335186016 1960,孟加拉,4274893913 1960,伊朗,4199134390 1960,尼日利亚,4196092258 1960,智利,4110000000 1960,哥伦比亚,4031152976 1960,韩国,3958190758 1960,巴基斯坦,3749265014 1960,刚果(金),3359404117 1960,葡萄牙,3193200404 1960,泰国,2760747471 1960,阿尔及利亚,2723648551 1960,以色列,2598500000 1960,秘鲁,2571908062 1960,摩洛哥,2037150716 1960,爱尔兰,1939329775 1960,马来西亚,1916241996 1960,波多黎各,1691900000 1970,美国,6.433E+11 1970,英国,83233967692 1970,法国,72225478000 1970,中国,69716467625 1970,日本,54307342950 1970,加拿大,50461721692 1970,意大利,50385288344 1970,印度,47029883875 1970,澳大利亚,28577668271 1970,瑞典,25822585033 1970,巴西,35165569912 1970,土耳其,23995067817 1970,墨西哥,23040000000 1970,荷兰,22276734172 1970,西班牙,12072126075 1970,比利时,19658722590 1970,瑞士,10522746719 1970,委内瑞拉,7979090909 1970,南非,8575396972 1970,菲律宾,7684568805 1970,奥地利,7592693841 1970,丹麦,7248946880 1970,新西兰,6485854791 1970,芬兰,6224102195 1970,挪威,6163271598 1970,希腊,5335186016 1970,孟加拉,5274893913 1970,伊朗,5199134390 1970,尼日利亚,5186092258 1970,智利,4100000000 1970,哥伦比亚,4731152976 1970,韩国,4658190758 1970,巴基斯坦,4749265014 1970,刚果(金),4359404117 1970,葡萄牙,4193200404 1970,泰国,3760747471 1970,阿尔及利亚,3723648551 1970,以色列,3598500000 1970,秘鲁,2501908062 1970,摩洛哥,3037150716 1970,爱尔兰,2939329775 1970,马来西亚,2916241996 1970,波多黎各,2691900000 1980,美国,8.433E+11 1980,英国,73233967692 1980,法国,62225478000 1980,中国,2.971E+11 1980,日本,44307342950 1980,加拿大,40461721692 1980,意大利,40385288344 1980,印度,37029883875 1980,澳大利亚,18577668271 1980,瑞典,15822585033 1980,巴西,15165569912 1980,土耳其,13995067817 1980,墨西哥,13040000000 1980,荷兰,12276734172 1980,西班牙,12072126075 1980,比利时,11658722590 1980,瑞士,9522746719 1980,委内瑞拉,7779090909 1980,南非,7575396972 1980,菲律宾,6684568805 1980,奥地利,6592693841 1980,丹麦,6248946880 1980,新西兰,5485854791 1980,芬兰,5224102195 1980,挪威,5163271598 1980,希腊,4335186016 1980,孟加拉,4274893913 1980,伊朗,4199134390 1980,尼日利亚,4196092258 1980,智利,4110000000 1980,哥伦比亚,4031152976 1980,韩国,3958190758 1980,巴基斯坦,3749265014 1980,刚果(金),3359404117 1980,葡萄牙,3193200404 1980,泰国,2760747471 1980,阿尔及利亚,2723648551 1980,以色列,2598500000 1980,秘鲁,2571908062 1980,摩洛哥,2037150716 1980,爱尔兰,1939329775 1980,马来西亚,1916241996 1980,波多黎各,1691900000 1990,美国,1.433E+12 1990,英国,73233967692 1990,法国,62225478000 1990,中国,8.342E+10 1990,日本,44307342950 1990,加拿大,40461721692 1990,意大利,40385288344 1990,印度,37029883875 1990,澳大利亚,18577668271 1990,瑞典,15822585033 1990,巴西,15165569912 1990,土耳其,13995067817 1990,墨西哥,13040000000 1990,荷兰,12276734172 1990,西班牙,12072126075 1990,比利时,11658722590 1990,瑞士,9522746719 1990,委内瑞拉,7779090909 1990,南非,7575396972 1990,菲律宾,6684568805 1990,奥地利,6592693841 1990,丹麦,6248946880 1990,新西兰,5485854791 1990,芬兰,5224102195 1990,挪威,5163271598 1990,希腊,4335186016 1990,孟加拉,4274893913 1990,伊朗,4199134390 1990,尼日利亚,4196092258 1990,智利,4110000000 1990,哥伦比亚,4031152976 1990,韩国,3958190758 1990,巴基斯坦,3749265014 1990,刚果(金),3359404117 1990,葡萄牙,3193200404 1990,泰国,2760747471 1990,阿尔及利亚,2723648551 1990,以色列,2598500000 1990,秘鲁,2571908062 1990,摩洛哥,2037150716 1990,爱尔兰,1939329775 1990,马来西亚,1916241996 1990,波多黎各,1691900000 2000,美国,1.433E+13 2000,英国,73233967692 2000,法国,62225478000 2000,中国,5.971E+12 2000,日本,44307342950 2000,加拿大,40461721692 2000,意大利,40385288344 2000,印度,37029883875 2000,澳大利亚,18577668271 2000,瑞典,15822585033 2000,巴西,15165569912 2000,土耳其,13995067817 2000,墨西哥,13040000000 2000,荷兰,12276734172 2000,西班牙,12072126075 2000,比利时,11658722590 2000,瑞士,9522746719 2000,委内瑞拉,7779090909 2000,南非,7575396972 2000,菲律宾,6684568805 2000,奥地利,6592693841 2000,丹麦,6248946880 2000,新西兰,5485854791 2000,芬兰,5224102195 2000,挪威,5163271598 2000,希腊,4335186016 2000,孟加拉,4274893913 2000,伊朗,4199134390 2000,尼日利亚,4196092258 2000,智利,4110000000 2000,哥伦比亚,4031152976 2000,韩国,3958190758 2000,巴基斯坦,3749265014 2000,刚果(金),3359404117 2000,葡萄牙,3193200404 2000,泰国,2760747471 2000,阿尔及利亚,2723648551 2000,以色列,2598500000 2000,秘鲁,2571908062 2000,摩洛哥,2037150716 2000,爱尔兰,1939329775 2000,马来西亚,1916241996 2000,波多黎各,1691900000 2010,美国,5.433E+14 2010,英国,73233967692 2010,法国,62225478000 2010,中国,1.971E+14 2010,日本,44307342950 2010,加拿大,40461721692 2010,意大利,40385288344 2010,印度,37029883875 2010,澳大利亚,18577668271 2010,瑞典,15822585033 2010,巴西,15165569912 2010,土耳其,13995067817 2010,墨西哥,13040000000 2010,荷兰,12276734172 2010,西班牙,12072126075 2010,比利时,11658722590 2010,瑞士,9522746719 2010,委内瑞拉,7779090909 2010,南非,7575396972 2010,菲律宾,6684568805 2010,奥地利,6592693841 2010,丹麦,6248946880 2010,新西兰,5485854791 2010,芬兰,5224102195 2010,挪威,5163271598 2010,希腊,4335186016 2010,孟加拉,4274893913 2010,伊朗,4199134390 2010,尼日利亚,4196092258 2010,智利,4110000000 2010,哥伦比亚,4031152976 2010,韩国,3958190758 2010,巴基斯坦,3749265014 2010,刚果(金),3359404117 2010,葡萄牙,3193200404 2010,泰国,2760747471 2010,阿尔及利亚,2723648551 2010,以色列,2598500000 2010,秘鲁,2571908062 2010,摩洛哥,2037150716 2010,爱尔兰,1939329775 2010,马来西亚,1916241996 2010,波多黎各,1691900000 2020,美国,5.433E+14 2020,英国,73233967692 2020,法国,62225478000 2020,中国,5.971E+14 2020,日本,44307342950 2020,加拿大,40461721692 2020,意大利,40385288344 2020,印度,37029883875 2020,澳大利亚,18577668271 2020,瑞典,15822585033 2020,巴西,15165569912 2020,土耳其,13995067817 2020,墨西哥,13040000000 2020,荷兰,12276734172 2020,西班牙,12072126075 2020,比利时,11658722590 2020,瑞士,9522746719 2020,委内瑞拉,7779090909 2020,南非,7575396972 2020,菲律宾,6684568805 2020,奥地利,6592693841 2020,丹麦,6248946880 2020,新西兰,5485854791 2020,芬兰,5224102195 2020,挪威,5163271598 2020,希腊,4335186016 2020,孟加拉,4274893913 2020,伊朗,4199134390 2020,尼日利亚,4196092258 2020,智利,4110000000 2020,哥伦比亚,4031152976 2020,韩国,3958190758 2020,巴基斯坦,3749265014 2020,刚果(金),3359404117 2020,葡萄牙,3193200404 2020,泰国,2760747471 2020,阿尔及利亚,2723648551 2020,以色列,2598500000 2020,秘鲁,2571908062 2020,摩洛哥,2037150716 2020,爱尔兰,1939329775 2020,马来西亚,1916241996 2020,波多黎各,1691900000