Pyecharts

一、什么是pyecharts?

pyecharts是为了让Python能够能够更好地实现数据可视化而开发的工具。因为Python十分有利于处理数据,ECharts是一款很优秀的数据可视化的开源工具,两者相结合就诞生了pyecharts(pyecharts堪称数据可视化神器)。

pyecharts官网:https://pyecharts.org/#/

pyecharts画廊:https://gallery.pyecharts.org/#/(该网站含有大量pyecharts的应用示例)

二、什么是Echarts?

ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。

三、pyecharts安装和图表类型

3.1.使用指令安装

pip install pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2.图表类型

在pyecharts中,根据图表的调用方法、数据源格式的不一样,可大致分为以下几类:

  • 直角坐标系图表:如折线图、柱状图、散点图、箱形图、热力图、K线图等;
  • 地理坐标系图表:如Geo(地理坐标图)、Map(区域地图)、BMap(百度地图)等;
  • 树型图表:如树图、矩形树图等;
  • 3D图表:如3D柱状图、3D折线图、3D曲面图等;
  • 组合图表:如时间线轮播多图、顺序多图、并行多图等;
  • 其他图表:如日历图、漏斗图、仪表盘、饼图、极坐标图、雷达图、旭日图、词云等;

用户自定义的图表:

  • Grid 类:并行显示多张图
  • Overlap 类:结合不同类型图表叠加画在同张图上
  • Page 类:同一网页按顺序展示多图
  • Timeline 类:提供时间线轮播多张图

四、实例

4.1.快速入门

4.1.1.绘制一个折线图:

from pyecharts.charts import Line

# 创建折线图对象
line = Line()

# 添加x轴数据
line.add_xaxis(['张三', '李四', '王五', '赵六'])
# 添加y轴数据
line.add_yaxis('分数', [66, 34, 89, 90])
# 生成图表
line.render()

会运行render.html文件,打开如下:

4.1.2.pyecharts相关配置属性

pyecharts模块中有很多的配置选项,常用到2个类别的选项:全局配置选项和系列配置选项

1.全局配置

全局配置选项可以通过set_global_opts方法来进行配置,局配置选项用于设置整个图表的总体属性和样式,通常包括图表的标题、工具箱、图例、网格、轴线等。这些配置选项适用于整个图表,而不仅仅是某一个系列的数据。常见的全局配置选项包括:

  • title: 设置图表的标题。
  • toolbox: 设置工具箱,可以包含导出、缩放等功能。
  • legend: 设置图例。
  • grid: 设置网格位置和样式。
  • xAxis: 设置x轴属性。
  • yAxis: 设置y轴属性。
  • tooltip: 设置提示框样式和显示内容。
  • backgroundColor: 设置图表的背景颜色。

from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts

# 创建折线图对象
line = Line()

# 添加x轴数据
line.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
# # 添加y轴数据
line.add_yaxis("商家A", [5, 20, 36, 10, 75, 90, 80])
line.add_yaxis("商家B", [15, 6, 45, 20, 35, 66, 60])

# 设置全局配置
line.set_global_opts(
    # 设置标题
    title_opts=TitleOpts(title='学生成绩', pos_left='center', pos_right='center', pos_bottom='0%'),
    # 是否展示图例(默认为True)
    legend_opts=LegendOpts(is_show=True),
    # 是否展示工具箱
    toolbox_opts=ToolboxOpts(is_show=True),
    # 是否展示色卡(默认是没有该属性,一旦设置了该属性,无论是否取值都会展示不同颜色)
    visualmap_opts=VisualMapOpts(is_show=True)
)

# 生成图表
line.render()

详情请参考pyecharts官网,查看效果如下:

2.系列配置选项

