【Python】pyecharts 数据可视化模块

ゝ一纸荒年。 2024-04-06 10:37 253阅读 0赞

文章目录

    1. pyecharts 模块介绍
    1. pyecharts 模块安装
    1. pyecharts 配置选项
    • 3.1 全局配置选项
    • 3.2 系列配置选项
    1. 基础折线图的构建
    • 4.1 基本使用流程
    • 4.2 实现2020年美印日确诊人数对比折线图
    1. 基础地图构建
    • 5.1 基本使用流程
    • 5.2 实现国内疫情地图
    • 5.3 实现省级疫情地图
    1. 基础柱状图构建
    • 6.1 基本使用流程
    • 6.2 基础时间线柱状图
    • 6.3 实现动态 GDP 柱状图

1. pyecharts 模块介绍

Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

pyecharts 官网:https://pyecharts.org/#/zh-cn/

pyecharts 画廊地址:https://gallery.pyecharts.org/#/README

2. pyecharts 模块安装

  1. 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)\]

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-naXSmtF4-1663534035693)(C:/Users/bbbbbge/Pictures/接单/58749659-3554a000-84bb-11e9-9421-b1905e2f3430.png)\]

示例代码:通过折线图对象对折线图进行全局配置

  1. from pyecharts.charts import Line
  2. from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
  3. # 获取折线图对象
  4. line = Line()
  5. # 对折线图进行全局配置
  6. line.set_global_opts(
  7. # 设置标题、标题的位置...
  8. title_opts=TitleOpts("国家GDP展示", pos_left="center", pos_bottom="1%"),
  9. # 设置图例是展示的...
  10. legend_opts=LegendOpts(is_show=True),
  11. # 设置工具箱是展示的
  12. toolbox_opts=ToolboxOpts(is_show=True),
  13. # 设置视觉映射是展示的
  14. visualmap_opts=VisualMapOpts(is_show=True)
  15. )

3.2 系列配置选项

系列配置选项是针对某个具体的参数进行配置,可以去 pyecharts 官网进行了解。

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lp1TPnlT-1663534035694)(C:/Users/bbbbbge/Pictures/接单/1663533963317.png)\]

4. 基础折线图的构建

4.1 基本使用流程

  1. 导包,导入 Line 功能构建折线图对象

    1. from pyecharts.charts import Line
    2. from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
  2. 获取折线图对象

    1. line = Line()
  3. 添加 x、y 轴数据(添加系列配置)

    1. line.add_xaxis(["中国", "美国", "英国"])
    2. line.add_yaxis("GDP", [30, 20, 10])
  4. 添加全局配置

    1. line.set_global_opts(
    2. # 设置标题、标题的位置...
    3. title_opts=TitleOpts("国家GDP展示", pos_left="center", pos_bottom="1%"),
    4. # 设置图例是展示的...
    5. legend_opts=LegendOpts(is_show=True),
    6. # 设置工具箱是展示的
    7. toolbox_opts=ToolboxOpts(is_show=True),
    8. # 设置视觉映射是展示的
    9. visualmap_opts=VisualMapOpts(is_show=True)
    10. )
  5. 生成图表(通过 render 方法将代码生成图像)

    1. line.render()

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s22QvLcb-1663534035694)(C:/Users/bbbbbge/Pictures/接单/1663442704565.png)\]

