前言
pyecharts为我们提供了很多种3D图的模板,包括Bar3D(3D柱状图),Line3D(3D折线图),Scatter3D(3D散点图),Surface3D(3D曲面图),Map3D(三维地图)
3D图形配置项及方法
绘制3d图形共有的配置项:Grid3DOpts,Axis3DOpts
Grid3DOpts:三维笛卡尔坐标系配置项
class Grid3DOpts(
# 三维笛卡尔坐标系组件在三维场景中的宽度,即x轴的长度。
width: Numeric = 200,
# 三维笛卡尔坐标系组件在三维场景中的高度,即z轴的长度。
height: Numeric = 100,
# 三维笛卡尔坐标系组件在三维场景中的深度,即y轴的长度。
depth: Numeric = 80,
# 是否开启视角绕物体的自动旋转查看。
is_rotate: bool = False,
# 物体自转的速度。单位为角度 / 秒,默认为10 ,也就是 36 秒转一圈。
rotate_speed: Numeric = 10,
# 旋转操作的灵敏度,值越大越灵敏。支持使用数组分别设置横向和纵向的旋转灵敏度。
# 设置为0后无法旋转。
rotate_sensitivity: Numeric = 1,
)
Axis3DOpts:三维坐标轴配置项
class Axis3DOpts(
data: Optional[Sequence] = None,
# 坐标轴类型。可选:
# 'value': 数值轴,适用于连续数据。
# 'category': 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。
# 'time': 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,
# 'log' 对数轴。适用于对数数据。
type_: Optional[str] = None,
# 坐标轴名称。
name: Optional[str] = None,
# 坐标轴名称与轴线之间的距离,注意是三维空间的距离而非屏幕像素值。
name_gap: Numeric = 20,
# 坐标轴刻度最小值。
# 可以设置成特殊值 'dataMin',此时取数据在该轴上的最小值作为最小刻度。
# 不设置时会自动计算最小值保证坐标轴刻度的均匀分布。
# 在类目轴中,也可以设置为类目的序数(如类目轴 data: ['类A', '类B', '类C'] 中,序数 2 表示 '类C'。
# 也可以设置为负数,如 -3)。
min_: Union[str, Numeric, None] = None,
# 坐标轴刻度最大值。
# 可以设置成特殊值 'dataMax',此时取数据在该轴上的最大值作为最大刻度。
# 不设置时会自动计算最大值保证坐标轴刻度的均匀分布。
# 在类目轴中,也可以设置为类目的序数(如类目轴 data: ['类A', '类B', '类C'] 中,序数 2 表示 '类C'。
# 也可以设置为负数,如 -3)。
max_: Union[str, Numeric, None] = None,
# 坐标轴的分割段数,需要注意的是这个分割段数只是个预估值,最后实际显示的段数会在这个
# 基础上根据分割后坐标轴刻度显示的易读程度作调整。
# 在类目轴中无效。
splitnum: Optional[Numeric] = None,
# 强制设置坐标轴分割间隔。
# 因为 splitNumber 是预估的值,实际根据策略计算出来的刻度可能无法达到想要的效果,
# 这时候可以使用 interval 配合 min、max 强制设定刻度划分,一般不建议使用。
# 无法在类目轴中使用。在时间轴(type: 'time')中需要传时间戳,在对数轴(type: 'log')中需要传指数值。
interval: Optional[Numeric] = None,
margin: Numeric = 8,
textstyle_opts: Union[TextStyleOpts, dict, None] = None,
)
add(): 共有的方法
def add(
# 系列名称,用于 tooltip 的显示,legend 的图例筛选。
series_name: str,
# 系列数据,传入列表嵌套的那项数据。
data: Sequence,
# 三维柱状图中三维图形的着色效果。
# color:只显示颜色,不受光照等其它因素的影响。
# lambert:通过经典的 lambert 着色表现光照带来的明暗。
# realistic:真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。
shading: Optional[str] = None,
# 图元配置项,参考 `series_options.ItemStyleOpts`
itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None
# 标签配置项,参考 `series_options.LabelOpts`
label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(is_show=False),
# 3D X 坐标轴配置项,参考 `Axis3DOpts`
xaxis3d_opts: Union[opts.Axis3DOpts, dict] = opts.Axis3DOpts(type_="category"),
# 3D Y 坐标轴配置项,参考 `Axis3DOpts`
yaxis3d_opts: Union[opts.Axis3DOpts, dict] = opts.Axis3DOpts(type_="category"),
# 3D Z 坐标轴配置项,参考 `Axis3DOpts`
zaxis3d_opts: Union[opts.Axis3DOpts, dict] = opts.Axis3DOpts(type_="value"),
# 三维笛卡尔坐标系配置项,参考 `Grid3DOpts`
grid3d_opts: Union[opts.Grid3DOpts, dict] = opts.Grid3DOpts(),
)
了解完3d图配置项,那接下来做图就很简单了,毕竟,在pyecharts中,一切皆options!!!
一、3D柱状图
1、导入模块
#导入配置项
from pyecharts import options as opts
#导入Bar3D类,绘制3D柱状图
from pyecharts.charts import Bar3D
#导入图表主题
from pyecharts.globals import ThemeType
#random模块,用于产生数据
import random
2、需要的数据类型
Bar3D需要的数据类型:
x轴:列表,可以是数值[1,2,3],也可以是类目轴的名称[Mon,Tue,Wed]
y轴:列表;同x轴
z轴:列表的嵌套
x_data = [i for i in range(0,13)] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
y_data = [j for j in range(0,14)] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
#[[0, 0, 323], [0, 1, 409], [0, 2, 254], [0, 3, 327], [0, 4, 270], [0, 5, 285], [0, 6, 333], [0, 7, 325], [0, 8, 506]]
z_data = [[i,j,random.randint(250,520)] for i in range(13) for j in range(14)]
也可以是类目轴,比如
x_data = ["12a","1a","2a","3a","4a","5a","6a","7a","8a","9a","10a","11a","12p","1p","2p","3p","4p","5p","6p","7p","8p","9p","10p","11p"]
y_data = ["Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"]
在pyecharts中共有四种类型的坐标轴
- ‘value’: 数值轴,适用于连续数据。
- ‘category’: 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。
- ‘time’: 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,
- ‘log’ 对数轴。适用于对数数据。
3、配置项和方法
在pyecharts中参数一般都有默认值,很多都是可选参数,根据自己的需要,为表格添加参数
(1)init_opts 初始化配置项
在实例化3d柱状图对象的时候加入该配置项,具体初始化配置项中有哪些参数可以参照当python遇上echarts(一)了解基本知识,或者pyecharts官方网站。
bar3d = Bar3D(
init_opts=opts.InitOpts(
width = '800px', #图表宽度
height = '600px', #图表高度
page_title = '3D柱状图', #网页标题
#theme = ThemeType.ROMANTIC ,
bg_color = '#FFB6C1',
#在绘制3d柱状图时,不仅需要echarts.min.js,还需要echarts-gl.min.js,若要设置此参数,需要将echarts-gl.min.js一起放入文件夹中
js_host = 'js/',
)
)
拓展:查看并下载需要的js文件。
在开发者选项的network中找到请求的资源,然后右键将其下载到本地,再添加js_host参数,之后就可以离线使用图表了。
(2)使用add方法添加数据和options
bar3d.add(
series_name = '随机数',
#传入数据值的那一项数据
data = z_data,
shading='lambert',
label_opts=opts.LabelOpts(
is_show=True
),
xaxis3d_opts=opts.Axis3DOpts(type_ = 'value',name = 'x轴'),
yaxis3d_opts=opts.Axis3DOpts(type_ = 'value',name = 'y轴'),
zaxis3d_opts=opts.Axis3DOpts(type_ = 'value',name = 'z轴',min_ = 250),
grid3d_opts=opts.Grid3DOpts(
width=100, #x轴长度
height = 100, #z轴长度
depth = 80, #y轴长度
#is_rotate=True, #是否开启自动旋转
)
)
(3)设置其他配置项
bar3d.set_global_opts(
title_opts=opts.TitleOpts(title = '3D柱状图'),
#视觉映射配置项,配置图形的颜色过渡
visualmap_opts=opts.VisualMapOpts(
is_show=True,
type_ = 'color',
is_piecewise=True,
split_number=6,
range_color=['red','orange','yellow','green','blue','purple'],
min_ = 250,
max_ = 520
),
#tooltip_opts=opts.TooltipOpts(is_show=True)
)
4、生成html文件
bar3d = set_bar3d()
bar3d.render('3d柱状图csdn文章.html')
5、完整代码
from pyecharts import options as opts
#导入Bar3D类,绘制3D柱状图
from pyecharts.charts import Bar3D
from pyecharts.globals import ThemeType
import random
#Bar3D需要的数据类型:x轴:列表;y轴:列表;z轴:列表的嵌套(一般设置z轴显示数值)
x_data = [i for i in range(0,13)] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
y_data = [j for j in range(0,14)] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
#z轴数据格式[[0, 0, 323], [0, 1, 409], [0, 2, 254], [0, 3, 327], [0, 4, 270], [0, 5, 285], [0, 6, 333], [0, 7, 325], [0, 8, 506]]
z_data = [[i,j,random.randint(250,520)] for i in range(13) for j in range(14)]
def set_bar3d():
bar3d = Bar3D(
#参照第一节里面的InitOpts
init_opts=opts.InitOpts(
#图表宽度
width = '800px',
#图表高度
height = '600px',
#网页标题
page_title = '3D柱状图',
#图表主题,有好多种主题,from pyecharts.globals import ThemeType
#LIGHT,DARK,CHALK,INFOGRAPHIC,ESSOS,MACARONS,PURPLE_PASSION,ROMA,ROMANTIC,SHINE,VINTAGE,WALDEN,WESTEROS
#theme = ThemeType.ROMANTIC ,
#背景颜色,可以用颜色的单词,可以用16进制的颜色码(浅粉色,#FFB6C1),也可以用RGB颜色表示rgb(255,182,193)
bg_color = '#FFB6C1',
#远程 js host,如不设置默认为 https://assets.pyecharts.org/assets/"
#如果想要在不联网的情况下展示图表,需将echarts.min.js下载至本地。然后传入其路径
#在绘制3d柱状图时,不仅需要echarts.min.js,还需要echarts-gl.min.js,若要设置此参数,需要将echarts-gl.min.js一起放入文件夹中
#js_host = 'js/',
#
)
)
bar3d.add(
series_name = '随机数',
data = z_data,
shading='lambert',
label_opts=opts.LabelOpts(
is_show=True
),
xaxis3d_opts=opts.Axis3DOpts(type_ = 'value',name = 'x轴'),
yaxis3d_opts=opts.Axis3DOpts(type_ = 'value',name = 'y轴'),
zaxis3d_opts=opts.Axis3DOpts(type_ = 'value',name = 'z轴',min_ = 250),
grid3d_opts=opts.Grid3DOpts(
width=100, #x轴长度
height = 100, #z轴长度
depth = 80, #y轴长度
#is_rotate=True, #是否开启自动旋转
)
)
bar3d.set_global_opts(
title_opts=opts.TitleOpts(title = '3D柱状图'),
#视觉映射配置项,配置图形的颜色过渡
visualmap_opts=opts.VisualMapOpts(
is_show=True,
type_ = 'color',
is_piecewise=True,
split_number=6,
range_color=['red','orange','yellow','green','blue','purple'],
min_ = 250,
max_ = 520
),
#tooltip_opts=opts.TooltipOpts(is_show=True)
)
return bar3d
bar3d = set_bar3d()
bar3d.render('3d柱状图csdn文章.html')
6、图表展示
二、三维地图 Map3D
1、导入模块
from pyecharts.charts import Map3D
from pyecharts.globals import ChartType
2、需要数据类型
(坐标点名称,坐标点值)
坐标点值列表中[经度,纬度,数值]
example_data = [
("黑龙江", [127.9688, 45.368, 100]),
("内蒙古", [110.3467, 41.4899, 400]),
("吉林", [125.8154, 44.2584, 700]),
("辽宁", [123.1238, 42.1216, 500]),
("河北", [114.4995, 38.1006, 335]),
("天津", [117.4219, 39.4189, 300]),
("山西", [112.3352, 37.9413, 370]),
("陕西", [109.1162, 34.2004, 670]),
("甘肃", [103.5901, 36.3043, 570]),
("宁夏", [106.3586, 38.1775, 300]),
("青海", [101.4038, 36.8207, 300]),
("新疆", [87.9236, 43.5883, 300]),
("西藏", [91.11, 29.97, 300]),
("四川", [103.9526, 30.7617, 300]),
("重庆", [108.384366, 30.439702, 300]),
("山东", [117.1582, 36.8701, 300]),
("河南", [113.4668, 34.6234, 300]),
("江苏", [118.8062, 31.9208, 300]),
("安徽", [117.29, 32.0581, 300]),
("湖北", [114.3896, 30.6628, 900]),
("浙江", [119.5313, 29.8773, 300]),
("福建", [119.4543, 25.9222, 308]),
("江西", [116.0046, 28.6633, 300]),
("湖南", [113.0823, 28.2568, 300]),
("贵州", [106.6992, 26.7682, 900]),
("广西", [108.479, 23.1152, 300]),
("海南", [110.3893, 19.8516, 300]),
("上海", [121.4648, 31.2891, 1300]),
]
3、配置项和方法
(1)初始化配置项 init_opts
配置方法及参数与其他图相同
map3d = Map3D(init_opts=opts.InitOpts(width='1200px',height='700px'))
(2)add()方法
def add(
# 系列名称,用于 tooltip 的显示,legend 的图例筛选。
series_name: str,
# 数据项 (坐标点名称,坐标点值)
data_pair: types.Sequence,
# 叠加图的类型(目前只支持 Bar3D,Line3D,Lines3D,Scatter3D)
type_: ChartType = None,
# 地图类型,具体参考 pyecharts.datasets.map_filenames.json 文件
#在python安装路径中的Lib\site-packages\pyecharts\datasets\map_filename.json
maptype: str = "china",
# 仅在 bar3D 下起作用
# 设置柱子的大小
bar_size: types.Optional[types.Numeric] = None,
# 柱子的倒角尺寸。支持设置为从 0 到 1 的值。默认为 0,即没有倒角。
bevel_size: types.Numeric = 0,
# 柱子倒角的光滑/圆润度,数值越大越光滑/圆润。
bevel_smoothness: types.Numeric = 2,
# 最小柱子高度。
min_height: types.Numeric = 2,
# 提示框组件配置项,参考 `series_options.TooltipOpts`
tooltip_opts: types.Tooltip = None,
# 图元样式配置项,参考 `series_options.ItemStyleOpts`
itemstyle_opts: types.ItemStyle = None,
# 高亮标签配置项,参考 `series_options.LabelOpts`
emphasis_label_opts: types.Label = None,
# 高亮图元样式配置项,参考 `series_options.ItemStyleOpts`
emphasis_itemstyle_opts: types.ItemStyle = None,
# 三维地图中三维图形的着色效果。echarts-gl 中支持下面三种着色方式:
# color: 只显示颜色,不受光照等其它因素的影响。
# lambert: 通过经典的 lambert 着色表现光照带来的明暗。
# realistic: 真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。
# ECharts GL 中使用了基于物理的渲染(PBR) 来表现真实感材质。
shading: types.Optional[str] = None,
# 真实感材质相关的配置项,在 shading 为'realistic'时有效。
realistic_material_opts: types.Optional[types.Map3DRealisticMaterial] = None,
# lambert 材质相关的配置项,在 shading 为'lambert'时有效。
lambert_material_opts: types.Optional[types.Map3DLambertMaterial] = None,
# color 材质相关的配置项,在 shading 为'color'时有效。
color_material_opts: types.Optional[types.Map3DColorMaterial] = None,
# 图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。
is_silent: bool = False,
# 是否开启动画。
is_animation: bool = True,
# 过渡动画的时长。
animation_duration_update: types.Numeric = 100,
# 过渡动画的缓动效果。
animation_easing_update: types.Numeric = "cubicOut",
):
示例如下:
map3d.add(
series_name = '旅游人数',
data_pair = example_data,
#叠加图的类型
type_ = ChartType.BAR3D,
maptype='china',
#控制柱状图的图元样式
itemstyle_opts=opts.ItemStyleOpts(
color = '#FF0033',
#设置柱子的透明度,支持从 0 到 1 的数字,为 0 时不绘制该图形
#opacity=1
),
#设置柱子的标签
label_opts=opts.LabelOpts(
is_show=True,
#设置标签的内容(标签内容格式器),支持字符串模板和回调函数
# # 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值)
#formatter='{b}{c}',字符串模板
#回调函数,需要先引入JsCode,from pyecharts.commons.utils import JsCode
#不论时字符串还是回调函数都支持\n,\t,但是需要用双斜杠表示
formatter=JsCode("function(data){return data.name +'\\n'+ data.value[2];}")
),
#配置选中柱子的标签
emphasis_label_opts=opts.LabelOpts(
is_show=True
),
#设置选中的柱子的图元样式
emphasis_itemstyle_opts=opts.ItemStyleOpts(
color='#33FF00'
)
)
(3) add_schema()方法 —(添加底层地图的相关配置)
def add_schema(
# 地图类型,具体参考 pyecharts.datasets.map_filenames.json 文件
#在python安装路径中的Lib\site-packages\pyecharts\datasets\map_filename.json
maptype: str = "china",
# 名称
name: types.Optional[str] = None,
# 三维地理坐标系组件在三维场景中的参数。
# 具体图示在此: https://www.echartsjs.com/zh/documents/asset/gl/img/geo-size.png
box_width: types.Optional[types.Numeric] = 100, #(x轴的长度)
box_height: types.Optional[types.Numeric] = 10, #(z轴的长度)
box_depth: types.Optional[types.Numeric] = None, #(y轴的长度)
#底层地图的厚度
region_height: types.Optional[types.Numeric] = 3,
# 是否显示地面,地面可以让整个组件有个“摆放”的地方,从而使整个场景看起来更真实,更有模型感。
is_show_ground: bool = False,
# 地面颜色。
ground_color: str = "#aaa",
# Map3D 的 Label 设置
map3d_label: types.Map3DLabel = None,
# 图元样式配置项,参考 `series_options.ItemStyleOpts`
itemstyle_opts: types.ItemStyle = None,
# 高亮标签配置项,参考 `series_options.LabelOpts`
emphasis_label_opts: types.Label = None,
# 高亮图元样式配置项,参考 `series_options.ItemStyleOpts`
emphasis_itemstyle_opts: types.ItemStyle = None,
# 三维地理坐标系组件中三维图形的着色效果。echarts-gl 中支持下面三种着色方式:
# color: 只显示颜色,不受光照等其它因素的影响。
# lambert: 通过经典的 lambert 着色表现光照带来的明暗。
# realistic: 真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。
# ECharts GL 中使用了基于物理的渲染(PBR) 来表现真实感材质。
shading: types.Optional[str] = None,
# 真实感材质相关的配置项,在 shading 为'realistic'时有效。
realistic_material_opts: types.Optional[types.Map3DRealisticMaterial] = None,
# lambert 材质相关的配置项,在 shading 为'lambert'时有效。
lambert_material_opts: types.Optional[types.Map3DLambertMaterial] = None,
# color 材质相关的配置项,在 shading 为'color'时有效。
color_material_opts: types.Optional[types.Map3DColorMaterial] = None,
# 光照相关的设置。在 shading 为 'color' 的时候无效。
# 光照的设置会影响到组件以及组件所在坐标系上的所有图表。
# 合理的光照设置能够让整个场景的明暗变得更丰富,更有层次。
light_opts: types.Optional[types.Map3DLight] = None,
# viewControl用于鼠标的旋转,缩放等视角控制。
view_control_opts: types.Optional[types.Map3DViewControl] = None,
# 组件的视图离容器左侧的距离。
# left 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,
# 也可以是 'left', 'center', 'right'。
# 如果 left 的值为'left', 'center', 'right',组件会根据相应的位置自动对齐。
pos_left: types.Union[types.Numeric, str] = "auto",
# 组件的视图离容器上侧的距离。
pos_top: types.Union[types.Numeric, str] = "auto",
# 组件的视图离容器右侧的距离。
pos_right: types.Union[types.Numeric, str] = "auto",
# 组件的视图离容器下侧的距离。
pos_bottom: types.Union[types.Numeric, str] = "auto",
# 组件的视图宽度。
pos_width: types.Union[types.Numeric, str] = "auto",
# 组件的视图高度。
pos_height: types.Union[types.Numeric, str] = "auto",
)
示例如下:
map3d.add_schema(
maptype='china',
#底层地图的厚度
region_height=4,
is_show_ground=True,
itemstyle_opts=opts.ItemStyleOpts(
#底层地图的颜色
color = 'blue',
#图形的描边颜色,即地图中区域分界线的颜色
border_color='yellow',
#分界线的类型,'dashed', 'dotted'
border_type='dashed',
#分界线的宽度
border_width=1
),
#设置底层地图的label,
emphasis_label_opts=opts.LabelOpts(
#设置选中高亮区域不显示标签
is_show=False
),
#设置高亮区域的图元样式
emphasis_itemstyle_opts=opts.ItemStyleOpts(
#设置选中区域显示为绿色
color = 'green'
),
shading='lambert',
#设置光照,显示阴影
light_opts=opts.Map3DLightOpts(
#主光源的颜色
main_color='#FFFFCC',
# 主光源是否投射阴影。默认为关闭。
# 开启阴影可以给场景带来更真实和有层次的光照效果。但是同时也会增加程序的运行开销。
is_main_shadow = True
)
)
(4)其他配置项
map3d.set_global_opts(
title_opts=opts.TitleOpts(title='三维地图叠加柱状图'),
#视觉映射配置项,设置颜色过渡
visualmap_opts=opts.VisualMapOpts(
is_show=True,
type_='color',
min_ = 100,
max_ = 1300,
range_color=['red','orange','yellow','green','blue','purple'],
is_piecewise=True
)
)
拓展:VisualMapOpts(视觉映射配置项)
class VisualMapOpts(
# 是否显示视觉映射配置
is_show: bool = True,
# 映射过渡类型,可选,"color", "size"
type_: str = "color",
# 指定 visualMapPiecewise 组件的最小值。
min_: Union[int, float] = 0,
# 指定 visualMapPiecewise 组件的最大值。
max_: Union[int, float] = 100,
# 两端的文本,如['High', 'Low']。
range_text: Union[list, tuple] = None,
# visualMap 组件过渡颜色
range_color: Union[Sequence[str]] = None,
# visualMap 组件过渡 symbol 大小
range_size: Union[Sequence[int]] = None,
# visualMap 图元以及其附属物(如文字标签)的透明度。
range_opacity: Optional[Numeric] = None,
# 如何放置 visualMap 组件,水平('horizontal')或者竖直('vertical')。
orient: str = "vertical",
# visualMap 组件离容器左侧的距离。
# left 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,
# 也可以是 'left', 'center', 'right'。
# 如果 left 的值为'left', 'center', 'right',组件会根据相应的位置自动对齐。
pos_left: Optional[str] = None,
# visualMap 组件离容器右侧的距离。
# right 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比。
pos_right: Optional[str] = None,
# visualMap 组件离容器上侧的距离。
# top 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,
# 也可以是 'top', 'middle', 'bottom'。
# 如果 top 的值为'top', 'middle', 'bottom',组件会根据相应的位置自动对齐。
pos_top: Optional[str] = None,
# visualMap 组件离容器下侧的距离。
# bottom 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比。
pos_bottom: Optional[str] = None,
# 对于连续型数据,自动平均切分成几段。默认为5段。连续数据的范围需要 max 和 min 来指定
split_number: int = 5,
# 指定取哪个系列的数据,默认取所有系列。
series_index: Union[Numeric, Sequence, None] = None,
# 组件映射维度
dimension: Optional[Numeric] = None,
# 是否显示拖拽用的手柄(手柄能拖拽调整选中范围)。
is_calculable: bool = True,
# 是否为分段型
is_piecewise: bool = False,
# 是否反转 visualMap 组件
is_inverse: bool = False,
# 数据展示的小数精度。
# 连续型数据平均分段,精度根据数据自动适应。
# 连续型数据自定义分段或离散数据根据类别分段模式,精度默认为0(没有小数)。
precision: Optional[int] = None,
# 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式。例如:
# pieces: [
# {"min": 1500}, // 不指定 max,表示 max 为无限大(Infinity)。
# {"min": 900, "max": 1500},
# {"min": 310, "max": 1000},
# {"min": 200, "max": 300},
# {"min": 10, "max": 200, "label": '10 到 200(自定义label)'},
# {"value": 123, "label": '123(自定义特殊颜色)', "color": 'grey'}, //表示 value 等于 123 的情况
# {"max": 5} // 不指定 min,表示 min 为无限大(-Infinity)。
# ]
pieces: Optional[Sequence] = None,
# 定义 在选中范围外 的视觉元素。(用户可以和 visualMap 组件交互,用鼠标或触摸选择范围)
# 可选的视觉元素有:
# symbol: 图元的图形类别。
# symbolSize: 图元的大小。
# color: 图元的颜色。
# colorAlpha: 图元的颜色的透明度。
# opacity: 图元以及其附属物(如文字标签)的透明度。
# colorLightness: 颜色的明暗度,参见 HSL。
# colorSaturation: 颜色的饱和度,参见 HSL。
# colorHue: 颜色的色调,参见 HSL。
out_of_range: Optional[Sequence] = None,
# 图形的宽度,即长条的宽度。
item_width: int = 0,
# 图形的高度,即长条的高度。
item_height: int = 0,
# visualMap 组件的背景色。
background_color: Optional[str] = None,
# visualMap 组件的边框颜色。
border_color: Optional[str] = None,
# visualMap 边框线宽,单位px。
border_width: int = 0,
# 文字样式配置项,参考 `series_options.TextStyleOpts`
textstyle_opts: Union[TextStyleOpts, dict, None] = None,
)
4、生成html文件
map3d = set_map3d()
map3d.render('map3d_csdn文章.html')
5、完整代码
from pyecharts import options as opts
from pyecharts.charts import Map3D
from pyecharts.globals import ChartType
from pyecharts.commons.utils import JsCode
#(坐标点名称,坐标点值),坐标点值列表中[经度,纬度,数值]
example_data = [
("黑龙江", [127.9688, 45.368, 100]),
("内蒙古", [110.3467, 41.4899, 400]),
("吉林", [125.8154, 44.2584, 700]),
("辽宁", [123.1238, 42.1216, 500]),
("河北", [114.4995, 38.1006, 335]),
("天津", [117.4219, 39.4189, 300]),
("山西", [112.3352, 37.9413, 370]),
("陕西", [109.1162, 34.2004, 670]),
("甘肃", [103.5901, 36.3043, 570]),
("宁夏", [106.3586, 38.1775, 300]),
("青海", [101.4038, 36.8207, 300]),
("新疆", [87.9236, 43.5883, 300]),
("西藏", [91.11, 29.97, 300]),
("四川", [103.9526, 30.7617, 300]),
("重庆", [108.384366, 30.439702, 300]),
("山东", [117.1582, 36.8701, 300]),
("河南", [113.4668, 34.6234, 300]),
("江苏", [118.8062, 31.9208, 300]),
("安徽", [117.29, 32.0581, 300]),
("湖北", [114.3896, 30.6628, 900]),
("浙江", [119.5313, 29.8773, 300]),
("福建", [119.4543, 25.9222, 308]),
("江西", [116.0046, 28.6633, 300]),
("湖南", [113.0823, 28.2568, 300]),
("贵州", [106.6992, 26.7682, 900]),
("广西", [108.479, 23.1152, 300]),
("海南", [110.3893, 19.8516, 300]),
("上海", [121.4648, 31.2891, 1300]),
]
def set_map3d():
map3d = Map3D(init_opts=opts.InitOpts(width='1200px',height='700px'))
map3d.add(
series_name = '旅游人数',
data_pair = example_data,
#叠加图的类型
type_ = ChartType.BAR3D,
maptype='china',
#控制柱状图的图元样式
itemstyle_opts=opts.ItemStyleOpts(
color = '#FF0033',
#设置柱子的透明度,支持从 0 到 1 的数字,为 0 时不绘制该图形
#opacity=1
),
#设置柱子的标签
label_opts=opts.LabelOpts(
is_show=True,
#设置标签的内容(标签内容格式器),支持字符串模板和回调函数
# # 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值)
#formatter='{b}{c}',字符串模板
#回调函数,需要先引入JsCode,from pyecharts.commons.utils import JsCode
#不论时字符串还是回调函数都支持\n,\t,但是需要用双斜杠表示
formatter=JsCode("function(data){return data.name +'\\n'+ data.value[2];}")
),
#配置选中柱子的标签
emphasis_label_opts=opts.LabelOpts(
is_show=True
),
#设置选中的柱子的图元样式
emphasis_itemstyle_opts=opts.ItemStyleOpts(
color='#33FF00'
)
)
#添加底层地图
map3d.add_schema(
maptype='china',
#底层地图的厚度
region_height=4,
is_show_ground=True,
itemstyle_opts=opts.ItemStyleOpts(
#底层地图的颜色
color = 'blue',
#图形的描边颜色,即地图中区域分界线的颜色
border_color='yellow',
#分界线的类型,'dashed', 'dotted'
border_type='dashed',
#分界线的宽度
border_width=1
),
#设置底层地图的label,
emphasis_label_opts=opts.LabelOpts(
#设置选中高亮区域不显示标签
is_show=False
),
#设置高亮区域的图元样式
emphasis_itemstyle_opts=opts.ItemStyleOpts(
#设置选中区域显示为绿色
color = 'green'
),
shading='lambert',
#设置光照,显示阴影
light_opts=opts.Map3DLightOpts(
#主光源的颜色
main_color='#FFFFCC',
# 主光源是否投射阴影。默认为关闭。
# 开启阴影可以给场景带来更真实和有层次的光照效果。但是同时也会增加程序的运行开销。
is_main_shadow = True
)
)
map3d.set_global_opts(
title_opts=opts.TitleOpts(title='三维地图叠加柱状图'),
#视觉映射配置项,设置颜色过渡
visualmap_opts=opts.VisualMapOpts(
is_show=True,
type_='color',
min_ = 100,
max_ = 1300,
range_color=['red','orange','yellow','green','blue','purple'],
is_piecewise=True
)
)
return map3d
map3d = set_map3d()
map3d.render('map3d_csdn文章.html')
6、图表展示
页面组件和分页组件
生成的html中,只有一个图表,要想一个页面中展示多个图表,就需要用到页面组件Page和分页组件Tab
1、页面组件
页面组件有3种组合形式:
- SimplePageLayout
- DraggablePageLayout;
- DefaultLayout(不设置layout参数,就是默认的DefaultLayout)
DraggablePageLayout中,可以任意拖动图表,得到想要的布局。
from pyecharts.charts import Page
page = Page(
page_title='页面组件',
interval=10,
#设置引用的js文件
#js_host=''
#3中组合形式:SimplePageLayout;DraggablePageLayout;DefaultLayout(不设置layout参数,就是默认的DefaultLayout)
layout=Page.SimplePageLayout
)
#add方法传入各种图的实例化对象
page.add(
set_map3d(),
set_bar3d()
)
#生成html
page.render('csdn文章layout.html')
2、分页组件
tab类的add()方法需传入两个参数
- 第一个:图表的实例化对象
- 第二个:该图表的分页名
from pyecharts.charts import Tab
tab = Tab(
page_title='分页组件',
#js_host=
)
#add方法需传入两个参数,第一个:图表的实例化对象,第二个:该图表的分页名
tab.add(set_bar3d(),'3d柱状图')
tab.add(set_map3d(),'三维地图')
tab.add(set_map(),'地理图')
tab.render('csdn文章tab.html')