系列配置选项用于设置每个系列(如折线图中的一条折线,柱状图中的一组柱子)的属性和样式。系列配置选项可以细化到每个数据点,设置颜色、标签、线条样式等。常见的系列配置选项包括:

  • label: 设置系列数据的标签显示和样式。
  • itemStyle: 设置系列数据的颜色和样式。
  • lineStyle: 设置线条样式(针对折线图)。
  • areaStyle: 设置区域样式(针对面积图)。
  • markPoint: 设置标记点。
  • markLine: 设置标记线。
  • smooth: 设置曲线是否平滑(针对折线图)。
# 导入 Line 类用于创建折线图,导入 options 模块用于设置图表选项
from pyecharts.charts import Line
from pyecharts import options as opts

# 创建一个 Line 图表对象
line = Line()

# 添加 x 轴数据,表示月份
line.add_xaxis(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"])

# 添加 y 轴数据系列 "最高气温"
line.add_yaxis(
    "最高气温",  # 系列名称
    [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],  # 数据
    label_opts=opts.LabelOpts(is_show=False),  # 隐藏数据点标签
    itemstyle_opts=opts.ItemStyleOpts(color="red")  # 设置数据点颜色为红色
)

# 添加 y 轴数据系列 "最低气温"
line.add_yaxis(
    "最低气温",  # 系列名称
    [1.6, 2.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],  # 数据
    label_opts=opts.LabelOpts(is_show=False),  # 隐藏数据点标签
    itemstyle_opts=opts.ItemStyleOpts(color="blue"),  # 设置数据点颜色为蓝色
    linestyle_opts=opts.LineStyleOpts(width=2, type_="dashed")  # 设置线条样式为虚线,宽度为2
)

# 设置全局配置选项
line.set_global_opts(
    title_opts=opts.TitleOpts(title="某地气温变化"),  # 设置图表标题
    tooltip_opts=opts.TooltipOpts(trigger="axis")  # 设置提示框,当鼠标悬停在数据点上时显示
)

# 渲染图表并生成 HTML 文件
line.render("line_chart.html")

4.2.柱状图-Bar

静态柱状图

# 导入 Bar 类用于创建柱状图,导入 options 模块用于设置图表选项
from pyecharts.charts import Bar
from pyecharts import options as opts

# 创建一个 Bar 图表对象
bar = Bar()

# 设置全局选项,添加图表标题
bar.set_global_opts(title_opts=opts.TitleOpts('柱状图'))

# 定义 x 轴数据,表示月份
attr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

# 添加 x 轴数据到图表中
bar.add_xaxis(attr)

# 定义 y 轴数据系列 v1 和 v2,分别表示蒸发量和降水量
v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.8, 48.7, 18.8, 6.0, 2.3]

# 添加 y 轴数据系列 "蒸发量",并设置标记线和标记点
bar.add_yaxis(
    "蒸发量",  # 系列名称
    v1,  # 数据
    markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average', name='平均值')]),  # 添加平均值的标记线
    markpoint_opts=opts.MarkPointOpts(data=[  # 添加最大值和最小值的标记点
        opts.MarkPointItem(type_='max', name='最大值'), 
        opts.MarkPointItem(type_='min', name='最小值')
    ])
)

# 添加 y 轴数据系列 "降水量",并设置标记线和标记点
bar.add_yaxis(
    "降水量",  # 系列名称
    v2,  # 数据
    markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average', name='平均值')]),  # 添加平均值的标记线
    markpoint_opts=opts.MarkPointOpts(data=[  # 添加最大值和最小值的标记点
        opts.MarkPointItem(type_='max', name='最大值'), 
        opts.MarkPointItem(type_='min', name='最小值')
    ])
)

# bar.reversal_axis() # x 轴和 y 轴交换,未启用

# 渲染图表并生成 HTML 文件
bar.render("a.html")

# os.system("a.html")  # 运行生成的 HTML 文件,未启用

可以反转X轴和Y轴,添加代码如下:

bar.reversal_axis() # x 轴和 y 轴交换

时间柱状图

# Bar 用于创建柱状图。
# Timeline 用于创建带有时间轴的图表。
# options 用于设置图表的各种选项。
from pyecharts.charts import Bar, Timeline
from pyecharts import options as opts