4.2 实现2020年美印日确诊人数对比折线图

  1. import json
  2. from pyecharts.charts import Line
  3. # 获取不同国家疫情时间
  4. from pyecharts.options import TitleOpts, LabelOpts
  5. def getdata(file):
  6. # 处理数据
  7. try:
  8. f = open(file, 'r', encoding='utf8')
  9. except FileNotFoundError as e:
  10. print(f"文件不存在,具体错误为:{
  11. e}")
  12. else:
  13. data = f.read()
  14. # JSON 转 Python 字典
  15. dict = json.loads(data)
  16. # 获取 trend
  17. trend_data = dict['data'][0]['trend']
  18. # 获取日期数据,用于 x 轴(只拿2020年的数据)
  19. x_data = trend_data['updateDate'][:314]
  20. # 获取确认数据,用于 y 轴
  21. y_data = trend_data['list'][0]['data'][:314]
  22. # 返回结果
  23. return x_data, y_data
  24. finally:
  25. f.close()
  26. # 获取美国数据
  27. us_x_data, us_y_data = getdata("E:\\折线图数据\\美国.txt")
  28. # 获取印度数据
  29. in_x_data, in_y_data = getdata("E:\\折线图数据\\印度.txt")
  30. # 获取日本数据
  31. jp_x_data, jp_y_data = getdata("E:\\折线图数据\\日本.txt")
  32. # 生成图表
  33. line = Line()
  34. # 添加 x 轴数据(日期,公用数据,不同国家都一样)
  35. line.add_xaxis(us_x_data)
  36. # 添加 y 轴数据(设置 y 轴的系列配置,将标签不显示)
  37. line.add_yaxis("美国确诊人数", us_y_data, label_opts=LabelOpts(is_show=False)) # 添加美国数据
  38. line.add_yaxis("印度确诊人数", in_y_data, label_opts=LabelOpts(is_show=False)) # 添加印度数据
  39. line.add_yaxis("日本确诊人数", jp_y_data, label_opts=LabelOpts(is_show=False)) # 添加日本数据
  40. # 配置全局选项
  41. line.set_global_opts(
  42. # 设置标题
  43. title_opts=TitleOpts("2020年美日印三国确诊人数对比折线图", pos_left="center", pos_bottom="1%"),
  44. )
  45. # 生成图表
  46. line.render()

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTgdFFI9-1663534035696)(C:/Users/bbbbbge/Pictures/接单/1663442822382.png)\]

5. 基础地图构建

5.1 基本使用流程

  1. 导包,导入 Map 功能获取地图对象

    1. from pyecharts.charts import Map
    2. from pyecharts.options import VisualMapOpts
  2. 获取地图对象

    1. map = Map()
  3. 准备好数据

    1. data = [
    2. ("北京", 99),
    3. ("上海", 199),
    4. ("广州", 299),
    5. ("湖南", 199),
    6. ("安徽", 99),
    7. ("湖北", 399),
    8. ]
  4. 添加数据到地图对象中

    1. # 地图名称、传入的数据、地图类型(默认是中国地图)
    2. map,add("地图", data, "china")
  5. 添加全局配置

    1. map.set_global_opts(
    2. # 设置视觉映射配置
    3. visualmap_opts=VisualMapOpts(
    4. # 打开视觉映射(可能不精准,因此可以开启手动校准)
    5. is_show=True,
    6. # 开启手动校准范围
    7. is_piecewise=True,
    8. # 设置要校准参数的具体范围
    9. pieces=[
    10. {
    11. "min": 1, "max": 9, "label": "1~9人", "color": "#CCFFFF"},
    12. {
    13. "min": 10, "max": 99, "label": "10~99人", "color": "#FFFF99"},
    14. {
    15. "min": 100, "max": 199, "label": "100~199人", "color": "#FF9966"},
    16. {
    17. "min": 200, "max": 299, "label": "200~299人", "color": "#FF6666"},
    18. {
    19. "min": 300, "label": "300人以上", "color": "#CC3333"},
    20. ]
    21. )
    22. )
  6. 生成地图

    1. map.render()

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnlFU2Nc-1663534035696)(C:/Users/bbbbbge/Pictures/接单/1663515150579.png)\]

