Pyecharts
有一个非常强大的功能,就是能够将多个图形同时放在一个HTML
页面中。这种方式和其他库的绘制多个子图的方式的区别在于:Pyecharts
中能够自定义位置和图形大小。
本文中将绘制多种不同的图形,并将它们通过页面组件Page
的方式放在同一个HTML
页面中。
下面将会绘制多个图形,图形中不会涉及到太多的配置,本文的重点是讲解如何将不同的图形组合在一起。
from pyecharts.globals import CurrentConfig, OnlineHostType # 事先导入,防止不出图
from pyecharts import options as opts
from pyecharts.charts import Bar, Pie, Line, HeatMap, Funnel, Gauge, Grid, Page # 6个图形+2个组件
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
from pyecharts.globals import SymbolType
import pandas as pd
import numpy as np
import random
#显示所有列
# pd.set_option('display.max_columns', None)
#显示所有行
# pd.set_option('display.max_rows', None)
#设置value的显示长度为100,默认为50
# pd.set_option('max_colwidth',100)
从代码中可以看出来,选择了6个图形进行组合:
另外的Grid
和Page
是两个图形组件
柱状图+折线图+饼图是用的一份模拟数据,具体如下:
c = (
Bar()
.add_xaxis(df['子类'].tolist())
.add_yaxis("5大开支",df['数据'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-月度开支"),
legend_opts=opts.LegendOpts(is_show=False),
)
)
c.render_notebook()
c = (
Pie()
.add("", [list(z) for z in zip(df['子类'].tolist(), df['数据'].tolist())])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度开支"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()
c = (
Line()
.add_xaxis(df['子类'].tolist())
.add_yaxis("月度开支", df['数据'].tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="Line-月度开支"))
)
c.render_notebook()
# 0-50 的随机数+列表推导式
value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)]
c = (
HeatMap()
.add_xaxis(Faker.clock)
.add_yaxis("热力图", Faker.week, value)
.set_global_opts(
title_opts=opts.TitleOpts(title="HeatMap-热力图"),
visualmap_opts=opts.VisualMapOpts(),
)
)
c.render_notebook()
c = (
Funnel()
.add("商品", [list(z) for z in zip(Faker.choose(), Faker.values())])
.set_global_opts(title_opts=opts.TitleOpts(title="Funnel-漏斗图"))
)
c.render_notebook()
c = (
Gauge()
.add("", [("完成率", 80)])
.set_global_opts(title_opts=opts.TitleOpts(title="Gauge-仪表盘"))
)
c.render_notebook()
1、先定义每个图形的函数
2、将所有的绘图方法添加到Page中
3、生成HTML文件
# from pyecharts import options as opts
# from pyecharts.charts import Bar, Pie, Line, HeatMap, Funnel, Gauge, Grid, Page
# from pyecharts.faker import Faker
# 1、柱状图
def barPage() -> Bar:
bar = (
Bar()
.add_xaxis(df['子类'].tolist())
.add_yaxis("5大开支",df['数据'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-月度开支"),
legend_opts=opts.LegendOpts(is_show=False),)
)
return bar
# 2、饼图
def piePage() -> Pie:
pie = (
Pie()
.add("", [list(z) for z in zip(df['子类'].tolist(), df['数据'].tolist())])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度开支"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
return pie
# 3、折线图
def linePage() -> Line:
line = (
Line()
.add_xaxis(df['子类'].tolist())
.add_yaxis("月度开支", df['数据'].tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="Line-月度开支"))
)
return line
# 4、热力图
def heatmapPage() -> HeatMap:
value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)]
heatmap = (
HeatMap()
.add_xaxis(Faker.clock)
.add_yaxis("热力图", Faker.week, value)
.set_global_opts(
title_opts=opts.TitleOpts(title="HeatMap-热力图"),
visualmap_opts=opts.VisualMapOpts(),
)
)
return heatmap
# 5、漏斗图
def funnelPage() -> Funnel:
funnel = (
Funnel()
.add("商品", [list(z) for z in zip(Faker.choose(), Faker.values())])
.set_global_opts(title_opts=opts.TitleOpts(title="Funnel-漏斗图"))
)
return funnel
# 6、仪表盘
def gaugePage() -> Gauge:
gauge = (
Gauge()
.add("", [("完成率", 80)])
.set_global_opts(title_opts=opts.TitleOpts(title="Gauge-仪表盘"))
)
return gauge
# 上面是6个图形的代码,下面利用Page进行组合
# !!! 关键步骤:将上面定义的每个函数或者方法添加进来
page = (
Page()
.add(
barPage(),
piePage(),
linePage(),
funnelPage(),
heatmapPage(),
gaugePage())
)
page.render("page_demo.html") # 生成HTML文件
上面采用的是Page的默认绘图方式
当我们打开HTML文件会发现所有的图形都是靠左的,为了显示方便图形被缩小了
缺点:页面的右边空白太多了,使得页面显示效果很差
这种方式会将图形全部放在HTML页面的正中间的,代码改变的部分如下:
# 上面的绘图代码相同
#### 不同之处
page = (
Page(layout=Page.SimplePageLayout) # !!!!改变在这里
.add(
barPage(),
piePage(),
linePage(),
funnelPage(),
heatmapPage(),
gaugePage())
)
page.render("page_simple_demo.html") # 生成HTML文件
我们看看实际的效果:
当我们的屏幕不断缩小的时候,所有的图形会排成一行:
缺点:图形居中的话,布局得到了优化,但是图形较多的时候需要不断地向下移动,而且页面上某个图形有时候只是显示部分,显得突兀。
这种方式才是Pyecharts的强大之处???。使用这种方式,我们可以得到任何排列和图形大小的布局,代码改变如下:
# 上面的绘图代码相同
#### 不同之处
page = (
Page(layout=Page.DraggablePageLayout) # !!!!改变在这里
.add(
barPage(),
piePage(),
linePage(),
funnelPage(),
heatmapPage(),
gaugePage())
)
page.render("page_draggable_demo.html") # 生成HTML文件
我们先看看生成的图形:
在这种方式下,图形是可以任意拖拽的,同时大小也可以改变的,我们尝试一种排列方式:
重点来了:我们点击左上角的Save Config,会在本地的相同目录下生成一个json
的配置文件,然后格式化我们的文件
Page.save_resize_html("page_demo.html", # 上面的HTML文件名称
cfg_file="chart_config.json", # 保存的json配置文件
dest="page_draggable_demo.html") # 新的文件名称
这个时候我们在运行一下,生成的HTML
文件就是我们在上面排版的布局,完美?
保存一份关于嵌套圆形图的代码:
import pyecharts.options as opts
from pyecharts.charts import Pie
from pyecharts.globals import ThemeType
nine_Giant = nine.drop_duplicates("Giant等级")
one_Giant = one.drop_duplicates("Giant等级")
# 进行排序:饼图中从小到大排序
nine_Giant = nine_Giant[["Giant等级","Giant_per"]].sort_values("Giant等级")
one_Giant = one_Giant[["Giant等级","Giant_per"]].sort_values("Giant等级")
# 内部饼图
inner_names = one_Giant["Giant等级"].tolist()
inner_values = one_Giant["Giant_per"].tolist()
inner_pair = [list(z) for z in zip(inner_names,inner_values)]
# 外部环形(嵌套)
outer_names = nine_Giant["Giant等级"].tolist()
outer_values = nine_Giant["Giant_per"].tolist()
outer_pair = [list(z) for z in zip(outer_names,outer_values)]
c = (
# 初始化
Pie(init_opts=opts.InitOpts(
width="900px",
height="800px",
theme=ThemeType.SHINE))
# 内部饼图
.add(
series_name="版本3.2.1", # 系列名称
center=["50%", "35%"],
data_pair=inner_pair, # 系列数据项,格式为 [(key1, value1), (key2, value2)]
radius=["25%", "40%"], #饼图半径 数组的第一项是内半径,第二项是外半径
#label_opts=opts.LabelOpts(position="inner"), #标签设置在内部
)
# 外部嵌套环形图
.add(
series_name="版本3.2.9", # 系列名称
center=["50%", "35%"],
radius=["40%", "60%"], #饼图半径 数组的第一项是内半径,第二项是外半径
data_pair=outer_pair, # 系列数据项,格式为 [(key1, value1), (key2, value2)]
# 标签配置项 参考上面的例子
label_opts=opts.LabelOpts(
# position="outside",
# formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",
background_color="#eee",
border_color="#aaa",
border_width=1,
border_radius=4,
rich={
"a": {"color": "#999",
"lineHeight": 22,
"align": "center"},
"abg": {
"backgroundColor": "#e3e3e3",
"width": "100%",
"align": "right",
"height": 22,
"borderRadius": [4, 4, 0, 0],
},
"hr": {
"borderColor": "#aaa",
"width": "100%",
"borderWidth": 0.5,
"height": 0,
},
"b": {"fontSize": 16, "lineHeight": 33},
"per": {
"color": "#eee",
"backgroundColor": "#334455",
"padding": [2, 4],
"borderRadius": 2,
},
},
),
)
# 全局配置项
.set_global_opts(
xaxis_opts = opts.AxisOpts(is_show = False), #隐藏X轴刻度
yaxis_opts = opts.AxisOpts(is_show = False), #隐藏Y轴刻度
legend_opts = opts.LegendOpts(is_show = False), #隐藏图例
title_opts = opts.TitleOpts(title = None), #隐藏标题
)
# 系统配置项
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item",
formatter="{a} <br/>{b}: {c} ({d}%)"
),
label_opts=opts.LabelOpts(is_show=False) # 隐藏每个触角标签
)
)
c.render_notebook()