# 定义数据,使用字典保存每年的数据,每个年份对应一个包含城市名称和空气质量指数的列表
data = {
    "2020": [("北京", 120), ("上海", 150), ("广州", 130), ("深圳", 140), ("成都", 160)],
    "2021": [("北京", 130), ("上海", 160), ("广州", 135), ("深圳", 145), ("成都", 165)],
    "2022": [("北京", 140), ("上海", 170), ("广州", 140), ("深圳", 150), ("成都", 170)],
}

# 创建时间轴(初始化一个 Timeline 对象,设置图表宽度和高度。)
timeline = Timeline(init_opts=opts.InitOpts(width="1200px", height="600px"))

# 为每一年创建一个 Bar 图表,并添加到时间轴中
# 遍历数据字典,为每一年创建一个 Bar 图表。
for year, values in data.items():
    bar = (
        Bar()
        .add_xaxis([item[0] for item in values]) # add_xaxis 用于设置 X 轴数据(城市名称)。
        .add_yaxis("空气质量指数", [item[1] for item in values]) # add_yaxis 用于设置 Y 轴数据(空气质量指数)。
        .set_global_opts( # set_global_opts 用于设置全局选项,如标题、X 轴和 Y 轴名称。
            title_opts=opts.TitleOpts(title=f"{year} 年主要城市空气质量指数"),
            yaxis_opts=opts.AxisOpts(name="AQI"),
            xaxis_opts=opts.AxisOpts(name="城市"),
        )
    )
    # timeline.add 将每个 Bar 图表添加到时间轴中,并设置时间点。
    timeline.add(bar, time_point=year)

# 渲染图表
timeline.render('bar_timeline.html')

4.2.饼图-Pie

1.普通饼图

# 导入 Pie 类用于创建饼图,导入 options 模块用于设置图表选项
from pyecharts.charts import Pie
from pyecharts import options as opts

# 创建一个 Pie 图表对象
pie = Pie()

# 设置全局选项
pie.set_global_opts(
    # 设置图例选项
    legend_opts=opts.LegendOpts(
        pos_bottom='bottom'  # 图例显示在底部
    ),
    # 设置标题选项
    title_opts=opts.TitleOpts(
        title='饼图',  # 设置标题内容为 "饼图"
        pos_left='center',  # 标题居中显示
        pos_right='center',  # 标题居中显示(与 pos_left 共同作用)
        title_textstyle_opts=opts.TextStyleOpts(
            font_size=40  # 设置标题文字大小为 40
        )
    )
)

# 定义饼图的标签和数据
attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]  # 饼图的标签
v1 = [11, 12, 13, 10, 10, 10]  # 饼图的数据

# 添加数据到饼图中
pie.add(
    '',  # 系列名称为空字符串
    [list(z) for z in zip(attr, v1)],  # 将标签和数据组合成 (标签, 数据) 的形式
    label_opts=opts.LabelOpts(
        is_show=True,  # 显示数据标签
        formatter='{b}: {d}%'  # 设置标签格式为 '标签: 数据百分比'  {b} 表示标签名称,{d}% 表示数据的百分比
    )
)

# 渲染图表并生成 HTML 文件
pie.render('c.html')

2.南丁格尔玫瑰图

# 导入 Pie 类用于创建饼图,导入 options 模块用于设置图表选项
from pyecharts.charts import Pie
from pyecharts import options as opts

# 定义饼图的标签和数据
attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]  # 饼图的标签,表示不同类别
v1 = [11, 12, 13, 10, 10, 10]  # 商品A的数据,表示每个类别的数量或比例
v2 = [19, 21, 32, 20, 20, 33]  # 商品B的数据,表示每个类别的数量或比例

# 创建一个 Pie 图表对象,并设置初始化选项
pie = Pie(init_opts=opts.InitOpts(width="100%"))  # 设置图表的宽度为 100%(填满容器宽度)

