说到数据分析,肯定离不开数据的可视化,毕竟图表比冷冰冰的数字更加直观,老板们只想一眼就能看出趋势和结论。
https://pyecharts.org/#/zh-cn/quickstart
今天我们就聊一聊 pyecharts 中几种常用的图表。
pyecharts的安装
pip install pyecharts
有兴趣的小伙伴们也可以看看我之前的可视化案例
古天乐的吕布有多猛?Python爬虫可视化告诉你!
Python实战|腾讯招聘你干什么?python可视化告诉你
Python实战| 9383字手把手教你使用多线程爬取瓜子二手车并且可视化展示!
爬虫+数据可视化选大学,小学妹直呼牛X
导入模块
使用到的相关库如下:
from pyecharts.charts import Bar
from pyecharts.charts import Pie
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import EffectScatter
from pyecharts.globals import SymbolType
from pyecharts.charts import Grid
from pyecharts.charts import WordCloud
from pyecharts.charts import Map
数据这里我们以之前瓜子二手车和高校排行数据为例,有兴趣的小伙伴可以参考:
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) for z in zip(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) for z in zip(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) for z in zip(type_name1, type_name2)]
data_pair.sort(key=lambda x: 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} <br/>{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) for z in zip(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) for z in zip(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")
)