- 本文来自《Python数据分析从入门到精通》_明日科技编著。
- Echarts是一个由百度开源的数据可视化工具,而Python是一门适用于数据处理和数据分析的语言,为了适应Python的需求,Pyecharts诞生了。
7.1 Pyecharts概述
7.1.1 Pyecharts简介
- Pytharts是一个用于生成Echarts图表的类库。Echarts是百度开源的一个数据可视化JS库。用Echarts生成的图可视化效果非常好,而Pytharts则是专门为了与Python衔接,方便在Python中直接使用的可视化图表。使用Pyecharts可以生成独立的网页格式的图表,还可以在flask、django中直接使用,非常方便。
- Pyecharts的图表类型非常多且效果非常漂亮(柱形图/条形图)、Funnel(漏斗图)、Gauge(仪表盘)、HeatMap(热力图)、Line(折线图/面积图)、Line3D(3D折线图)、Liquid(水球图)、Map(地图)、Parallel(平行坐标系)、Pie(饼图)、Polar(极坐标系)、Radar(雷达图)、Scatter(散点图)和WordCloud(词云图)等。
7.1.2 按照Pyecharts
pip install pyecharts==1.7.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
- 由于Pyecharts各个版本的相关代码有一些区别,因此这里建议安装与笔者相同的版本,以免造成不必要的麻烦。
7.1.3 绘制第一张图表
绘制简单的柱形图(01)
from pyecharts.charts import Bar # 从Pyecharts模块导入Bar对象
bar = Bar() # 创建一个空的Bar(柱状图)对象
# 定义x轴和y轴数据
bar.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
bar.add_yaxis("零基础学Python", [2567, 1888, 1359, 3400, 4050, 5500])
bar.add_yaxis("Python趣味案例编程", [1567, 988, 2270,3900, 2750, 3600])
# 渲染图表到HTML文件,存放在程序所在目录下
bar.render("mycharts.html")
- 运行程序,在程序所在路径下生成一个名为mycharts.html的HTML文件,效果如下:
7.2 Pyecharts图表的组成
- Pyecharts不仅具备Matplotlib图表的一些常用功能,而且还提供了独有的、别具特色的功能。主要包括主题风格的设置、提示框、视觉映射、工具箱和区域缩放等,如图7.6所示。这些功能使得Pyecharts能够绘制出各种各样、超乎想象的图表。
7.2.1 主题风格
- Pyecharts内置了15中不同的主题风格,并提供了便捷的定制主题的方法。主要使用Pyecharts库的options模块,通过该模块的ImitOpts()方法设置图表的主题风格,下面介绍InitOpts()方法的几个关键参数。
- 参数说明:
- width:字符型,图表画布宽度,以像素位单位,例如width=‘500px’
- height:字符型,图表画布高度,以像素为单位,例如height=‘300px’
- chart_id:图表的ID,图表的唯一标识,主要用于多张图表时以区分每张图表。
- page_title:字符型,网页标题。
- theme:图表主题,其参数值主要由ThemeType模块提供。
- bg_color:字符型,图表背景颜色,例如bg_color=‘black’或bg_color=’#fff’。
- 下面详细介绍以下ThemeType模块提供的15种图表主题风格,如表7.1所示。
为图表更换主题(02)
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
bar =(
Bar(init_opts=opts.InitOpts(width='500px',height='300px', # 设置画布大小
theme=ThemeType.LIGHT, # 设置主题
#theme=ThemeType.PURPLE_PASSION, # 紫色
bg_color='#fff')) # 设置图表背景颜色
# x轴和y轴数据
.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
.add_yaxis("零基础学Python", [2567, 1888, 1359, 3400, 4050, 5500])
.add_yaxis("Python趣味案例编程", [1567, 988, 2270,3900, 2750, 3600])
)
bar.render("mycharts1.html") # 渲染图表到HTML文件
7.2.2 图表标题
- 图表标题主要通过set_global_options()方法的title_opts参数进行设置,该参数参考options模块的TitleOpts()方法,该方法可以实现主标题、副标题、距离设置以及文字样式等。TitleOpts()方法主要参数说明如下:
title_texstyle_opts=opts.TextStyleOpts(color='red',font_size=18)
- subtitle_textstyle_opts:副标题文字样式配置项。同上。
为图表设置标题(03)
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
bar =(
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 主题风格
# x轴和y轴数据
.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
.add_yaxis("零基础学Python", [2567, 1888, 1359, 3400, 4050, 5500])
.add_yaxis("Python趣味案例编程", [1567, 988, 2270,3900, 2750, 3600])
# 设置图表标题
.set_global_opts(title_opts=opts.TitleOpts("热门图书销量分析", # 主标题
padding=[10,4,5,90], # 标题内边距
subtitle='www.mingrisoft.com', # 副标题
item_gap=5, # 主标题与副标题之间的间距
# 主标题字体颜色和大小
title_textstyle_opts=opts.TextStyleOpts(color='red',font_size=18)
))
)
bar.render("mycharts2.html")
7.2.3 图例
- 设置图例主要通过set_global_opts参数进行设置,该参数值参考options模块的LegendOpts()方法。LegendOpts()方法主要参数说明如下:
为图表设置图例(04)
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
bar =(
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 主题风格
# x轴和y轴数据
.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
.add_yaxis("零基础学Python", [2567, 1888, 1359, 3400, 4050, 5500])
.add_yaxis("Python趣味案例编程", [1567, 988, 2270,3900, 2750, 3600])
# 设置图表标题
.set_global_opts(title_opts=opts.TitleOpts("热门图书销量分析", # 主标题
padding=[10,4,5,90], # 标题内边距
subtitle='www.mingrisoft.com', # 副标题
item_gap=5, # 主标题与副标题之间的间距
# 主标题字体颜色和大小
title_textstyle_opts=opts.TextStyleOpts(color='red',font_size=18)),
# 设置图例
legend_opts=opts.LegendOpts(pos_right=50, # 图例离容器左侧的距离
item_width=45, # 图例标记的宽度
legend_icon='circle')) # 图例标记的样式为圆形
)
bar.render("mycharts3.html")
7.2.4 提示框
- 提示框的设置主要通过set_global_opts()方法的tooltip_opts参数进行设置,该参数值参考options模块的Tooltip()方法。TooltipOpts()方法主要参数说明如下:
- is_show:布尔值,是否显示提示框。
- trigger:提示框触发的类型,可选参数。item数据图形触发,主要在散点图和饼图等无类目轴的图表中使用。axis坐标轴触发,主要在柱状图和折线图等使用类目轴的图表中使用。None不触发,无提示框。
为图表设置提示框。(05)
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
bar =(
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 主题风格
# x轴和y轴数据
.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
.add_yaxis("零基础学Python", [2567, 1888, 1359, 3400, 4050, 5500])
.add_yaxis("Python趣味案例编程", [1567, 988, 2270,3900, 2750, 3600])
# 设置图表标题
.set_global_opts(title_opts=opts.TitleOpts("热门图书销量分析", # 主标题
padding=[10,4,5,90], # 标题内边距
subtitle='www.mingrisoft.com', # 副标题
item_gap=5, # 主标题与副标题之间的间距
# 主标题字体颜色和大小
title_textstyle_opts=opts.TextStyleOpts(color='red',font_size=18)),
# 设置图例
legend_opts=opts.LegendOpts(pos_right=50, # 图例离容器右侧的距离
item_width=45, # 图例标记的宽度
legend_icon='circle'), # 图例标记的样式为圆形
# 提示框
tooltip_opts=opts.TooltipOpts(trigger="axis", # 坐标轴触发
trigger_on='click', # 鼠标点击时触发
axis_pointer_type='cross', # 十字线指示器
background_color='blue', # 背景色为蓝色
border_width=2, # 边框宽度
border_color='red') # 边框颜色为红色
)
)
bar.render("mycharts5.html") # 生成图表
7.2.5 视觉映射
为图表添加视觉映射(06)
from pyecharts import options as opts
from pyecharts.charts import Bar
bar=Bar()
# 为柱状图添加数据
bar.add_dataset(source=[
["val", "销量","月份"],
[24, 10009, "1月"],
[57, 19988, "2月"],
[74, 39870, "3月"],
[50, 12345, "4月"],
[99, 50145, "5月"],
[68, 29146, "6月"]
]
)
bar.add_yaxis(
series_name="销量", # 系列名称
yaxis_data=[], # 系列数据
encode={"x": "销量", "y": "月份"}, # 对x轴y轴数据进行编码
label_opts=opts.LabelOpts(is_show=False) #不显示标签文本
)
bar.set_global_opts(
title_opts=opts.TitleOpts("线上图书月销量分析", # 主标题
subtitle='www.mingrisoft.com'), # 副标题
xaxis_opts=opts.AxisOpts(name="销量"), # x轴坐标轴名称
yaxis_opts=opts.AxisOpts(type_="category"), # y轴坐标轴类型为“类目”
# 视觉映射
visualmap_opts=opts.VisualMapOpts(
orient="horizontal", # 水平放置颜色条
pos_left="center", # 居中
min_=10, # 颜色条最小值
max_=100, # 颜色条最大值
range_text=["High", "Low"], # 颜色条两端的文本
dimension=0, # 颜色条映射的维度
range_color=["#FFF0F5", "#8B008B"] # 颜色范围
)
)
bar.render("mycharts6.html") # 生成图表
7.2.6 工具箱
为图表添加工具箱(可下载保存图片)(07)
from pyecharts import options as opts
from pyecharts.charts import Bar
bar=Bar()
# 为柱状图添加数据
bar.add_dataset(source=[
["val", "销量","月份"],
[24, 10009, "1月"],
[57, 19988, "2月"],
[74, 39870, "3月"],
[50, 12345, "4月"],
[99, 50145, "5月"],
[68, 29146, "6月"]
]
)
bar.add_yaxis(
series_name="销量", # 系列名称
yaxis_data=[], # 系列数据
encode={"x": "销量", "y": "月份"}, # 对x轴y轴数据进行编码
label_opts=opts.LabelOpts(is_show=False) #不显示标签文本
)
bar.set_global_opts(
title_opts=opts.TitleOpts("线上图书月销量分析", # 主标题
subtitle='www.mingrisoft.com'), # 副标题
xaxis_opts=opts.AxisOpts(name="销量"), # x轴坐标轴名称
yaxis_opts=opts.AxisOpts(type_="category"), # y轴坐标轴类型为“类目”
# 视觉映射
visualmap_opts=opts.VisualMapOpts(
orient="horizontal", # 水平放置颜色条
pos_left="center", # 居中
min_=10, # 颜色条最小值
max_=100, # 颜色条最大值
range_text=["High", "Low"], # 颜色条两端的文本
dimension=0, # 颜色条映射的维度
range_color=["#FFF0F5", "#8B008B"] # 颜色范围
),
# 工具箱
toolbox_opts=opts.ToolboxOpts(is_show=True, # 显示工具箱
pos_left=700) # 工具箱离容器左侧的距离
)
bar.render("mycharts7.html") # 生成图表
7.2.7 区域缩放
为图表添加区域缩放(08)
from pyecharts import options as opts
from pyecharts.charts import Bar
bar=Bar()
# 为柱状图添加数据
bar.add_dataset(source=[
["val", "销量","月份"],
[24, 10009, "1月"],
[57, 19988, "2月"],
[74, 39870, "3月"],
[50, 12345, "4月"],
[99, 50145, "5月"],
[68, 29146, "6月"]
]
)
bar.add_yaxis(
series_name="销量", # 系列名称
yaxis_data=[], # 系列数据
encode={"x": "销量", "y": "月份"}, # 对x轴y轴数据进行编码
label_opts=opts.LabelOpts(is_show=False) #不显示标签文本
)
bar.set_global_opts(
title_opts=opts.TitleOpts("线上图书月销量分析", # 主标题
subtitle='www.mingrisoft.com'), # 副标题
xaxis_opts=opts.AxisOpts(name="销量"), # x轴坐标轴名称
yaxis_opts=opts.AxisOpts(type_="category"), # y轴坐标轴类型为“类目”
# 视觉映射
visualmap_opts=opts.VisualMapOpts(
orient="vertical", # 竖直放置颜色条
pos_right=20, # 离容器右侧的距离
pos_top=100, # 离容器顶端的距离
min_=10, # 颜色条最小值
max_=100, # 颜色条最大值
range_text=["High", "Low"], # 颜色条两端的文本
dimension=0, # 颜色条映射的维度
range_color=["#FFF0F5", "#8B008B"] # 颜色范围
),
# 工具箱
toolbox_opts=opts.ToolboxOpts(is_show=True, # 显示工具箱
pos_left=700), # 工具箱离容器左侧的距离
# 区域缩放工具条
datazoom_opts=opts.DataZoomOpts()
)
bar.render("mycharts8.html") # 生成图表
7.3 柱状图——Bar模块
- 绘制柱状图条形图主要使用Bar模块实现,主要方法介绍如下。
- add_xaxis():x轴数据。
- add_yaxis():y轴数据。
- reversal_axis():翻转x、y轴数据。
- add_dataset():原始数据。一般来说,原始数据表达的是二维表。
绘制多柱形图(09)
- 上述内容简单介绍了柱状图的绘制,下面通过Pandas导入Excel文件中的数据,然后绘制多柱状图,分析近7年各个电商平台的销量情况,具体步骤如下所示。
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
# 导入Excel文件
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
# x轴和y轴数据
x=list(df['年份'])
y1=list(df['京东'])
y2=list(df['天猫'])
y3=list(df['自营'])
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 创建柱状图并设置主题
# 为柱状图添加x轴和y轴数据
bar.add_xaxis(x)
bar.add_yaxis('京东',y1)
bar.add_yaxis('天猫',y2)
bar.add_yaxis('自营',y3)
# 渲染图表到HTML文件,存放在程序所在目录下
bar.render("mybar1.html")
7.3.2 折线/面积图——Line模块
- AreaStypleOpts()方法,例如areastyle_opts=opts.AreaStyleOpts(opacity=1)。
绘制折线图(10)
import pandas as pd
from pyecharts.charts import Line
# 导入Excel文件
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
x=list(df['年份'])
y1=list(df['京东'])
y2=list(df['天猫'])
y3=list(df['自营'])
line=Line() # 创建折线图
# 为折线图添加x轴和y轴数据
line.add_xaxis(xaxis_data=x)
line.add_yaxis(series_name="京东",y_axis=y1)
line.add_yaxis(series_name="天猫",y_axis=y2)
line.add_yaxis(series_name="自营",y_axis=y3)
# 渲染图表到HTML文件,存放在程序所在目录下
line.render("myline1.html")
绘制面积图(11)
- 使用Line模块还可以绘制面积图,主要通过在add_yaxis()方法中指定areastyle_opts参数,该参数值由options模块的AreaStyleOpts()方法提供。下面绘制面积图,具体步骤如下所示。
import pandas as pd
from pyecharts.charts import Line
from pyecharts import options as opts
# 导入Excel文件
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
x=list(df['年份'])
y1=list(df['京东'])
y2=list(df['天猫'])
y3=list(df['自营'])
line=Line() # 创建面积图
# 为面积图添加x轴和y轴数据
line.add_xaxis(xaxis_data=x)
line.add_yaxis(series_name="自营",y_axis=y3,areastyle_opts=opts.AreaStyleOpts(opacity=1))
line.add_yaxis(series_name="京东",y_axis=y1,areastyle_opts=opts.AreaStyleOpts(opacity=1))
line.add_yaxis(series_name="天猫",y_axis=y2,areastyle_opts=opts.AreaStyleOpts(opacity=1))
# 渲染图表到HTML文件,存放在程序所在目录下
line.render("myline2.html")
7.3.3 饼形图——Pie模块
- 绘制饼形图主要使用Pie模块的add()方法实现。下面介绍add()方法的几个主要参数。
饼形图分析各地区销量占比情况(12)
import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts
# 导入Excel文件
df = pd.read_excel('data2.xls')
x_data=df['地区']
y_data=df['销量']
# 将数据转换为列表加元组的格式([(key1, value1), (key2, value2)])
data=[list(z) for z in zip(x_data, y_data)]
data
7.3.4 箱形图——Boxplot模块
绘制简单的箱形图(13)
import pandas as pd
from pyecharts.charts import Boxplot
# 导入Excel文件
df = pd.read_excel('Tips.xlsx')
y_data=[list(df['总消费'])]
boxplot=Boxplot() #创建箱形图
# 为箱形图添加数据
boxplot.add_xaxis([""])
boxplot.add_yaxis('',y_axis=boxplot.prepare_data(y_data))
# 渲染图表到HTML文件,存放在程序所在目录下
boxplot.render("myboxplot.html")
7.3.5 涟漪特效散点图——EffectScatter模块
绘制简单的散点图(14)
- 绘制涟漪特效散点图主要使用EffectScatter模块的add_xaxis()方法和add_yaxis()方法实现。下面绘制一个简单的涟漪特效散点图,程序代码如下:
import pandas as pd
from pyecharts.charts import EffectScatter
# 导入Excel文件
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
# x轴和y轴数据
x=list(df['年份'])
y1=list(df['京东'])
y2=list(df['天猫'])
y3=list(df['自营'])
# 绘制涟漪散点图
scatter=EffectScatter()
scatter.add_xaxis(x)
scatter.add_yaxis("",y1)
scatter.add_yaxis("",y2)
scatter.add_yaxis("",y3)
# 渲染图表到HTML文件,存放在程序所在目录下
scatter.render("myscatter.html")
7.3.6 词云图——WordCloud模块
- 绘制词云图主要使用WordCloud模块的add()方法实现。下面介绍add()方法的几个主要参数。
- series_name:系列名称。用于提示文本和图例标签。
- data_pair:数据项。格式为[(word1,count1),(word2,count2)]。可使用zip()函数将可迭代对象打包成元组,然后再转换成列表。
- shape:字符型,词云图的轮廓。其值为circle、cardioid、diamond、triangle-forward、triangle、pentagon或star。
- mask_image:自定义图片(支持的图片格式为jpg、jpeg、png和ico)。该参数支持base64(一种基于64个可打印字符来表示二进制的方法)和本地文件路径(相对或者绝对路径都可以)。
- word_gap:单词间隔。
- word_size_range:单词字体大小范围。
- rotate_step:旋转单词角度。
- pos_left:距离左侧的距离。
- pos_top:距离顶部的距离。
- pos_right:距离右侧的距离。
- pos_bottom:距离顶部的距离。
- width:词云图的宽度。
- height:词云图的高度。
- 实现词云图首先需要通过jieba模块的TextRank算法从文本中提取关键词。TextRank是一种文本排序算法,是基于著名的网页排序算法PageRank改动而来。TextRank不仅能进行关键词提取,也能做自动文摘。
- 根据某个词所连接的所有词汇的权重(权重是指某一因素相对于某一事物的重要程度,这里指某个词在整段文字中的重要程度),重新计算该词汇的权重,然后把重新计算的权重传递下去,知道这种变化达到均衡态,权重数值不再发生改变。根据最后的权重值,取其中排列靠前的词汇作为关键词。
绘制词云图分析用户评论内容。(15)
from pyecharts.charts import WordCloud
from jieba import analyse
# 基于TextRank算法从文本中提取关键词
textrank = analyse.textrank
text = open('111.txt','r',encoding='gbk').read()
keywords = textrank(text,topK=30)
list1=[]
tup1=()
# 关键词列表
for keyword, weight in textrank(text,topK=30, withWeight=True):
print('%s %s' % (keyword, weight))
tup1=(keyword,weight) #关键词权重
list1.append(tup1) #添加到列表中
# 绘制词云图
mywordcloud=WordCloud()
mywordcloud.add('',list1,word_size_range=[20,100])
mywordcloud.render('wordclound.html')
7.3.7 热力图——HeatMap模块
热力图统计双色求中奖号码出现次数(16)
import pyecharts.options as opts
from pyecharts.charts import HeatMap
import pandas as pd
# 导入Excel文件
df=pd.read_csv('data.csv',encoding='gb2312')
series=df['中奖号码'].str.split(' ',expand=True) # 提取中奖号码
# 统计每一位中奖号码出现的次数
df1=df.groupby(series[0]).size()
df2=df.groupby(series[1]).size()
df3=df.groupby(series[2]).size()
df4=df.groupby(series[3]).size()
df5=df.groupby(series[4]).size()
df6=df.groupby(series[5]).size()
df7=df.groupby(series[6]).size()
#横向表合并(行对齐)
data = pd.concat([df1,df2,df3,df4,df5,df6,df7], axis=1,sort=True)
data=data.fillna(0) #空值NaN替换为0
data=data.round(0).astype(int)#浮点数转换为整数
# 数据转换为HeatMap支持的列表格式
value1=[]
for i in range(7):
for j in range(33):
value1.append([i,j,int(data.iloc[j,i])])
# 绘制热力图
x=['第1位','第2位','第3位','第4位','第5位','第6位','第7位']
heatmap=HeatMap(init_opts=opts.InitOpts(width='600px',height='650px'))
heatmap.add_xaxis(x)
heatmap.add_yaxis("aa",list(data.index),value=value1, # y轴数据
# y轴标签
label_opts=opts.LabelOpts(is_show=True,color='white',position="center"))
heatmap.set_global_opts(title_opts=opts.TitleOpts(title="统计2014~2019年双色球中奖号码出现的次数",pos_left="center"),
legend_opts=opts.LegendOpts(is_show=False),# 不显示图例
xaxis_opts=opts.AxisOpts( # 坐标轴配置项
type_="category", # 类目轴
splitarea_opts=opts.SplitAreaOpts( # 分隔区域配置项
is_show=True,
# 区域填充样式
areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
yaxis_opts=opts.AxisOpts( # 坐标轴配置项
type_="category", # 类目轴
splitarea_opts=opts.SplitAreaOpts( # 分隔区域配置项
is_show=True,
# 区域填充样式
areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
# 视觉映射配置项
visualmap_opts=opts.VisualMapOpts(is_piecewise=True, # 分段显示
min_=1,max_=170, # 最小值、最大值
orient='horizontal', # 水平方向
pos_left="center") # 居中
)
heatmap.render("heatmap.html")
7.3.8 水球图——Liquid模块
绘制水球图(17)
- 绘制水球图主要使用Liquid模块的add()方法。下面绘制一个简单的涟漪特效散点图,程序代码如下:
from pyecharts.charts import Liquid
# 绘制水球图
liquid=Liquid()
liquid.add('',[0.7])
liquid.render("myliquid.html")
7.3.9 日历图——Calendar模块
绘制加班日历图(18)
- 绘制日历图主要使用Calendar模块的add()方法实现。下面绘制一个简单的日历图,通过该日历图分析6月份加班情况,程序代码如下:
- 原始数据如下:
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Calendar
# 导入Excel文件
df=pd.read_excel('202001.xls')
data=df.stack() # 行列转换
data
# 求最大值和最小值
mymax=round(max(data),2)
mymin=round(min(data),2)
# 生成日期
index=pd.date_range('20200601','20200630')
# 合并列表
data_list=list(zip(index,data))
# 生成日历图
calendar=Calendar()
calendar.add("",
data_list,
calendar_opts=opts.CalendarOpts(range_=['2020-06-01','2020-06-30']))
calendar.set_global_opts(
title_opts=opts.TitleOpts(title="2020年6月加班情况",pos_left='center'),
visualmap_opts=opts.VisualMapOpts(
max_=mymax,
min_=mymin+0.1,
orient="horizontal",
is_piecewise=True,
pos_top="230px",
pos_left="70px",
),
)
calendar.render("mycalendar.html")
7.4 综合应用
7.4.1 南丁格尔玫瑰图
- 下面使用Pie模块绘制南丁格尔玫瑰图:
- 南丁格尔玫瑰图主要通过绘制饼图实现,其中一个关键点是设置rosetype参数为area,具体实现步骤如下所示。
(1)导入相关包
import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts
(2)导入Excel文件
# 导入Excel文件
df = pd.read_excel('data2.xls')
x_data=df['地区']
y_data=df['累计']
# 将数据转换为列表加元组的格式([(key1, value1), (key2, value2)])
data=[list(z) for z in zip(x_data, y_data)]
# 数据排序
data.sort(key=lambda x: x[1])
(3)绘制男丁格尔玫瑰图
# 创建饼形图并设置画布大小
pie=Pie(init_opts=opts.InitOpts(width='800px',height='400px'))
# 为饼形图添加数据
pie.add(
series_name="地区", # 序列名称
data_pair=data, # 数据
radius=["8%","160%"], #内外半径
center=["60%","80%"], # 位置
rosetype='area', # 玫瑰图
color='auto' # 颜色自动渐变
)
pie.set_global_opts(
# 不显示图例
legend_opts=opts.LegendOpts(is_show=False),
# 视觉映射
visualmap_opts=opts.VisualMapOpts(is_show=False,
min_=100, # 颜色条最小值
max_=450000, # 颜色条最大值
)
)
pie.set_series_opts(
# 序列标签
label_opts=opts.LabelOpts(position='inside', # 标签位置
rotate=45,
font_size=8) # 字体大小
#formatter="{b}: {c}") # 标签格式
)
# 渲染图表到HTML文件,存放在程序所在目录下
pie.render("mypie1.html")
7.4.2 双y轴可视化数据分析图表的实现(柱形图+折线图)
- 双y轴顾名思义就是两个y轴,下面实现柱形图+折线图双y轴图表的绘制,其中柱形图y表示月销量,折线图y轴表示3个平台的月销售平均量,效果如下:
import pyecharts.options as opts
from pyecharts.charts import Bar, Line
import pandas as pd
import numpy
# 导入Excel文件
df=pd.read_excel('books.xlsx')
x_data =list(df['月份'])
y1=list(df['京东'])
y2=list(df['天猫'])
y3=list(df['自营'])
# 颜色列表
colors = ["#5793f3", "#FFD700", "#675bba"]
# 求平均值并保留整数位
y_average=list(((df['京东']+df['天猫']+df['自营'])/3).apply(numpy.round))
# 绘制柱形图
legend_list =["京东","天猫","自营"]
bar = (
Bar(init_opts=opts.InitOpts(width="1000px", height="500px"))
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="京东",
yaxis_data=y1,
color=colors[0],
yaxis_index=0,
)
.add_yaxis(
series_name="天猫",yaxis_data=y2,color=colors[1]
)
.add_yaxis(
series_name="自营",yaxis_data=y3,color=colors[2]
)
.extend_axis(yaxis=opts.AxisOpts())
)
# 绘制折线图
line =Line()
line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(
series_name="平均销量",
y_axis=y_average, # y轴平均值
color='red',
yaxis_index=1,
)
# 渲染图表到HTML文件,存放在程序所在目录下
bar.overlap(line).render("barline.html")
- 实现双y轴可视化数据分析图表的两个关键点:一是使用Bar模块的extend_axis()方法扩展y轴;二是对add_yaxis()方法的yaxis_index参数进行设置,该参数用于指定y轴的索引值,从0开始。双y轴索引值分别为0和1。
7.4.3 饼形图与环形图组合图表的实现
- 饼形图和环形图组合,其中饼形图展示“北上广”三大主要城市的销量情况,环形图展示其他省份的销量情况:
import pyecharts.options as opts
from pyecharts.charts import Pie
# 饼形图数据
x1 = ["北京", "上海", "广州"]
y1 = [1168, 890,578]
data1 = [list(z) for z in zip(x1,y1)]
# 环形图数据
x2 = ["北京", "上海", "河南省", "广州", "湖南省", "四川省", "湖北省", "河北省", "江苏省", "浙江省"]
y2 = [1168, 890, 234, 578, 345, 225, 188, 101,999,1300]
data2 = [list(z) for z in zip(x2,y2)]
# 饼形图与环形图组合
(
Pie(init_opts=opts.InitOpts(width="1000px", height="600px"))
# 饼形图
.add(
series_name="销售地区",
data_pair=data1,
radius=[0, "30%"],
label_opts=opts.LabelOpts(position="inner"), # 饼形图标签
)
# 环形图
.add(
series_name="销售地区",
radius=["40%", "55%"],
data_pair=data2,
# 环形图标签
label_opts=opts.LabelOpts(
position="outside", # 标签位置
# 标签格式化
formatter="{a|{a}}{bg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",
background_color="#FAFAD2", # 背景色
border_color="#FFA500", # 边框颜色
border_width=1, # 边框宽度
border_radius=4, # 边框半径
# 利用富文本样式,定义标签效果
rich={
"a": {"color": "black", "lineHeight": 22, "align": "center"},
"bg": {
"backgroundColor": "#FFA500",
"width": "100%",
"align": "right",
"height": 22,
"borderRadius": [4, 4, 0, 0],
},
"hr": {
"borderColor": "#aaa",
"width": "100%",
"borderWidth": 0.5,
"height": 0,
},
"b": {"fontSize": 14, "lineHeight": 33},
"per": {
"color": "#eee",
"backgroundColor": "#334455",
"padding": [2, 4],
"borderRadius": 2,
},
},
),
)
.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical"))
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
)
)
.render("mypies.html")
)
- 绘制饼形图与环形图组合图表的一个关键点就是创建两个饼形图,并设置不同的半径(radius参数),具体实现步骤如下所示。
7.5 小节
- 相比Matplotlib和Searnborn Pyecharts绘制出的图表更加令人惊叹,其动感效果更是Matplotlib和Searnborn无法比拟的,但也存在不足之处。其生成的图表为网页格式,不能够随时查看,需要打开文件进行浏览。Pyecharts更适合Web程序。
- Pyecharts还有很多功能,由于篇幅有限不能一一介绍,希望读者在学习过程中嫩巩固举一反三,绘制出更多精彩的数据分析图表。