# 设置全局选项
pie.set_global_opts(
    # 设置图例选项
    legend_opts=opts.LegendOpts(
        pos_bottom='bottom'  # 图例显示在底部
    ),
    # 设置标题选项
    title_opts=opts.TitleOpts(
        title="玫瑰图",  # 设置标题内容为 "玫瑰图"
        pos_left="center",  # 标题水平居中显示
        pos_bottom="center",  # 标题垂直居中显示
        title_textstyle_opts=opts.TextStyleOpts(
            font_size=40  # 设置标题文字大小为 40
        )
    )
)

# 向饼图中添加商品A的数据
pie.add(
    "商品A",  # 系列名称为 "商品A"
    [list(z) for z in zip(attr, v1)],  # 将标签和数据组合成 (标签, 数据) 的形式,形成饼图的数据项
    center=['25%', '50%'],  # 饼图的中心位置设置为水平偏左,垂直居中
    radius=['30%', '50%'],  # 饼图的半径范围,内半径 30%,外半径 50%
    rosetype='radius'  # 使用半径方式显示玫瑰图,半径表示不同数据项的大小
)

# 向饼图中添加商品B的数据
pie.add(
    "商品B",  # 系列名称为 "商品B"
    [list(z) for z in zip(attr, v2)],  # 将标签和数据组合成 (标签, 数据) 的形式,形成饼图的数据项
    center=['75%', '50%'],  # 饼图的中心位置设置为水平偏右,垂直居中
    radius=['30%', '50%'],  # 饼图的半径范围,内半径 30%,外半径 50%
    rosetype='area',  # 使用面积方式显示玫瑰图,面积表示不同数据项的大小
    label_opts=opts.LabelOpts(
        is_show=True,  # 显示数据标签
        formatter='{b}: {d}%'  # 设置标签格式为 '标签: 数据百分比',其中 {b} 表示标签名称,{d}% 表示数据的百分比
    )
)

# 生成 HTML 文件
pie.render("p.html")  # 渲染图表并生成名为 "p.html" 的 HTML 文件

 

4.3.折线图-Line

# 导入 Line 类用于创建折线图,导入 options 模块用于设置图表选项
from pyecharts.charts import Line
from pyecharts import options as opts

# 定义横坐标的标签(即月份)
attr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

# 定义两个数据系列的数据点(降水量和蒸发量)
v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.8, 48.7, 18.8, 6.0, 2.3]

# 创建 Line 对象实例
line = Line()

# 设置全局配置项,包括标题和 y 轴配置
line.set_global_opts(
    title_opts=opts.TitleOpts(title="折线图", subtitle="年降水量和蒸发量"),
    yaxis_opts=opts.AxisOpts(type_="value",  # opts.AxisOpts: 用于设置坐标轴的属性。type_="value": 表示 y 轴的类型为数值轴。
                             splitline_opts=opts.SplitLineOpts(is_show=True)  # 用于设置 y 轴的分隔线显示属性,这里设置为显示分隔线。
    )
)

# 添加横坐标数据(月份)
line.add_xaxis(attr)

# 添加第一个数据系列(降水量),并显示数据标签
line.add_yaxis("降水量", v1, label_opts=opts.LabelOpts(is_show=True))

# 添加第二个数据系列(蒸发量),并显示数据标签
line.add_yaxis("蒸发量", v2, label_opts=opts.LabelOpts(is_show=True))

# 渲染图表,生成 HTML 文件并在浏览器中查看
line.render()

4.4.散点图

# 导入 Scatter 类用于创建散点图,导入 options 模块用于设置图表选项
from pyecharts.charts import Scatter
from pyecharts import options as opts

# 定义两个数据系列的数据点(降水量和蒸发量)
v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.8, 48.7, 18.8, 6.0, 2.3]

# 创建 Scatter 对象实例,表示散点图
scatter = Scatter()