5.2 实现国内疫情地图

  1. import json
  2. from pyecharts.charts import Map
  3. from pyecharts.options import VisualMapOpts, TitleOpts, LegendOpts
  4. # 读取数据
  5. f = open("E:\\地图数据\\疫情.txt", 'r', encoding='utf8')
  6. str_json = f.read()
  7. # 关闭文件
  8. f.close()
  9. # JSON 转 python 字典
  10. data_dict = json.loads(str_json)
  11. # 取到各省数据
  12. province_data_list = data_dict['areaTree'][0]['children']
  13. # 组装每个省份和确诊人数为元组,并封装到列表内
  14. data_list = []
  15. for province_data in province_data_list:
  16. province_name = province_data['name']
  17. province_total_confirm = province_data['total']['confirm']
  18. data_list.append((province_name, province_total_confirm))
  19. # 创建地图对象
  20. map = Map()
  21. # 添加数据
  22. map.add("各省确诊总人数", data_list, "china")
  23. # 设置全局配置,定制分段的视觉映射
  24. map.set_global_opts(
  25. title_opts=TitleOpts('全国疫情地图', pos_left='center', pos_bottom='1%'),
  26. legend_opts=LegendOpts(is_show=True),
  27. visualmap_opts=VisualMapOpts(
  28. is_show=True,
  29. is_piecewise=True,
  30. pieces=[
  31. {
  32. "min": 1, "max": 9, "label": "1~9人", "color": "#CCFFFF"},
  33. {
  34. "min": 10, "max": 99, "label": "10~99人", "color": "#FFFF99"},
  35. {
  36. "min": 100, "max": 499, "label": "100~499人", "color": "#FF9966"},
  37. {
  38. "min": 500, "max": 999, "label": "500~999人", "color": "#FF6666"},
  39. {
  40. "min": 1000, "max": 9999, "label": "1000~9999人", "color": "#CC3333"},
  41. {
  42. "min": 10000, "label": "10000人以上", "color": "#990033"}
  43. ]
  44. )
  45. )
  46. # 绘图
  47. map.render()

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d31aUbR0-1663534035697)(C:/Users/bbbbbge/Pictures/接单/1663517314716.png)\]

5.3 实现省级疫情地图

  1. import json
  2. from pyecharts.charts import Map
  3. from pyecharts.options import VisualMapOpts, TitleOpts, LegendOpts
  4. # 读取数据
  5. f = open("E:\\地图数据\\疫情.txt", 'r', encoding='utf8')
  6. str_json = f.read()
  7. # 关闭文件
  8. f.close()
  9. # JSON 转 python 字典
  10. data_dict = json.loads(str_json)
  11. # 取到河南省数据
  12. city_data_list = data_dict['areaTree'][0]['children'][3]['children']
  13. # 组装每个市和确诊人数为元组,并封装到列表内
  14. data_list = []
  15. for city_data in city_data_list:
  16. city_name = city_data['name'] + "市"
  17. city_total_confirm = city_data['total']['confirm']
  18. data_list.append((city_name, city_total_confirm))
  19. # 创建地图对象
  20. map = Map()
  21. # 添加数据
  22. map.add("各市确诊总人数", data_list, "河南")
  23. # 设置全局配置,定制分段的视觉映射
  24. map.set_global_opts(
  25. title_opts=TitleOpts('河南省疫情地图', pos_left='center', pos_bottom='1%'),
  26. legend_opts=LegendOpts(is_show=True),
  27. visualmap_opts=VisualMapOpts(
  28. is_show=True,
  29. is_piecewise=True,
  30. pieces=[
  31. {
  32. "min": 1, "max": 9, "label": "1~9人", "color": "#CCFFFF"},
  33. {
  34. "min": 10, "max": 99, "label": "10~99人", "color": "#FFFF99"},
  35. {
  36. "min": 100, "max": 499, "label": "100~499人", "color": "#FF9966"},
  37. {
  38. "min": 500, "max": 999, "label": "500~999人", "color": "#FF6666"},
  39. {
  40. "min": 1000, "max": 9999, "label": "1000~9999人", "color": "#CC3333"},
  41. {
  42. "min": 10000, "label": "10000人以上", "color": "#990033"}
  43. ]
  44. )
  45. )
  46. # 绘图
  47. map.render()

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJ5o5iKi-1663534035697)(C:/Users/bbbbbge/Pictures/接单/1663522373596.png)\]

