最新常用的数据可视化模块是matplotlib,但是这篇文章我们不介绍matplotlib,而是来说一下Pyecharts模块。先来看一下Pyecharts介绍:
官方文档:http://pyecharts.org/
安装非常的简单,使用pip命令就可以成功安装:pip install pyecharts。
想要体验超强的交互性,就需要你自己敲代码运行体验,或者打开评论的链接查看效果!
图表绘制流程
所有类型的图标,基本的流程都是:
1.chart_name=图表类型() # 初始化具体类型图表
2.chart_name.add_xaxis() # 添加横坐标名称
3.chart_name.add_yaxis() # 添加纵坐标数据
4.chart_name.render() # 生成.html文件
每次运行代码都会在程序运行目录下生成对应的html文件,打开它就可以体验到超强的交互性!
导入pyecharts模块及随机虚构数据模块(自动生成的数据)
from pyecharts.faker import Faker # 虚构数据模块
from pyecharts import options as opts # 配置
from pyecharts.charts import Bar # Bar图表
创建一个Bar图(柱状图/条形图),添加数据:add_xaxis(x轴标签列表);add_yaxis(名称,y轴数据列表)
bar=Bar()
# 添加数据
bar.add_xaxis(
['西瓜','香蕉','菠萝','黑凤梨','可乐','果汁','梨子']
)
bar.add_yaxis(
"水果",
['100','120','233','200','300','345','532']
)
bar.render()
数据必须是python的list列表类型,如果是numpy的数组类型需要使用.tolist()转换成list
同样我们可以添加虚构的数据
bar=Bar()
# 添加数据
bar.add_xaxis(
Faker.choose()
)
bar.add_yaxis(
"水果",
Faker.values()
)
bar.render()
# 'G:\\jupyter\\render.html'
运行任意一个代码,会返回render.html文件的路径,找到并打开它
如果使用的是虚构的数据,每次刷新都会发生变化。
添加图表标题和副标题
使用set_global_opts方法
bar.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-基本实例",subtitle="我是副标题")
)
更多主题配色参考:http://pyecharts.org/#/zh-cn/themes,这里鳄鱼君Ba使用CHALK吧!
from pyecharts.globals import ThemeType
bar=Bar(
init_opts=opts.InitOpts(theme=ThemeType.CHALK)
)
更改图表尺寸,在配置主题的时候就可以对图表的尺寸进行配置:
bar=Bar(
init_opts=opts.InitOpts(
theme=ThemeType.CHALK,
width="850",
heigth="450"
)
)
旋转X轴坐标,有时候x轴的内容太长,会导致x轴名称重复,可以旋转x轴,这样就永远不会重复(rotate=旋转角度 -90~90之间):
bar.set_global_opts(
title_opts=opts.TitleOpts(
title="Bar-基本示例",
subtitle="我是副标题"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30))
)
传入两组数据,stack=’stack1’表示两组数据堆叠在stack1这一组
from pyecharts.globals import ThemeType
bar=Bar(
init_opts=opts.InitOpts(theme=ThemeType.CHALK)
)
# 添加数据
bar.add_xaxis(
Faker.choose()
)
bar.add_yaxis("商家A",Faker.values(),stack="stack1")
bar.add_yaxis("商家B",Faker.values(),stack="stack1")
bar.set_global_opts(
title_opts=opts.TitleOpts(
title="Bar-基本示例",
subtitle="我是副标题"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30))
)
bar.render()
堆叠效果图如下
两两堆叠,stack=’stack1’表示两组数据堆叠在stack1这一组;stack=’stack2’表示两组数据堆叠在stack2这一组
# 添加数据
bar.add_xaxis(
Faker.choose()
)
bar.add_yaxis("商家A",Faker.values(),stack="stack1")
bar.add_yaxis("商家B",Faker.values(),stack="stack1")
bar.add_yaxis("商家C",Faker.values(),stack="stack2")
bar.add_yaxis("商家D",Faker.values(),stack="stack2")
柱状图标记点和标记线
from pyecharts.globals import ThemeType
bar=Bar(
init_opts=opts.InitOpts(theme=ThemeType.CHALK)
)
bar.add_xaxis(
Faker.choose()
)
bar.add_yaxis("商家A",Faker.values(),stack="stack1")
bar.add_yaxis("商家B",Faker.values(),stack="stack1")
bar.set_global_opts(
title_opts=opts.TitleOpts(
title="Bar-基本示例",
subtitle="我是副标题"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30))
)
bar.set_series_opts(
label_opts=opts.LabelOpts(is_show=False), # 不显示数字
markpoint_opts=opts.MarkPointOpts( # 点
data=[
opts.MarkPointItem(type_="max",name="最大值"),
opts.MarkPointItem(type_="min",name="最小值"),
]
),
markline_opts=opts.MarkLineOpts( # 点
data=[
opts.MarkLineItem(type_="average",name="平均值"),
]
)
)
bar.render()
柱状图X轴和Y轴交换
bar.reversal_axis()
添加global参数datazoom_opts=[opts.DataZoomOpts()]
from pyecharts.globals import ThemeType
bar=Bar(
init_opts=opts.InitOpts(theme=ThemeType.CHALK)
)
bar.add_xaxis(Faker.days_attrs)
bar.add_yaxis("商家A",Faker.days_values)
bar.set_global_opts(
title_opts=opts.TitleOpts(
title="Bar-基本示例",
subtitle="我是副标题"),
datazoom_opts=[opts.DataZoomOpts()]
)
bar.render()
添加图表并渲染,首先创建数据data,格式:一个列表,每一项都是一个三个元素组成的列表/元组[X坐标,Y坐标,Z轴高度]
data=[(i,j,random.randint(0,12)) for i in range(25) for j in range(25)]
bar3d=Bar3D() # 创建3D图表实例
bar3d.add(
"", # 名称
data, # 数据
xaxis3d_opts=opts.Axis3DOpts(Faker.clock,type_="category"), # x轴
yaxis3d_opts=opts.Axis3DOpts(Faker.week_en,type_="category"), # y轴
zaxis3d_opts=opts.Axis3DOpts(type_="value"), # z轴为数据
)
bar3d.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_20),
title_opts=opts.TitleOpts(title="Bar3D-基本示例"),
subtitle="我是副标题"),
)
bar3d.render()
is_smooth是否让折线变平滑
from pyecharts.faker import Faker # 虚构数据模块
from pyecharts import options as opts # 配置
from pyecharts.charts import Line
line=Line()
line.add_xaxis(Faker.choose())
line.add_yaxis("商家A",Faker.values(),is_smooth=True)
line.add_yaxis("商家B",Faker.values())
line.set_global_opts(
title_opts=opts.TitleOpts(title="Line-基本示例",
subtitle="我是副标题"),
)
line.render()
line.add_yaxis(
"商家A",
Faker.values(),
is_smooth=True,
areastyle_opts=opts.AreaStyleOpts(
opacity=0.2, #填充区域透明度
color='#000') # 填充区域颜色
)
)
对于color也支持渐变及纹理,设置x轴不变,y轴从0渐变到1(red到blue)
color={
'type':'linear',
'x':0,
'y':0,
'x2':0,
'y2':1,
'colorStops':[
{'offset':0.'color':'red'},
{'offset':1,'color':'blue'}
]
}
具体效果不在展示,自行尝试!
数据为**[ (key1,value1),(key2,value2) ]**的格式
from pyecharts.faker import Faker # 虚构数据模块
from pyecharts import options as opts # 配置
from pyecharts.charts import Pie
pie=Pie()
data=[list(z) for z in zip(Faker.choose(),Faker.values())]
pie.add(
"",
data
)
pie.set_global_opts(
title_opts=opts.TitleOpts(title="Line-基本示例",
subtitle="我是副标题"),
)
pie.set_series_opts(
label_opts=opts.LabelOpts(formatter="{b}:{c}") # 数据显示的格式
)
pie.render()
创建环装饼图,radius:内环和外环半径,列表类型
pie.add(
"",
data,
radius=['30%','70%']
)
创建玫瑰饼图,rosetype设置玫瑰饼图模式;radius扇区圆心角展现数据的百分比,半径展现数据的大小;area所有扇区圆心角相同,仅通过半径展现数据大小
pie.add(
"",
data,
radius=['30%','70%'],
rosetype="area"
)
from pyecharts.faker import Faker # 虚构数据模块
from pyecharts import options as opts # 配置
from pyecharts.charts import EffectScatter
from pyecharts.globals import SymbolType
effect_scatter=EffectScatter()
effect_scatter.add_xaxis(Faker.choose()) # x轴数据
effect_scatter.add_yaxis( # y轴数据
"",
Faker.values(),
symbol=SymbolType.ARROW # 点的样式
)
effect_scatter.set_global_opts(
title_opts=opts.TitleOpts(title="EffectScatter-基本示例")
)
effect_scatter.render()
from pyecharts.faker import Faker # 虚构数据模块
from pyecharts import options as opts # 配置
from pyecharts.charts import Funnel
funnel=Funnel()
data=[list(z) for z in zip(Faker.choose(),Faker.values())]
funnel.add( # y轴数据
"内容",
data,
label_opts=opts.LabelOpts(position="inside") # 标签居中
)
funnel.set_global_opts(
title_opts=opts.TitleOpts(title="Funnel-基本示例")
)
funnel.render()
这个很多服务器厂商都在使用,用于展示自己服务器的地理位置,实现也比较简单。数据为**[ (key1,value1),(key2,value2) ]**的格式
from pyecharts.faker import Faker # 虚构数据模块
from pyecharts import options as opts # 配置
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
geo=Geo()
data=[list(z) for z in zip(Faker.provinces,Faker.values())]
geo.add_schema(maptype="china")
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo.add(
"geo",
data,
#type_=ChartType.HEATMAP, # 热力原点
)
geo.set_global_opts(
visualmap_opts=opts.VisualMapOpts(),
title_opts=opts.TitleOpts(title="Geo-基本示例"),
)
geo.render()
创建一个水球图
from pyecharts import options as opts # 配置
from pyecharts.charts import Liquid
liquid=Liquid()
liquid.add(
"Liquid",
[0.4,0.6,0.8],
# is_outline_show=False, # 是否显示外边框
# is_animation=False, # 是否显示动画效果
# shape # 边框形状,和symbol可用形状类似,可丁丁一SVG
)
liquid.set_global_opts(
title_opts=opts.TitleOpts(title="Liquid-基本示例")
)
liquid.render()
自定义形状需要在shape参数填入SVG图标的path路径,字符串开头是path://。SVG图标可到:https://www.iconfont.cn/下载获取,只需要path的值,比方说一个SVG格式的图标:
<svg class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M667.786667 117.333333C832.864 117.333333 938.666667 249.706667 938.666667 427.861333c0 138.250667-125.098667 290.506667-371.573334 461.589334a96.768 96.768 0 0 1-110.186666 0C210.432 718.368 85.333333 566.112 85.333333 427.861333 85.333333 249.706667 191.136 117.333333 356.213333 117.333333c59.616 0 100.053333 20.832 155.786667 68.096C567.744 138.176 608.170667 117.333333 667.786667 117.333333z m0 63.146667c-41.44 0-70.261333 15.189333-116.96 55.04-2.165333 1.845333-14.4 12.373333-17.941334 15.381333a32.32 32.32 0 0 1-41.770666 0c-3.541333-3.018667-15.776-13.536-17.941334-15.381333-46.698667-39.850667-75.52-55.04-116.96-55.04C230.186667 180.48 149.333333 281.258667 149.333333 426.698667 149.333333 537.6 262.858667 675.242667 493.632 834.826667a32.352 32.352 0 0 0 36.736 0C761.141333 675.253333 874.666667 537.6 874.666667 426.698667c0-145.44-80.853333-246.218667-206.88-246.218667z" /></svg>
你只需要找到path属性的值:
shape="paht://M667.786667 117.333333C832.864 117.333333 938.666667 249.706667 938.666667 427.861333c0 138.250667-125.098667 290.506667-371.573334 461.589334a96.768 96.768 0 0 1-110.186666 0C210.432 718.368 85.333333 566.112 85.333333 427.861333 85.333333 249.706667 191.136 117.333333 356.213333 117.333333c59.616 0 100.053333 20.832 155.786667 68.096C567.744 138.176 608.170667 117.333333 667.786667 117.333333z m0 63.146667c-41.44 0-70.261333 15.189333-116.96 55.04-2.165333 1.845333-14.4 12.373333-17.941334 15.381333a32.32 32.32 0 0 1-41.770666 0c-3.541333-3.018667-15.776-13.536-17.941334-15.381333-46.698667-39.850667-75.52-55.04-116.96-55.04C230.186667 180.48 149.333333 281.258667 149.333333 426.698667 149.333333 537.6 262.858667 675.242667 493.632 834.826667a32.352 32.352 0 0 0 36.736 0C761.141333 675.253333 874.666667 537.6 874.666667 426.698667c0-145.44-80.853333-246.218667-206.88-246.218667z"
可以理解为游戏中的人物KD图。创建两张雷达图数据v1和v2,v1中有两个数据,v2中有一个数据
v1=[
[44,75,66,32,57],
[45,37,57,76,47]
]
v2=[ [23,56,73,56,34] ]
创建雷达图
from pyecharts import options as opts # 配置
from pyecharts.charts import Radar
radar=Radar()
v1=[
[44,75,66,32,57],
[45,37,57,76,47]
]
v2=[ [23,56,73,56,34] ]
radar.add_schema(
schema=[
opts.RadarIndicatorItem(name="生存",max_=100),
opts.RadarIndicatorItem(name="总积分",max_=100),
opts.RadarIndicatorItem(name="战斗",max_=100),
opts.RadarIndicatorItem(name="支援",max_=100),
opts.RadarIndicatorItem(name="吃鸡率",max_=100),
]
)
radar.add("玩家1",v1)
radar.add("玩家2",v2)
radar.set_series_opts(
label_opts=opts.LabelOpts(is_show=False)
)
radar.set_global_opts(
title_opts=opts.TitleOpts(title="Radar-基本示例")
)
radar.render()
创建一个词云图
from pyecharts import options as opts # 配置
from pyecharts.charts import WordCloud
words=[
("可爱",10000),
("幸福",99990),
("自由",88840),
("坚持",98870),
("享受",89790),
("约炮",33420)
]
wordcloud=WordCloud()
wordcloud.add(
"words",
words,
word_size_range=[20,100]
)
wordcloud.set_global_opts(
title_opts=opts.TitleOpts(title="WordCloud-基本示例")
)
wordcloud.render()
pyecharts可以和Web框架结合,比方说Django、Flask框架等等。更多内容参考:http://pyecharts.org/
cutecharts适合于可爱图标,文档:https://github.com/chenjiandongx/cutecharts