# 设置全局配置项,包括标题、x轴和y轴配置
scatter.set_global_opts(
    title_opts=opts.TitleOpts(title='散点图'),  # 设置图表标题
    yaxis_opts=opts.AxisOpts(
        type_='value',  # y轴类型为数值轴
        name='蒸发量',  # y轴名称
        splitline_opts=opts.SplitLineOpts(is_show=True)  # 显示y轴的分隔线
    ),
    xaxis_opts=opts.AxisOpts(
        type_='value',  # x轴类型为数值轴
        name='降水量',  # x轴名称
        splitline_opts=opts.SplitLineOpts(is_show=True)  # 显示x轴的分隔线
    )
)

# 添加 x 轴数据(降水量)
scatter.add_xaxis(v1)

# 添加 y 轴数据(蒸发量),并设置数据系列名称
scatter.add_yaxis("降水量与蒸发量的散点分布", v2)

# 渲染图表,将生成的图表保存为 HTML 文件
scatter.render()

4.5.仪表盘

# 导入 Gauge 类用于创建仪表盘,导入 options 模块用于设置图表选项
from pyecharts.charts import Gauge
from pyecharts import options as opts

# 创建一个 Gauge 对象实例,表示仪表盘图表
gauge = Gauge()

# 设置全局配置项,包括标题
gauge.set_global_opts(
    title_opts=opts.TitleOpts(title="仪表盘")  # 设置图表的主标题
)

# 添加数据系列,绘制仪表盘的数值
# '业务指标' 是数据系列的名称
# [('完成率', 30)] 表示在仪表盘上显示一个数据点,标签为 '完成率',数值为 30
gauge.add('业务指标', [('完成率', 30)])

# 渲染图表,将生成的图表保存为 HTML 文件
gauge.render()

4.6.词云图-WordCloud

# 导入 WordCloud 类用于创建词云图,导入 options 模块用于设置图表选项
import os

from pyecharts.charts import WordCloud
from pyecharts import options as opts

# 定义词云图中的词汇及其频率
name = [
    'Sam S Club', 'Macys', 'Amy Schumer', 'Jurassic World', 'Charter Communications',
    'Chick Fil A', 'Planet Fitness', 'Pitch Perfect', 'Express', 'Home', 'Johnny Depp',
    'Lena Dunham', 'Lewis Hamilton', 'KXAN', 'Mary Ellen Mark', 'Farrah Abraham',
    'Rita Ora', 'Serena Williams', 'NCAA baseball tournament', 'Point Break'
]

value = [
    10000, 6181, 4386, 4055, 2467, 2244, 1898, 1484, 1112, 965, 847, 582, 555,
    550, 462, 366, 360, 282, 273, 265
]

# 创建 WordCloud 对象,设置初始化选项
wordcloud = WordCloud(init_opts=opts.InitOpts(width='1300px', height='620px'))

# 添加数据到词云图中
# 将 name 和 value 列表组合成一个包含词汇和对应频率的元组列表
wordcloud.add(
    '',  # 传入的图表标题为空字符串,表示不设置标题
    [list(z) for z in zip(name, value)],  # 使用 zip 将 name 和 value 列表配对,生成词汇和频率的列表
    word_size_range=[20, 100],  # 设置词汇大小的范围
    shape='diamond'  # 设置词云的形状为钻石形状,shape词云图轮廓,有'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star'可选
)

# 渲染词云图并生成 HTML 文件
wordcloud.render()
os.system("render.html")

4.7.地理坐标系-Geo

Pyecharts 的 Geo 图表实际上会自动解析城市名称并绘制在地图上。Geo 仍然适用于展示点状分布的数据,特别是当你有具体的地理坐标时。Geo(地理坐标图):

  • 功能: Geo 主要用于展示地理坐标点及其对应的数据。
  • 应用场景: 适用于需要展示具体地理位置数据的情况,如城市、景点的分布和数据。
  • 特点: 强调地理位置点及其数据,更适合用于展示点状分布的数据。
from pyecharts.charts import Geo
from pyecharts import options as opts

# 导入Geo模块,用于创建地理坐标图。
# 导入options模块,用于设置图表的各种选项。

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)]

