Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,Pyecharts诞生了。
Pyecharts最早只适用于工程领域的可视化开发,但是随着其对Jupyter notebook、Jupyter lab等交互式开发工具的支持不断加强,现在也开始被许多数据分析师应用到数据探索中。
注:V1.x之前的版本已不再维护,建议直接学习最新V 1.x版本
新版本支持链式调用。
绘图前需要导入相关模块,根据绘制的图形不同,导入的模块会有些许差异。
from pyecharts import options as opts #引入配置项入口
from pyecharts.charts import Bar,Line #导入相关图形的构造方法
绘图步骤:
当数据量少的时候我们使用柱状图就可以了。pyecharts绘制柱状图表灰常简单咯,啥也不说了,上代码。
from pyecharts.faker import Faker #调用官方提供的测试数据
from pyecharts import options as opts #配置入口模块
from pyecharts.charts import Bar #柱状图构造方法
#from pyecharts import Bar # 0.5版本导入方法
bar = Bar()#构造bar对象
bar.add_xaxis(Faker.choose()) #添加x轴数据
bar.add_yaxis("商家A", Faker.values()) #添加一个系列数据,这里是A商家的数据
bar.add_yaxis("商家B", Faker.values()) #添加另一个系列数据
bar.set_global_opts(title_opts=opts.TitleOpts(
title="Bar-基本示例", #设置主标题
subtitle="我是副标题" #设置副标题
))
bar.render_notebook() #在jupyter notebook中渲染
当条目较多,如大于12条,移动端上的柱状图会显得拥挤不堪,更适合用条形图。一般数据条目不超过30条,否则易带来视觉和记忆负担。
bar = Bar().add_xaxis(Faker.choose()+Faker.choose()+Faker.choose()) #将数据生成三份
bar.add_yaxis("", Faker.values()+Faker.values()+Faker.values()) #数据生成三份
bar.set_global_opts(title_opts=opts.TitleOpts(title="条形图"))
bar.reversal_axis() #翻转XY轴,将柱状图转换为条形图
bar.render_notebook()
当数据X轴为连续数值(如时间)且我们比较注重观察数据变化趋势时,折线图是非常好的选择。
import pyecharts.options as opts
from pyecharts.charts import Line
#创建图形对象
line = Line()
#添加数据
line.add_xaxis(["201{}年/{}季度".format(y,z)
for y in range(4)
for z in range(1,5)])
line.add_yaxis("电视机销量",#设置系列名称
[4.80,4.10,6.00,6.50,5.80,5.20,6.80,7.40,
6.00,5.60,7.50,7.80,6.30,5.90,8.00,8.40])
#配置全局参数
line.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-40),),
yaxis_opts=opts.AxisOpts(name="销量(单位/千台)"),#设置y轴名称
title_opts=opts.TitleOpts(title="折线图")#设置图标标题
)
#渲染图表
line.render_notebook()
当对比差异不是很明显的数据时,可以使用南丁格尔玫瑰图,其原理为:扇形的半径和面积是平方的关系,南丁格尔玫瑰图会将数值之间的差异放大,适合对比大小相近的数值。它不适合对比差异较大的数值。
此外,因为圆有周期性,玫瑰图也适于表示周期/时间概念,比如星期、月份。依然建议数据量不超过30条,超出可考虑条形图。
def pie_rosetype():
from pyecharts.charts import Pie
c = (Pie()
.add("",[list(z) for z in zip(["201{}年/{}季度".format(y,z)
for y in range(2)
for z in range(1,3)],[4.80,4.10,5.80,5.20])],
radius=["0%","75%"],
rosetype="radius",
label_opts=opts.LabelOpts(is_show=True),)
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰图示例")))
return c
pie_rosetype().render_notebook()
对于一些多维的性能数据,如王者荣耀等游戏中的玩家战力信息,常用雷达图表示。指标得分接近圆心,说明处于较差状态,应分析改进;指标得分接近外边线,说明处于理想状态。
from pyecharts import options as opts
from pyecharts.charts import Page, Radar
v1 = [[4300, 10000, 28000, 35000, 50000, 19000]]
v2 = [[5000, 14000, 28000, 31000, 42000, 21000]]
def radar_base()-> Radar:
c = (Radar()
.add_schema(schema=[
opts.RadarIndicatorItem(name='KDA',max_=6500),
opts.RadarIndicatorItem(name='输出',max_=16000),
opts.RadarIndicatorItem(name='经济',max_=30000),
opts.RadarIndicatorItem(name='生存',max_=38000),
opts.RadarIndicatorItem(name='推进',max_=52000),
opts.RadarIndicatorItem(name='打野',max_=25000),
]
)
.add("鲁班",v1,
color="red",
areastyle_opts=opts.AreaStyleOpts(
opacity=0.5,
color="red"),)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="英雄成长对比"))
.add("后裔", v2,
color="blue",
areastyle_opts = opts.AreaStyleOpts(
opacity = 0.5,#透明度
color="blue"
),))
return c
radar_base().render_notebook()
部分相较于整体,一个整体被分成几个部分。这类情况会用到构成型图表,如五大产品的收件量占比、公司利润的来源构成等。
对于参与构成研究的数据不超过9个时,可以使用饼图来绘制,如果超过了建议使用条形图来展示。
def pie_base():
from pyecharts.charts import Pie,Page
from pyecharts import options as opts
v1 = ["啤酒","可乐","雪碧","咖啡","奶茶"]
v2 = [30,19,21,12,18]
c = (
Pie()
.add("",[list(z) for z in zip(v1,v2)])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}%"))
.set_global_opts(title_opts=opts.TitleOpts(title="销售收入占比")))#格式化标签输出内容
return c
pie_base().render_notebook()
通过分布&联系型图表能看到数据的分布情况,进而找到某些联系,如相关性、异常值和数据集群。
常见使用场景:客户的分布与哪些因素相关、身高与体重的相关性分析等
查看两个变量的关系使用散点图,以贷款业务为例,查看年龄与信用的关系
部分用户数据:
用户 | 年龄 | 身份特质 | 行为偏好 | 履约能力 | 人脉关系 | 信用历史 | 信用分 |
---|---|---|---|---|---|---|---|
小明 | 32 | 89 | 90 | 88 | 92 | 95 | 771 |
小花 | 28 | 92 | 80 | 92 | 94 | 87 | 751 |
def scatter_render():
from pyecharts.charts import Scatter
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import pandas as pd
df = pd.DataFrame({"年龄":[32,28,23,24,21],
"信用分":[771,751,738,726,725],
"姓名":['小明','小花','小丽','小刚','小红']})
df.sort_values("年龄",inplace=True,ascending=True)#按年龄对数据做升序排序
c = (Scatter()
.add_xaxis(df.年龄.values.tolist())
.add_yaxis(
"信用分",
df[["信用分","姓名"]].values.tolist(),#传入信用分与姓名组合,方便js回调函数显示标签
label_opts=opts.LabelOpts(
formatter=JsCode(
"function(params){return params.value[2];}")))#通过定义JavaScript回调函数自定义标签
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-多维度数据"),
xaxis_opts=opts.AxisOpts(
name="年龄",
type_="value",#x轴数据类型是连续型的
min_=20),#x轴范围最小为20
yaxis_opts=opts.AxisOpts(
name="信用分",
min_=700)))
return c
scatter_render().render_notebook()
组合图就是将两种不同的图形绘制到同一图表中,我们以数据分析中常常用到的帕累托图为例,展示pyecharts如何绘制组合图。
帕累托法则又称为二八法则,即百分之八十的问题是百分之二十的原因造成的。
帕累托图(Pareto chart)又叫排列图、主次图,是按照发生频率大小顺序绘制的直方图,表示有多少结果是由已确认类型或范畴的原因所造成。
帕累托图在项目管理中主要用来找出产生大多数问题的关键原因来解决大多数问题,是将出现的质量问题按照重要程度依次排列的一种图表,从而可以直观地得出影响质量问题的主要因素。
主要特点:
柱形图的数据按数值的降序排列,折线图上的数据有累积百分比数据,并在次坐标轴显示;
折线图的起点数值为0%,并且位于柱形图第一个柱子的最左下角;
折线图的第二个点位于柱形图第一个柱子的最右上角 ;
折线图最后一个点数值为100%,位于整张图形的最右上角
数据:
问题数量(频数) | 累计销量 | 累计百分比 | |
---|---|---|---|
0% | |||
产品价格优势不突出 | 115 | 115 | 35% |
渠道经理服务不到位 | 99 | 214 | 65% |
营销活动频次不够 | 59 | 273 | 83% |
区域消费市场不景气 | 33 | 306 | 93% |
其他 | 23 | 329 | 100% |
def bar_overlap_line():
from pyecharts import options as opts
from pyecharts.charts import Bar, Line
x_data1 = ["产品价格优势不突出","渠道经理服务不到位",
"营销活动频次不够","区域消费市场不景气","其他"]
x_data2 = [*range(6)]
y_data1 = [115,99,59,33,23]
y_data2 = [0,35,65,83,93,100]
bar = Bar()
#添加x轴数据
bar.add_xaxis(xaxis_data=x_data1)
bar.add_yaxis( "问题数量(频数)",
y_data1,
category_gap=0,#设置柱形的间距
color="blue",)#设置柱形的填充颜色
bar.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")#设置x轴系列 )
bar.extend_axis(
xaxis=opts.AxisOpts( #设置x轴的参数
is_show=False,
position="top",))
bar.extend_axis(
yaxis=opts.AxisOpts(
axistick_opts=opts.AxisTickOpts( #刻度
is_inside=True,),
axislabel_opts=opts.LabelOpts(formatter="{value}%", #格式化刻度输出
position="right")))
bar.set_global_opts(
xaxis_opts=opts.AxisOpts( #设置x轴的参数
is_show=True,),#是否显示坐标轴
yaxis_opts=opts.AxisOpts(
max_=320,),#设置y轴最大取值范围
title_opts=opts.TitleOpts(title="帕累托图"))
line = Line()
line.add_xaxis(x_data2)
line.add_yaxis("累计百分比",
y_data2,
xaxis_index=1,#使用次x坐标轴
yaxis_index=1,#使用次y坐标轴
label_opts=opts.LabelOpts(is_show=False),
is_smooth=True,)
bar.overlap(line)#组合柱状图与折线图
return bar
bar_overlap_line().render_notebook()
骚话时间: 你永远赚不到认知之外的钱,就算凭运气赚到了,也一定会凭本事亏掉,这是一种必然。