6. 基础柱状图构建

6.1 基本使用流程

  1. 导包,导入 Bar 功能获取地图对象

    1. from pyecharts.charts import Bar
    2. from pyecharts.options import *
  2. 获取地图对象

    1. bar = Bar()
  3. 添加 x 和 y 轴数据

    1. # 添加 x 轴数据
    2. bar.add_xaxis(["中国", "英国", "美国"])
    3. # 添加 y 轴数据
    4. bar.add_yaxis("GDP", [30, 20, 10])
  4. 添加全局配置

    1. bar.set_global_opts(
    2. title_opts=TitleOpts("基础柱状图", pos_left='center', pos_bottom='1%')
    3. )
  5. 生成地图

    1. bar.render()

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vh4Qlrt7-1663534035697)(C:/Users/bbbbbge/Pictures/接单/1663522919082.png)\]

  6. 反转 xy 轴

    1. bar.reversal_axis()

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7BsiESkb-1663534035698)(C:/Users/bbbbbge/Pictures/接单/1663522994666.png)\]

  7. 将数值标签添设置到右侧

    1. bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position='right'))

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fE8QLj2L-1663534035698)(C:/Users/bbbbbge/Pictures/接单/1663523166227.png)\]

6.2 基础时间线柱状图

柱状图描述的是分类数据,但很难动态的描述一个趋势性的数据,为此 pyecharts 中提供了一种解决方案时间线。

如果说一个 Bar、Line 对象是一张图表的话,时间线就是创建一个一维的 x 轴,轴上的每一个点就是一个图表对象。

创建时间线的基础流程:

  1. 导包,导入时间线 Timeline

    1. from pyecharts.charts import Bar, Timeline
    2. from pyecharts.options import *
  2. 准备好图表对象并添加好数据

    1. bar1 = Bar()
    2. bar1.add_xaxis(["中国", "英国", "美国"])
    3. bar1.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position='right'))
    4. bar1.reversal_axis()
    5. bar2 = Bar()
    6. bar2.add_xaxis(["中国", "英国", "美国"])
    7. bar2.add_yaxis("GDP", [50, 20, 30], label_opts=LabelOpts(position='right'))
    8. bar2.reversal_axis()
    9. bar3 = Bar()
    10. bar3.add_xaxis(["中国", "英国", "美国"])
    11. bar3.add_yaxis("GDP", [60, 30, 40], label_opts=LabelOpts(position='right'))
    12. bar3.reversal_axis()
  3. 创建时间线对象 Timeline

    1. timeline = Timeline()
  4. 将图表添加到 Timeline 对象中

    1. # 添加图表到时间线中(图表对象,点名称)
    2. timeline.add(bar1, "2020年GDP")
    3. timeline.add(bar2, "2021年GDP")
    4. timeline.add(bar3, "2022年GDP")
  5. 通过时间线绘图

    1. timeline.render()

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntMHTc1m-1663534035698)(C:/Users/bbbbbge/Pictures/接单/时间线柱状图1.gif)\]

  6. 设置自动播放

    1. timeline.add_schema(
    2. play_interval=1000, # 自动播放的时间间隔,单位毫秒
    3. is_timeline_show=True, # 是否显示自动播放的时候,显示时间线(默认 True)
    4. is_auto_play=True, # 是否在自动播放(默认 False)
    5. is_loop_play=True # 是否循环自动播放(默认 True)
    6. )
  7. 设置时间线主题

    1. # 导入 ThemeType
    2. from pyecharts.globals import ThemeType
    3. # 创建时间线对象时,设置主题参数
    4. timeline = Timeline({
    5. "theme": ThemeType.DARK})

    \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0M3SJqz-1663534035699)(C:/Users/bbbbbge/Pictures/接单/1663525982772.png)\]

    主题参数如下:\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzhRf3Qd-1663534035699)(C:/Users/bbbbbge/Pictures/接单/1663526045006.png)\]