# 创建一个Geo对象,并设置初始化选项
# init_opts参数用于设置图表的初始化选项
# width和height设置图表的宽度和高度
# bg_color设置图表背景颜色为#404a59
geo = Geo(init_opts=opts.InitOpts(width='1200px', height='600px', bg_color='#404a59'))

# 设置全局选项
# title_opts用于设置图表标题选项
# pos_left设置标题位置为居中
# title设置主标题为“全国主要空气”
# subtitle设置副标题为“data from pm2.5”
# title_textstyle_opts设置标题的文本样式选项,这里设置文字颜色为白色
# visualmap_opts用于设置视觉映射组件选项
# range_size设置数值范围的最小值和最大值为0到200
# textstyle_opts设置文本样式选项,这里设置文字颜色为白色
geo.set_global_opts(
    title_opts=opts.TitleOpts(pos_left='center', title='全国主要空气', subtitle="data from pm2.5", title_textstyle_opts=opts.TextStyleOpts("#ffffff")),
    visualmap_opts=opts.VisualMapOpts(range_size=[0, 200], textstyle_opts=opts.TextStyleOpts("#ffffff"))
)

# 添加地理坐标系配置
# maptype设置地图类型为中国地图
# itemstyle_opts设置地图区域样式选项
# color设置地图区域颜色为#28527a
# border_color设置地图区域边界颜色为#9ba4b4
geo.add_schema(maptype='china', itemstyle_opts=opts.ItemStyleOpts(color='#28527a', border_color='#9ba4b4'))

# 向图表中添加数据
# 第一个参数为空字符串,表示不设置系列名称
# data参数传入之前定义的数据列表
# symbol_size设置图表中标记的大小为15
# label_opts设置标签选项,这里设置不显示标签
geo.add("", data, symbol_size=15, label_opts=opts.LabelOpts(is_show=False))

geo.render('demo111.html')
# 将图表渲染为HTML文件,并保存为demo111.html

4.8.Map地图

Map(地图)

  • 功能: Map 主要用于展示区域(如省、市、县等)和对应的数据。
  • 应用场景: 适用于需要展示各区域数据的情况,如各省市的GDP、人口、PM2.5数据等。
  • 特点: 更加注重区域间的数据对比和可视化。
# 从 pyecharts.charts 模块中导入 Map 类,用于绘制地图
from pyecharts.charts import Map

# 从 pyecharts 模块中导入 options 并将其重命名为 opts,用于设置各种图表选项
import pyecharts.options as opts

# 定义一个包含各省市名称和相应数据的列表,数据格式为 (省市名称, 数值)
data = [
    ('北京市', 12.54), ('天津市', 13.02), ('河北省', 13.0), ('山西省', 11.53), ('辽宁省', 15.43),
    ('吉林省', 13.21), ('黑龙江省', 13.03), ('上海市', 15.07), ('江苏省', 15.99), ('浙江省', 13.89),
    ('安徽省', 15.01), ('福建省', 11.42), ('江西省', 11.44), ('山东省', 14.75), ('河南省', 12.73),
    ('湖北省', 13.93), ('湖南省', 14.54), ('广东省', 9.73), ('广西省', 13.12), ('海南省', 11.33),
    ('重庆市', 17.42), ('四川省', 16.3), ('贵州省', 12.84), ('云南省', 11.06), ('陕西省', 12.85),
    ('甘肃省', 12.44), ('青海省', 9.45)
]

# 创建一个 Map 对象,并设置初始选项
# init_opts 参数指定图表的初始化配置选项,这里设置宽度为 1200 像素,高度为 600 像素
map = Map(init_opts=opts.InitOpts(width="1200px", height="600px"))

# 设置全局选项
# title_opts 参数设置标题选项,指定图表的主标题为 "全国地图示例"
# visualmap_opts 参数设置视觉映射选项,指定视觉映射的最大值为 50
map.set_global_opts(
    title_opts=opts.TitleOpts(title="全国地图示例"),
    visualmap_opts=opts.VisualMapOpts(max_=50)
)

