1. pyecharts 模块介绍
Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。
pyecharts 官网:https://pyecharts.org/#/zh-cn/
pyecharts 画廊地址:https://gallery.pyecharts.org/#/README
2. pyecharts 模块安装
pip install pyecharts
3. pyecharts 配置选项
pyecharts 模块中有很多配置选项,常用到两个类别的选项:全局配置选项和系列配置选项。
3.1 全局配置选项
全局配置选项可以通过 set_global_opts 方法来进行配置,通常对图表的一些通用的基础的元素进行配置,例如标题、图例、工具箱、鼠标移动效果等等,它们与图表的类型无关。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wc8Kln7g-1663534035693)(C:/Users/bbbbbge/Pictures/接单/57307650-8a4d0280-7117-11e9-921f-69b8e9c5e4aa.png)]](https://img-blog.csdnimg.cn/83a3ebd3a75b4473b7a4fb9401b3d189.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-naXSmtF4-1663534035693)(C:/Users/bbbbbge/Pictures/接单/58749659-3554a000-84bb-11e9-9421-b1905e2f3430.png)]](https://img-blog.csdnimg.cn/cc4554b3d4bb4fa0b80b7743958646f0.png)
示例代码:通过折线图对象对折线图进行全局配置
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
line = Line()
line.set_global_opts(
title_opts=TitleOpts("国家GDP展示", pos_left="center", pos_bottom="1%"),
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True),
visualmap_opts=VisualMapOpts(is_show=True)
)
3.2 系列配置选项
系列配置选项是针对某个具体的参数进行配置,可以去 pyecharts 官网进行了解。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lp1TPnlT-1663534035694)(C:/Users/bbbbbge/Pictures/接单/1663533963317.png)]](https://img-blog.csdnimg.cn/7da475308abe4424a3e8de7a8803f073.png)
4. 基础折线图的构建
4.1 基本使用流程
-
导包,导入 Line 功能构建折线图对象 from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
-
获取折线图对象 line = Line()
-
添加 x、y 轴数据(添加系列配置) line.add_xaxis(["中国", "美国", "英国"])
line.add_yaxis("GDP", [30, 20, 10])
-
添加全局配置 line.set_global_opts(
title_opts=TitleOpts("国家GDP展示", pos_left="center", pos_bottom="1%"),
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True),
visualmap_opts=VisualMapOpts(is_show=True)
)
-
生成图表(通过 render 方法将代码生成图像) line.render()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s22QvLcb-1663534035694)(C:/Users/bbbbbge/Pictures/接单/1663442704565.png)]](https://img-blog.csdnimg.cn/2216c16d73aa45d7a85129632bdfb847.png)
4.2 实现2020年美印日确诊人数对比折线图
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LabelOpts
def getdata(file):
try:
f = open(file, 'r', encoding='utf8')
except FileNotFoundError as e:
print(f"文件不存在,具体错误为:{e}")
else:
data = f.read()
dict = json.loads(data)
trend_data = dict['data'][0]['trend']
x_data = trend_data['updateDate'][:314]
y_data = trend_data['list'][0]['data'][:314]
return x_data, y_data
finally:
f.close()
us_x_data, us_y_data = getdata("E:\\折线图数据\\美国.txt")
in_x_data, in_y_data = getdata("E:\\折线图数据\\印度.txt")
jp_x_data, jp_y_data = getdata("E:\\折线图数据\\日本.txt")
line = Line()
line.add_xaxis(us_x_data)
line.add_yaxis("美国确诊人数", us_y_data, label_opts=LabelOpts(is_show=False))
line.add_yaxis("印度确诊人数", in_y_data, label_opts=LabelOpts(is_show=False))
line.add_yaxis("日本确诊人数", jp_y_data, label_opts=LabelOpts(is_show=False))
line.set_global_opts(
title_opts=TitleOpts("2020年美日印三国确诊人数对比折线图", pos_left="center", pos_bottom="1%"),
)
line.render()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTgdFFI9-1663534035696)(C:/Users/bbbbbge/Pictures/接单/1663442822382.png)]](https://img-blog.csdnimg.cn/d9054a8fff944d4cb306a1aad07c5388.png)
5. 基础地图构建
5.1 基本使用流程
-
导包,导入 Map 功能获取地图对象 from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
-
获取地图对象 map = Map()
-
准备好数据 data = [
("北京", 99),
("上海", 199),
("广州", 299),
("湖南", 199),
("安徽", 99),
("湖北", 399),
]
-
添加数据到地图对象中
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": "#FFFF99"},
{"min": 100, "max": 199, "label": "100~199人", "color": "#FF9966"},
{"min": 200, "max": 299, "label": "200~299人", "color": "#FF6666"},
{"min": 300, "label": "300人以上", "color": "#CC3333"},
]
)
)
-
生成地图 map.render()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnlFU2Nc-1663534035696)(C:/Users/bbbbbge/Pictures/接单/1663515150579.png)]](https://img-blog.csdnimg.cn/f77a89b4950d463695c2a5242e92f668.png)
5.2 实现国内疫情地图
import json
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts, TitleOpts, LegendOpts
f = open("E:\\地图数据\\疫情.txt", 'r', encoding='utf8')
str_json = f.read()
f.close()
data_dict = json.loads(str_json)
province_data_list = data_dict['areaTree'][0]['children']
data_list = []
for province_data in province_data_list:
province_name = province_data['name']
province_total_confirm = province_data['total']['confirm']
data_list.append((province_name, province_total_confirm))
map = Map()
map.add("各省确诊总人数", data_list, "china")
map.set_global_opts(
title_opts=TitleOpts('全国疫情地图', pos_left='center', pos_bottom='1%'),
legend_opts=LegendOpts(is_show=True),
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": "#FFFF99"},
{"min": 100, "max": 499, "label": "100~499人", "color": "#FF9966"},
{"min": 500, "max": 999, "label": "500~999人", "color": "#FF6666"},
{"min": 1000, "max": 9999, "label": "1000~9999人", "color": "#CC3333"},
{"min": 10000, "label": "10000人以上", "color": "#990033"}
]
)
)
map.render()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d31aUbR0-1663534035697)(C:/Users/bbbbbge/Pictures/接单/1663517314716.png)]](https://img-blog.csdnimg.cn/e23030f053f942878efe8502e2aeb5a8.png)
5.3 实现省级疫情地图
import json
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts, TitleOpts, LegendOpts
f = open("E:\\地图数据\\疫情.txt", 'r', encoding='utf8')
str_json = f.read()
f.close()
data_dict = json.loads(str_json)
city_data_list = data_dict['areaTree'][0]['children'][3]['children']
data_list = []
for city_data in city_data_list:
city_name = city_data['name'] + "市"
city_total_confirm = city_data['total']['confirm']
data_list.append((city_name, city_total_confirm))
map = Map()
map.add("各市确诊总人数", data_list, "河南")
map.set_global_opts(
title_opts=TitleOpts('河南省疫情地图', pos_left='center', pos_bottom='1%'),
legend_opts=LegendOpts(is_show=True),
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": "#FFFF99"},
{"min": 100, "max": 499, "label": "100~499人", "color": "#FF9966"},
{"min": 500, "max": 999, "label": "500~999人", "color": "#FF6666"},
{"min": 1000, "max": 9999, "label": "1000~9999人", "color": "#CC3333"},
{"min": 10000, "label": "10000人以上", "color": "#990033"}
]
)
)
map.render()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJ5o5iKi-1663534035697)(C:/Users/bbbbbge/Pictures/接单/1663522373596.png)]](https://img-blog.csdnimg.cn/d6a581245eee44b5bea4133ff18a4ec7.png)
6. 基础柱状图构建
6.1 基本使用流程
-
导包,导入 Bar 功能获取地图对象 from pyecharts.charts import Bar
from pyecharts.options import *
-
获取地图对象 bar = Bar()
-
添加 x 和 y 轴数据
bar.add_xaxis(["中国", "英国", "美国"])
bar.add_yaxis("GDP", [30, 20, 10])
-
添加全局配置 bar.set_global_opts(
title_opts=TitleOpts("基础柱状图", pos_left='center', pos_bottom='1%')
)
-
生成地图 bar.render()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vh4Qlrt7-1663534035697)(C:/Users/bbbbbge/Pictures/接单/1663522919082.png)]](https://img-blog.csdnimg.cn/1a9d209724d0412d92989df7bdc32ad3.png) -
反转 xy 轴 bar.reversal_axis()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7BsiESkb-1663534035698)(C:/Users/bbbbbge/Pictures/接单/1663522994666.png)]](https://img-blog.csdnimg.cn/65339aa3ed1c4129ad1e68ebaa4ab7e0.png) -
将数值标签添设置到右侧 bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position='right'))
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fE8QLj2L-1663534035698)(C:/Users/bbbbbge/Pictures/接单/1663523166227.png)]](https://img-blog.csdnimg.cn/a50bf833e97f473889f72cf12c476b6a.png)
6.2 基础时间线柱状图
柱状图描述的是分类数据,但很难动态的描述一个趋势性的数据,为此 pyecharts 中提供了一种解决方案时间线。
如果说一个 Bar、Line 对象是一张图表的话,时间线就是创建一个一维的 x 轴,轴上的每一个点就是一个图表对象。
创建时间线的基础流程:
-
导包,导入时间线 Timeline 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, 20, 30], label_opts=LabelOpts(position='right'))
bar2.reversal_axis()
bar3 = Bar()
bar3.add_xaxis(["中国", "英国", "美国"])
bar3.add_yaxis("GDP", [60, 30, 40], label_opts=LabelOpts(position='right'))
bar3.reversal_axis()
-
创建时间线对象 Timeline timeline = Timeline()
-
将图表添加到 Timeline 对象中
timeline.add(bar1, "2020年GDP")
timeline.add(bar2, "2021年GDP")
timeline.add(bar3, "2022年GDP")
-
通过时间线绘图 timeline.render()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntMHTc1m-1663534035698)(C:/Users/bbbbbge/Pictures/接单/时间线柱状图1.gif)]](https://img-blog.csdnimg.cn/f6414ece1be94d2989dcf885b88d84ff.gif) -
设置自动播放 timeline.add_schema(
play_interval=1000,
is_timeline_show=True,
is_auto_play=True,
is_loop_play=True
)
-
设置时间线主题
from pyecharts.globals import ThemeType
timeline = Timeline({"theme": ThemeType.DARK})
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0M3SJqz-1663534035699)(C:/Users/bbbbbge/Pictures/接单/1663525982772.png)]](https://img-blog.csdnimg.cn/16f9b0e456c34c738ba06d9d23629455.png) 主题参数如下:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzhRf3Qd-1663534035699)(C:/Users/bbbbbge/Pictures/接单/1663526045006.png)]](https://img-blog.csdnimg.cn/117db36600524286bcb49873c235388f.png)
6.3 实现动态 GDP 柱状图
import json
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
f = open("E:\\动态柱状图数据\\1960-2019全球GDP数据.csv", 'r', encoding='GB2312')
data_lines = f.readlines()
f.close()
data_lines.pop(0)
data_dict = dict()
for line in data_lines:
year = int(line.split(',')[0])
country = line.split(',')[1]
gdp = float(line.split(',')[2])
try:
data_dict[year].append([country, gdp])
except KeyError:
data_dict[year] = [[country, gdp]]
sorted_year_list = sorted(data_dict.keys())
timeline = Timeline({"theme": ThemeType.LIGHT})
for year in sorted_year_list:
data_dict[year].sort(key=lambda element: element[1], reverse=True)
year_data = data_dict[year][: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()
x_data.reverse()
y_data.reverse()
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(f"{year}年GDP全球前8国家", pos_left='5%')
)
timeline.add(bar, year)
timeline.add_schema(
play_interval=1000,
is_timeline_show=True,
is_auto_play=True,
is_loop_play=True
)
timeline.render("1960~2019全球GDP前8国家.html")
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I42LyjDV-1663534035699)(C:/Users/bbbbbge/Pictures/接单/时间线柱状图2.gif)]](https://img-blog.csdnimg.cn/32edd1100c76445db773971026a895b9.gif)
|