6.3 实现动态 GDP 柱状图

  1. import json
  2. from pyecharts.charts import Bar, Timeline
  3. from pyecharts.options import *
  4. from pyecharts.globals import ThemeType
  5. # 读取数据
  6. f = open("E:\\动态柱状图数据\\1960-2019全球GDP数据.csv", 'r', encoding='GB2312')
  7. data_lines = f.readlines()
  8. # 关闭文件
  9. f.close()
  10. # 删除第一条数据
  11. data_lines.pop(0)
  12. # 将数据转化为字典才能出,格式为 {年份1: [[国家1, GDP], [国家2, GDP]], 年份2: [国家, GDP], ...}
  13. data_dict = dict()
  14. for line in data_lines:
  15. year = int(line.split(',')[0]) # 年份
  16. country = line.split(',')[1] # 国家
  17. gdp = float(line.split(',')[2]) # gdp 数据,通过 float 强制转换可以把带有科学计数法的数字转换为普通数字
  18. try: # 如果 key 不存在,则会抛出异常 KeyError
  19. data_dict[year].append([country, gdp])
  20. except KeyError:
  21. data_dict[year] = [[country, gdp]]
  22. # 排序年份(字典对象的 key 可能是无序的)
  23. sorted_year_list = sorted(data_dict.keys())
  24. # 创建时间线对象
  25. timeline = Timeline({
  26. "theme": ThemeType.LIGHT})
  27. # 组装数据到 Bar 对象中,并添加到 timeline 中
  28. for year in sorted_year_list:
  29. data_dict[year].sort(key=lambda element: element[1], reverse=True)
  30. # 该年份GDP前八的国家
  31. year_data = data_dict[year][:8]
  32. x_data = []
  33. y_data = []
  34. for country_gdp in year_data:
  35. x_data.append(country_gdp[0])
  36. y_data.append(country_gdp[1] / 100000000)
  37. # 创建柱状图
  38. bar = Bar()
  39. x_data.reverse()
  40. y_data.reverse()
  41. # 添加 x y 轴数据
  42. bar.add_xaxis(x_data)
  43. bar.add_yaxis("GDP(亿)", y_data, label_opts=LabelOpts(position='right'))
  44. # 反转 x y 轴
  45. bar.reversal_axis()
  46. # 设置每一年的图表的标题
  47. bar.set_global_opts(
  48. title_opts=TitleOpts(f"{
  49. year}年GDP全球前8国家", pos_left='5%')
  50. )
  51. # 将 bar 对象添加到 timeline 中
  52. timeline.add(bar, year)
  53. # 设置自动播放参数
  54. timeline.add_schema(
  55. play_interval=1000, # 自动播放的时间间隔,单位毫秒
  56. is_timeline_show=True, # 是否显示自动播放的时候,显示时间线(默认 True)
  57. is_auto_play=True, # 是否在自动播放(默认 False)
  58. is_loop_play=True # 是否循环自动播放(默认 True)
  59. )
  60. # 通过时间线绘图
  61. timeline.render("1960~2019全球GDP前8国家.html")

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I42LyjDV-1663534035699)(C:/Users/bbbbbge/Pictures/接单/时间线柱状图2.gif)\]

发表评论

表情:
评论列表 (有 0 条评论,253人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据-总结

    前言 突然要做PPT,但是一般PPT的工具可以做的图标太小了,虽然PPT中的图标展示较少,更多的是流程图、时序图,但是有时候一些优秀的展示方式也可以让我们的PPT更完美,

    相关 数据概览

    一、什么是数据可视化 科学可视化(Scientific Visualization)、 信息可视化(Information Visualization)和可视分析学(Vi