# 向地图中添加数据
# 第一个参数为空字符串,表示没有系列名称
# 第二个参数为数据列表,即 data
# maptype 参数指定地图的类型为 "china"
# label_opts 参数设置标签选项,这里设置 is_show=False 表示不显示标签
map.add("", data, maptype="china", label_opts=opts.LabelOpts(is_show=False))

# 渲染地图并生成 HTML 文件
map.render()

五、页面组件 Page(顺序多图,将多个图将汇总到一个页面)

学习了pyecharts绘制的图形后,总想着,如果能将所有图片集中到一个页面就好了,这样就可以对不同的情况进行同时交互展示,pyecharts 中的 页面组件 Page 很好的解决的这个问题,能够将许多张图片,放在一起形成可视化看板。

5.1.简单布局

pyechartsPage 组件中,layout 属性用于控制页面布局。SimplePageLayoutDraggablePageLayout 是两种常见的布局选项:

  • SimplePageLayout:这是 pyecharts 的一个简单布局方式,图表按照添加顺序从上到下排列,从左到右布局到页面,没有额外的布局控制。
  • DraggablePageLayout:这是一个更高级的布局方式,允许用户在浏览器中拖拽图表,动态调整图表的位置。

案例代码:

# 导入要使用的模块
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line, Liquid, Page, Pie
from pyecharts.components import Table
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType


# 将每个图 封装到 函数

# 1.条形图
def bar_datazoom_slider() -> Bar:
    c = (

        Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
        .add_xaxis(Faker.days_attrs)
        .add_yaxis("商家A", Faker.days_values)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"),
            datazoom_opts=[opts.DataZoomOpts()],
        )
    )
    return c


# 2.带标记点的折线图
def line_markpoint() -> Line:
    c = (
        Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))

        .add_xaxis(Faker.choose())
        .add_yaxis(
            "商家A",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),
        )
        .add_yaxis(
            "商家B",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="Line-MarkPoint"))
    )
    return c


# 3.玫瑰型饼图
def pie_rosetype() -> Pie:
    v = Faker.choose()
    c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))

        .add(
            "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["25%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(is_show=False),
        )

        .add(
            "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["75%", "50%"],
            rosetype="area",
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰图示例"))
    )
    return c


# 4.表格
def table_base() -> Table:
    table = Table()

    headers = ["City name", "Area", "Population", "Annual Rainfall"]
    rows = [
        ["Brisbane", 5905, 1857594, 1146.4],
        ["Adelaide", 1295, 1158259, 600.5],
        ["Darwin", 112, 120900, 1714.7],
        ["Hobart", 1357, 205556, 619.5],
        ["Sydney", 2058, 4336374, 1214.8],
        ["Melbourne", 1566, 3806092, 646.9],
        ["Perth", 5386, 1554769, 869.4],
    ]
    table.add(headers, rows).set_global_opts(
        title_opts=opts.ComponentTitleOpts(title="Table")
    )
    return table

def page_simple_layout():
    """
    页面组件 Page,将多个图表加载到同一个页面
    :return: 
    """
    #    page = Page()   默认布局
    page = Page(layout=Page.SimplePageLayout)  # 简单布局
    # 将上面定义好的图添加到 page
    page.add(
        bar_datazoom_slider(),
        line_markpoint(),
        pie_rosetype(),
        table_base(),
    )
    page.render("page_simple_layout.html")

if __name__ == "__main__":
    page_simple_layout()

5.2.可拖动布局

在 pyecharts 的 Page 组件中,layout 属性用于控制页面布局。DraggablePageLayout允许用户在浏览器中拖拽图表,动态调整图表的位置。

# 导入要使用的模块
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line, Liquid, Page, Pie
from pyecharts.components import Table
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType


# 将每个图 封装到 函数

# 1.条形图
def bar_datazoom_slider() -> Bar:
    c = (

        Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
        .add_xaxis(Faker.days_attrs)
        .add_yaxis("商家A", Faker.days_values)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"),
            datazoom_opts=[opts.DataZoomOpts()],
        )
    )
    return c


