一、Pyecharts 认识
Pyecharts 是一个用于生成 Echarts 图表的类库
Echarts 是百度开源的一个数据可视化 JS 库,主要用于数据可视化,Pyecharts 是一 个用于生成 Echarts 图表的类库。实际上就是 Echarts 与 Python 的对接
使用 Pyecharts 可以生成独立的网页,也可以在 flask , Django 中集成使用
安装:pip install pyecharts==1.5
二、Pyecharts图表绘制准备
1、全局配置项
全局配置项可通过 set_global_options 方法设置
主要配置的内容为:
2、系列配置项
可以使用 set_series_options 方法设置
主要用来配置用来配置字体、颜色、线条灯具体的参数
3、注意:数据格式
Pyecharts 本质上在做的事情就是将 Echarts 的配置项由 Python dict 序列化为 JSON 格式,所以 Pyecharts 支持什么格式的数据类型取决于 JSON 支持什么数据类型
Pyecharts 是一个通用的第三方库,我们不可能关心开发者的所有使用场景,这个转换 需要我们引入 numpy/pandas 两个第三方库,而这两个库太重要了,所以我们将这个工作交 给了开发者
具体转换方式:
可以使用 Series.tolist()进行快速转换
4、更多配置
更多配置理解可参考:http://pyecharts.org/#/zh-cn/
颜色对照表课参考:http://www.fynas.com/system-drawing-color
三、柱状图
以绘制某商家 A、商家 B 的各类商品售卖数量为例,绘制柱状图
衬衫 | 毛衣 | 领带 | 裤子 | 风衣 | 高跟鞋 | 袜子 | |
---|---|---|---|---|---|---|---|
商家 A | 114 | 55 | 27 | 101 | 125 | 27 | 105 |
商家 B | 57 | 134 | 137 | 129 | 145 | 60 | 49 |
代码实现:
from pyecharts import options as opts # 配置模块
from pyecharts.charts import Bar
# 1、实例化bar对象
bar = Bar()
# 2、添加数据
# 横轴数据
bar.add_xaxis(
xaxis_data=['衬衫', '毛衣', '领带', '裤子', '风衣', '高跟鞋', '袜子']
)
# 添加纵轴数据
bar.add_yaxis(
series_name='商家A', # 柱子名称
yaxis_data=[114, 55, 27, 101, 125, 27, 105], # 商家A的数据
)
# 添加纵轴数据
bar.add_yaxis(
series_name='商家B', # 柱子名称
yaxis_data=[57, 134, 137, 129, 145, 60, 49], # 商家A的数据
)
# 3、全局配置项
bar.set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(
title='Bar测试'
)
)
# 4、系列配置项
bar.set_series_opts(
# 设置标签
label_opts=opts.LabelOpts(
is_show=True,
position='right', # 标签位置
)
)
# 设置方向
bar.reversal_axis()
# 5、生成文件
bar.render('./柱状图.html')
四、饼图
以各个地区分校的 Python 系统班人数统计数据为例,绘制饼图
各个地区分校人数统计表
地区分校 | Python系统班人数 |
---|---|
北京 | 130 |
河南 | 65 |
广州 | 60 |
武汉 | 23 |
成都 | 30 |
杭州 | 33 |
代码实现:
# 导包
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import ThemeType # 主题模块
import pandas as pd
# 1、实例化对象
pie = Pie(
# 初始化配置
init_opts=opts.InitOpts(
width='1200px', # 画布宽度
height='500px', # 画布高度
# theme='white', # 主题 ,设置方式
theme=ThemeType.WHITE, # 主题,设置方式
page_title='Python分校人数占比饼图',
# bg_color='#F0F8FF', # 背景颜色
)
)
# 加载分校数据
data = pd.read_excel('./Python地区分校人数.xlsx')
print('data:\n', data)
# for tmp in zip(data.loc[:,'分校'].tolist(),data.loc[:,'人数'].tolist()):
# print(tmp)
data_pair = [(k, v) for k, v in zip(data.loc[:, '分校'].tolist(), data.loc[:, '人数'].tolist())]
print('data_pair:\n', data_pair)
# 2、添加数据
pie.add(
series_name=data.loc[:, '分校'].tolist(), # 图例名称
data_pair=data_pair, # 数据 ,格式为:[(k1,v1),(k2,v2),...],
radius=['30%', '70%'], # 半径,第一个为内径,第二个为外径,通常设置为百分数
is_clockwise=True, # 顺时针排布
)
# 3、设置全局配置项
pie.set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(
title='Python分校人数占比饼图', # 标题名称
subtitle='广州分校Python0421班级', # 子标题
pos_left='left', # 位置
),
# 设置图例
legend_opts=opts.LegendOpts(
is_show=True, # 展示图例
pos_left='center', # 位置 --居中
)
)
# 4、设置系列配置项
pie.set_series_opts(
# 设置标签
label_opts=opts.LabelOpts(
is_show=True, # 展示标签
font_size=12, # 字体大小
font_style='italic', # 字体风格,倾斜
formatter='{b}:{d}%', # 显示的样式 {a}系列名称 {b}数据项名称 {c}数值 {d}百分比
)
)
# 5、生成文件
pie.render('./Python分校人数占比饼图.html')
五、折线图
新型冠状病毒肺炎(Corona Virus Disease 2019,COVID-19),简称“新冠肺炎”,是指 2019 新型冠状病毒感染导致的肺炎,2019 年 12 月以来,湖北省武汉市部分医院陆续发 现了多例有华南海鲜市场暴露史的不明原因肺炎病例,现已证实为2019 新型冠状病毒感染 引起的急性呼吸道传染病
为此,湖北政府、各省、乃至国家对于新冠状病毒的疫情的发展状况非常重视,对于患
病人员迅速采取隔离、治疗
此案例,借助国家发布数据(部分),对于疫情数据进行统计分析
以截至2020年2月 6 日 10 时 49 分的全国疫情统计数据为例,绘制折线图、柱状图
中国疫情数据每日变化统计表
城市 | 时间 | 死亡数 | 治愈数 | 疑似数 | 省份 | 确诊数 |
---|---|---|---|---|---|---|
全国 | 2020-02-06 | 564 | 1180 | 24702 | 全国 | 28060 |
全国 | 2020-02-05 | 564 | 1153 | 24702 | 全国 | 28060 |
全国 | 2020-02-04 | 491 | 892 | 23260 | 全国 | 24363 |
全国 | 2020-02-03 | 425 | 630 | 23214 | 全国 | 20471 |
全国 | 2020-02-02 | 361 | 475 | 21558 | 全国 | 17238 |
全国 | 2020-02-01 | 304 | 328 | 19544 | 全国 | 14411 |
全国 | 2020-01-31 | 259 | 243 | 17988 | 全国 | 11821 |
全国 | 2020-01-30 | 213 | 171 | 15238 | 全国 | 9720 |
全国 | 2020-01-29 | 170 | 124 | 12167 | 全国 | 7736 |
全国 | 2020-01-28 | 132 | 103 | 9239 | 全国 | 5997 |
全国 | 2020-01-27 | 106 | 51 | 6973 | 全国 | 4535 |
全国 | 2020-01-26 | 80 | 49 | 5794 | 全国 | 2761 |
全国 | 2020-01-25 | 56 | 38 | 2684 | 全国 | 1985 |
全国 | 2020-01-24 | 41 | 38 | 1965 | 全国 | 1297 |
全国 | 2020-01-23 | 25 | 34 | 1072 | 全国 | 830 |
代码实现:
# 绘图模块
from pyecharts.charts import *
# 配置模块
from pyecharts import options as opts
# 主题模块
from pyecharts.globals import ThemeType
import pandas as pd
# 1、实例化对象
bar = Bar(
# init_opts=opts.InitOpts(
# width='2000px',
# # height='700px'
# )
)
# 加载数据
history_data = pd.read_excel('./疫情历史数据.xls', index_col=0)
print('history_data:\n', history_data)
# 获取横轴数据
# (1)获取到时间数据,然后修改其类型为 str
x_data = history_data.loc[:, '时间'].astype('str')
# (2)反过来
x_data = x_data[::-1].tolist()
print('x_data:\n', x_data)
# 准备纵轴数据
# 死亡数据
death_data = history_data.loc[:, '死亡数'][::-1].tolist()
print('death_data:\n', death_data)
# 确诊数据
ensure_data = history_data.loc[:, '确诊数'][::-1].tolist()
print('ensure_data:\n', ensure_data)
# 疑似数据
suspected_data = history_data.loc[:, '疑似数'][::-1].tolist()
print('suspected_data:\n', suspected_data)
# 治愈数据
cure_data = history_data.loc[:, '治愈数'][::-1].tolist()
print('cure_data:\n', cure_data)
# 2、添加数据
# 横轴数据
bar.add_xaxis(
xaxis_data=x_data, # 横轴数据
)
# 纵轴数据
bar.add_yaxis(
series_name='死亡数', # 图例名称
yaxis_data=death_data, # 数据
yaxis_index=1, # 表示多个纵轴时,选择第1个纵轴作为死亡数的参考
)
bar.add_yaxis(
series_name='治愈数', # 图例名称
yaxis_data=cure_data, # 数据
yaxis_index=2, # 表示多个纵轴时,选择第2个纵轴作为 治愈数的参考
)
# 增加纵轴
bar.extend_axis(
# 增加一个纵轴
yaxis=opts.AxisOpts(
type_='value', # 坐标轴的类型
name='死亡数', # 坐标轴的名称
min_=0, # 最小值
max_=1200, # 最大值,
position='right', # 位置,右边
offset=0,
# 坐标线设置
axisline_opts=opts.AxisLineOpts(
is_show=True, # 显示坐标线,
# 坐标线的风格
linestyle_opts=opts.LineStyleOpts(
color='#a5a391', # 线的颜色
)
),
# 坐标线上标签设置
axislabel_opts=opts.LabelOpts(
is_show=True, # 展示轴线标签
position='top', # 标签位置
formatter='{value}' # 标签值
)
)
)
bar.extend_axis(
# 增加一个纵轴
yaxis=opts.AxisOpts(
type_='value', # 坐标轴的类型
name='治愈数', # 坐标轴的名称
min_=0, # 最小值
max_=1200, # 最大值,
position='right', # 位置,右边
offset=60,
# 坐标线设置
axisline_opts=opts.AxisLineOpts(
is_show=True, # 显示坐标线,
# 坐标线的风格
linestyle_opts=opts.LineStyleOpts(
color='#fd5956', # 线的颜色
)
),
# 坐标线上标签设置
axislabel_opts=opts.LabelOpts(
is_show=True, # 展示轴线标签
position='top', # 标签位置
formatter='{value}' # 标签值
)
)
)
bar.extend_axis