说到数据分析,肯定离不开数据的可视化,毕竟图表比冷冰冰的数字更加直观,老板们只想一眼就能看出趋势和结论。
https://pyecharts.org/#/zh-cn/quickstart
今天我们就聊一聊 pyecharts 中几种常用的图表。
pyecharts的安装
pip install pyecharts
有兴趣的小伙伴们也可以看看我之前的可视化案例
古天乐的吕布有多猛?Python爬虫可视化告诉你!
Python实战|腾讯招聘你干什么?python可视化告诉你
Python实战| 9383字手把手教你使用多线程爬取瓜子二手车并且可视化展示!
爬虫+数据可视化选大学,小学妹直呼牛X
导入模块
使用到的相关库如下:
frompyecharts.chartsimportBar
frompyecharts.chartsimportPie
frompyecharts.chartsimportLine
frompyechartsimportoptionsasopts
frompyecharts.chartsimportEffectScatter
frompyecharts.globalsimportSymbolType
frompyecharts.chartsimportGrid
frompyecharts.chartsimportWordCloud
frompyecharts.chartsimportMap
数据这里我们以之前瓜子二手车和高校排行数据为例,有兴趣的小伙伴可以参考:
python实战| 二手车难买?手把手带你爬取瓜子二手车-二级页面
爬虫+数据可视化选大学,小学妹直呼牛X
我们先使用pandas导入数据,关于pandas的技巧大家可以参考:
让人无法拒绝的pandas技巧,简单却好用到爆!
柱状图
数据准备
pd_data = pd.read_excel('瓜子二手车.xlsx')
pd.set_option('display.max_columns',None)# 显示完整的列
pd.set_option('display.max_rows',None)# 显示完整的行
pd.set_option('display.expand_frame_repr',False)# 设置不折叠数据
print(pd_data.head())
# 统计 过户分类 以及对应次数
trans_count = pd_data['过户情况'].value_counts()
# 针对于过户情况的分类
x_data = trans_count.index.tolist()
# 分类后各组数据的统计
y_data = trans_count.tolist()
print(x_data)
print(y_data)
'''
['1次过户', '0次过户', '3次过户']
[10, 8, 1]
'''
绘图
# 柱状图
bar = Bar()
bar.add_xaxis(x_data)
bar.add_yaxis("过户次数", y_data)
bar.set_global_opts(title_opts=opts.TitleOpts(title="Bar - 二手车过户展示图"))
bar.render('二手车过户展示图.shtml')
当然有时候还可以在一个柱状图中添加多个 y 轴记录,实现多个柱状对比,只需调用多一次 add_yaxis 即可。
当然pyecharts还支持链式调用,实现的功能一致,代码如下:
# 柱状图
z_data = [22,12,18]
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis("20年过户次数", y_data)
.add_yaxis("21年过户次数", z_data)
.set_global_opts(title_opts=opts.TitleOpts(title="Bar - 二手车过户对比展示图"))
)
bar.render('二手车对比过户展示图.shtml')
有时候,柱状图太高不方便看,我们还可以将 x 轴和 y 轴互换,生成横向的柱状图。多柱状图和 xy 轴互换不冲突,可叠加使用。
# 柱状图
z_data = [22,12,18]
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis("20年过户次数", y_data)
.add_yaxis("21年过户次数", z_data)
.reversal_axis()
.set_global_opts(title_opts=opts.TitleOpts(title="Bar - 二手车过户横向对比展示图"))
)
bar.render('二手车横向对比过户展示图.shtml')
饼状图
饼状图也是使用频率很高的图表之一,尤其是适用于百分比类的图,可以很直观的看出来各个类别所占据总体份额的比例。
数据准备
pd_data = pd.read_excel('全国高校数据.xlsx')
pd.set_option('display.max_columns',None)# 显示完整的列
pd.set_option('display.max_rows',None)# 显示完整的行
pd.set_option('display.expand_frame_repr',False)# 设置不折叠数据
type_name = pd_data['type_name'].value_counts()
type_name1 = type_name.index.tolist()# 大学类型分布图
type_name2 = type_name.tolist()# 大学类型数量
绘图
# 绘制饼图
c = (
Pie()
.add("", [list(z)forzinzip(type_name1, type_name2)])
.set_global_opts(title_opts=opts.TitleOpts(title="大学类型分布图"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("大学类型.shtml")
)
环形饼图
c = (
Pie()
.add(
"",
[list(z)forzinzip(type_name1, type_name2)],
radius=["40%","55%"],
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(title_opts=opts.TitleOpts(title="高校类型对比饼图"))
.render("高校类型对比饼图.shtml")
)
饼图2
data_pair = [list(z)forzinzip(type_name1, type_name2)]
data_pair.sort(key=lambdax: x[1])
(
Pie(init_opts=opts.InitOpts(width="1600px", height="800px", bg_color="#2c343c"))
.add(
series_name="访问来源",
data_pair=data_pair,
rosetype="radius",
radius="55%",
center=["50%","50%"],
label_opts=opts.LabelOpts(is_show=False, position="center"),
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="高校饼图",
pos_left="center",
pos_top="20",
title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
),
legend_opts=opts.LegendOpts(is_show=False),
)
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a}
{b}: {c} ({d}%)"),
label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),
)
.render("高校饼图.html")
)
折线图
折线图通常是来展示数据在不同时间段的走势,例如比较经典的股市 K 线图就是折线图的一种。
pd_data = pd.read_excel('全国高校数据.xlsx')
type_name = pd_data['type_name'].value_counts()
type_name1 = type_name.index.tolist()# 理工 vs 综合
type_name2 = type_name.tolist()# 理工 vs 综合对应数量
print(type_name1)
print(type_name2)
绘图
# 折线图
line = (
Line()
.add_xaxis(type_name1)
.add_yaxis('china', type_name2)
.set_global_opts(title_opts=opts.TitleOpts(title="高校人气值"))
)
line.render('高校人气值.shtml')
同样,和柱状图类似,折线图也可以在一个图中添加多个 y 轴记录。
line = (
Line()
.add_xaxis(type_name1)
.add_yaxis('2020', type_name2)
.add_yaxis('2021', z_data)
.set_global_opts(title_opts=opts.TitleOpts(title="双折线图"))
)
line.render('高校人气值双折线图.shtml')
当然了还有阶梯折线图,同样可以实现
line = (
Line()
.add_xaxis(type_name1)
.add_yaxis('2020', type_name2, is_step=True)
.add_yaxis('2021', z_data, is_step=True)
.set_global_opts(title_opts=opts.TitleOpts(title="阶梯折线图"))
)
line.render('高校人气值阶梯图.shtml')
地图
有时我们会希望将数据展示在地图上,比如全国疫情状况,全国各省份人口数据,微信好友各省份分布等。
数据准备
pd_data = pd.read_excel('全国高校数据.xlsx')
school_num = pd_data.province_name.value_counts().sort_values()
school_num1 = school_num.index.tolist()
school_num2 = school_num.values.tolist()
print(school_num1)
print(school_num2)
绘图
map = (
Map()
.add("", [list(z)forzinzip(school_num1, school_num2)],"china")
.set_global_opts(
title_opts=opts.TitleOpts(title="中国地图示例"),
visualmap_opts=opts.VisualMapOpts(max_=5, is_piecewise=True),
)
)
map.render('全国高校分布图.shtml')
漏斗图
数据准备
pd_data = pd.read_excel('./全国高校数据.xlsx')
# 去除 ’w‘
pd_data.loc[:,'view_total1'] = pd_data['view_total'].str.replace('w','').astype('float64')
# 划分价格区间
pd_data['view_total区间'] = pd.cut(pd_data['view_total1'], [0,500,1000,1500,2000,2500,3000,3500],
labels=['0-500','500-1000','1000-1500','1500-2000','2000-2500','2500-3000',
'>3000'])
# 统计数量
popular = pd_data['view_total区间'].value_counts()
popular1 = popular.index.tolist()# 人气值分类
popular2 = popular.tolist()# 人气值分类对应数量'''
print(popular1)
print(popular2)
绘图
c = (
Funnel()
.add(
"高校",
[list(z)forzinzip(popular1, popular2)],
label_opts=opts.LabelOpts(position="inside"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="人气值漏斗图"))
.render("人气值漏斗图.shtml")
)
仪表盘
c = (
Gauge()
.add(
"及格指标",
[("及格率",75.5)],
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(
color=[(0.3,"#67e0e3"), (0.7,"#37a2da"), (1,"#fd666d")], width=30
)
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="期末成绩及格率"),
legend_opts=opts.LegendOpts(is_show=False),
)
.render("成绩及格率.html")
)
水滴图
c = (
Liquid()
.add("lq", [0.45], is_outline_show=False)
.set_global_opts(title_opts=opts.TitleOpts(title="完成率"))
.render("liquid_without_outline.html")
)