# 2.带标记点的折线图
def line_markpoint() -> Line:
    c = (
        Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))

        .add_xaxis(Faker.choose())
        .add_yaxis(
            "商家A",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),
        )
        .add_yaxis(
            "商家B",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="Line-MarkPoint"))
    )
    return c


# 3.玫瑰型饼图
def pie_rosetype() -> Pie:
    v = Faker.choose()
    c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))

        .add(
            "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["25%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(is_show=False),
        )

        .add(
            "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["75%", "50%"],
            rosetype="area",
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰图示例"))
    )
    return c


# 4.表格
def table_base() -> Table:
    table = Table()

    headers = ["City name", "Area", "Population", "Annual Rainfall"]
    rows = [
        ["Brisbane", 5905, 1857594, 1146.4],
        ["Adelaide", 1295, 1158259, 600.5],
        ["Darwin", 112, 120900, 1714.7],
        ["Hobart", 1357, 205556, 619.5],
        ["Sydney", 2058, 4336374, 1214.8],
        ["Melbourne", 1566, 3806092, 646.9],
        ["Perth", 5386, 1554769, 869.4],
    ]
    table.add(headers, rows).set_global_opts(
        title_opts=opts.ComponentTitleOpts(title="Table")
    )
    return table

def make_title(v_title):
    """
    利用表格图实现可视化化看板表横幅
    :param v_title: 标题内容
    :return: 返回表格图表对象
    """

    # 创建一个 Table 对象,用于生成表格图表
    table = Table()

    # 向表格添加标题行,表头内容为 v_title,行数据为空,因为这里我们只需要显示标题
    # attributes 参数用于自定义表格样式
    table.add(
        headers=[v_title],  # 表头内容,传入的 v_title 将作为表头显示
        rows=[],  # 表格行内容为空,因为这里只需要一个标题
        attributes={
            "align": "center",  # 设置文本对齐方式为居中
            "padding": "2px",  # 设置表格内边距为 2px
            "style": "background:#f5f5f5; width:100%; height:80px; font-size:60px; color:#333333; border:none;"
            # "background:#f5f5f5;" 设置表格背景色为淡灰色
            # "width:100%;" 设置表格宽度为100%,即占满页面宽度
            # "height:80px;" 设置表格高度为80px,使标题看起来更显眼
            # "font-size:60px;" 设置字体大小为60px,使标题更加突出
            # "color:#333333;" 设置字体颜色为深灰色,符合白色主题
            # "border:none;" 移除表格边框,使其看起来更像一个横幅而非传统表格
        }
    )

    # 将表格渲染为 HTML 文件,文件名为 "大标题.html"
    table.render("大标题.html")

    # 返回 Table 对象,方便在其他地方使用这个表格图表对象
    return table


def page_simple_layout():
    """
    页面组件 Page,将多个图表加载到同一个页面
    :return: 
    """
    #    page = Page()   默认布局
    page = Page(layout=Page.DraggablePageLayout)  # 允许拖拽图表
    # 将上面定义好的图添加到 page
    page.add(
        make_title("数据可视化看板"),
        bar_datazoom_slider(),
        line_markpoint(),
        pie_rosetype(),
        table_base(),
    )
    page.render("page_simple_layout.html")

if __name__ == "__main__":
    page_simple_layout()

运行代码打开生成的页面后,即可拖拽调整页面布局,然后点击做上角的Save Config,即可保存导出配置文件

上面导出配置文件后,

根据上面的json文件,生成新的HTML文件:

from pyecharts.charts import Page

Page.save_resize_html(
    source="page_simple_layout.html",  # 之前生成的html文件
    cfg_file="chart_config.json",  # 拖拽保存后的配置文件
    dest="page_simple_layout_new.html"  # 最终生成的可视化html文件,指定名称,会根据配置文件重新生成
)

生成后效果如下:

posted @ 2024-08-07 18:13  酒剑仙*  阅读(903)  评论(0)    收藏  举报