Pyecharts可视化分析(一)
Pyecharts简介
Pyecharts是一个用于生成Echarts图表的类库。Echarts是百度开源的一个数据可视化JS库。用Echarts生成的图可视化效果非常好,而Pyecharts则是专门为了与Python衔接,方便在Python中直接使用的可视化数据分析图表。使用Pyecharts可以生成独立的网页格式的图表,还可以在flask、django中直接使用,非常方便。介绍Pyecharts的安装、链式调用、Pyecharts图表的组成,以及如何绘制柱状图、折线图、面积图、饼形图、箱形图、散点图、词云图、热力图、水球图和日历图。此外,本章还通过综合应用介绍南丁格尔玫瑰图、双y轴可视化数据分析图表的实现,以及饼形图与环形图组合图表的实现。
Pyecharts的安装
pip install pyecharts==1.7.1
#指定安装的版本是1.7.1
import pyecharts
print(pyecharts.__version__) #查看pyecharts版本号
注意:可以可能会出现报错【ImportError: cannot import name 'Iterable' from 'collections' 】 ,这时候找到以下文件,在collections后面加入.abc就可以解决了
绘制第一张图表
from pyecharts.charts import Bar
"""单独调用"""
# bar = Bar()
# bar.add_xaxis(['一月','二月','三月','四月','五月','六月'])
# bar.add_yaxis('零基础学python',[2567,1888,2345,1234,6678,6750])
# bar.add_yaxis('Python趣味编程',[1567,888,1345,234,5678,3750])
# bar.render('mycharts.html')
"""链式调用"""
bar2 = (
Bar()
.add_xaxis(['一月','二月','三月','四月','五月','六月'])
.add_yaxis('零基础学python',[2567,1888,2345,1234,6678,6750])
.add_yaxis('Python趣味编程',[1567,888,1345,234,5678,3750])
)
bar2.render('mycharts2.html')
"""
两者调用方法相关与联系:
单独调用:常规的方法 一个一个的方法进行调用
链式调用:关键在于方法化,现在很多的开源库或者代码都使用链式调用。将所有需要调用的
方法写在一个方法中,这样使得我们看代码的时候看上去会更加简洁易懂。
两个方法都可以去使用 如果不习惯链式调用的化 单独调用也可以的
"""
以上两种方法生成的结果是一致的。
Pyecharts图表的组成
Pyecharts不仅具备Matplotlib图表的一些常用功能,而且还提供了独有的、别具特色的功能。主要包括主题风格的设置、提示框、视觉映射、工具箱和区域缩放等。这些功能使得Pyecharts能够绘制出各种各样、超乎想象的图表。
主题风格
pyecharts内置提供了15种不同的主题风格,并提供了便捷的定制主题的方法。主要用Pyecharts中的options模块,通过该模块的InitOpts()方法设置图表的主题风格。
下面介绍的initOpt()方法的几个关键参数
参数说明:
可选择的风格有:
图表标题
图表标题主要通过set_global_options()方法的title_opts 参数进行配置,该参数值参考options模块的TitleOpts()方法,该方法可以实现主标题,副标题,距离设置以及文字样式等。
TilteOpts()方法主要参数说明如下:
TextStyleOpts()方法主要包括颜色、字体样式、字体的粗细、字体的大小以及对齐方式等。例如,设置标题颜色为红色,字体大小为18,代码如下:
title_textstyle_opts = opts.TextStyleOpts(color='red',font_size=18)
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
# x轴和y轴数据
.add_xaxis(['一月', '二月', '三月', '四月', '五月', '六月'])
.add_yaxis('零基础学python', [2567, 1888, 2345, 1234, 6678, 6750])
.add_yaxis('Python趣味编程', [1567, 888, 1345, 234, 5678, 3750])
# 设置图表标题
.set_global_opts(title_opts=opts.TitleOpts(
title='热门图书销量分析', #图表标题
padding=[10, 4, 5, 9], #内边距
subtitle= 'www.genius.com', #副标题文本
item_gap=5, #主副标题之间间距
# 主标题字体颜色和大小
title_textstyle_opts=opts.TextStyleOpts(color='red',font_size=18)
))
)
bar.render('mycharts3.html')
图例
设置图例主要通过set_global_opts()方法等legend_opts参数进行设置,该参数值参考options模块的legendOpts()方法。
LegendOpts()方法主要参数说明如下:
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 主题风格
# x轴与y轴数据
.add_xaxis(['一月', '二月', '三月', '四月', '五月', '六月'])
.add_yaxis('零基础学python', [2567, 1888, 2345, 1234, 6678, 6750])
.add_yaxis('Python趣味编程', [1567, 888, 1345, 234, 5678, 3750])
# 设置图表标题
.set_global_opts(
title_opts=opts.TitleOpts(
'热门图书销量分析',
padding=[10, 4, 5, 9],
subtitle='www.yueyue.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('mycharts4.html')
提示框
提示框的设置主要通过set_global_opts()方法的tooltip_opts参数进行设置,该参数值参考options模块中的TooltipOpts()方法。
主要参数说明如下:
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 主题风格
# x轴与y轴数据
.add_xaxis(['一月', '二月', '三月', '四月', '五月', '六月'])
.add_yaxis('零基础学python', [2567, 1888, 2345, 1234, 6678, 6750])
.add_yaxis('Python趣味编程', [1567, 888, 1345, 234, 5678, 3750])
# 设置图表标题
.set_global_opts(
title_opts=opts.TitleOpts(
title='热门图书销量分析', # 主标题
padding=[10, 4, 5, 9], # 标题内边距
subtitle='www.yueyue.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')
视觉映射
视觉映射通过 set_global_opts()方法中的 visualmap_opts参数进行设置,该参数的取值参考options模块的VisualMapOpts()方法。
主要参数说明如下:
from pyecharts import options as opts
from pyecharts.charts import Bar
bar = Bar()
# 为柱状图添加数据
bar.add_dataset([
['val','销量','月份'],
[24,10009,'1月'],
[57,19988,'2月'],
[74,38900,'3月'],
[50,12345,'4月'],
[99,50145,'5月'],
[68,29146,'6月']
])
bar.add_yaxis(
series_name='销量', # 系列名称
color='purple',
yaxis_data=[], # 系列数据
encode={'x':'销量','y':'月份'}, # 对x轴与y轴数据进行编码
label_opts=opts.LabelOpts(is_show=False) # 不显示标签文本
)
# 设置图表标题与视觉映射,并生成图表
bar.set_global_opts(
title_opts=opts.TitleOpts(
'线上图书月销量分析',subtitle='www.genius.com' # 主标题与副标题
),
xaxis_opts=opts.AxisOpts(name="销量"), # x轴坐标轴名称
yaxis_opts=opts.AxisOpts(type_='category'), # x轴坐标轴类型为'类目'
# 设置视觉映射
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')
工具箱
工具箱通过 set_global_opts()方法中的 toolbox_opts参数进行设置,该参数的取值参考options模块的ToolboxOpts()方法。
其主要参数如下:
from pyecharts import options as opts
from pyecharts.charts import Bar
bar = Bar()
# 为柱状图添加数据
bar.add_dataset([
['val','销量','月份'],
[24,10009,'1月'],
[57,19988,'2月'],
[74,38900,'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.yueyue.com' # 主标题与副标题
),
xaxis_opts=opts.AxisOpts(name="销量"), # x轴坐标轴名称
yaxis_opts=opts.AxisOpts(type_='category'), # x轴坐标轴类型为'类目'
# 设置视觉映射
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')
区域缩放
区域缩放通过 set_global_opts()方法中的 datazoom_opts参数进行设置,该参数的取值参考options模块的DataZoomOpts()方法。
其主要参数如下:
from pyecharts import options as opts
from pyecharts.charts import Bar
bar = Bar()
# 为柱状图添加数据
bar.add_dataset([
['val','销量','月份'],
[24,10009,'1月'],
[57,19988,'2月'],
[74,38900,'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.yueyue.com' # 主标题与副标题
),
xaxis_opts=opts.AxisOpts(name="销量"), # x轴坐标轴名称
yaxis_opts=opts.AxisOpts(type_='category'), # x轴坐标轴类型为'类目'
# 设置视觉映射
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),
# 区域缩放工具条
datazoom_opts=opts.DataZoomOpts()
)
bar.render('mycharts8.html')
柱状图——Bar模块
绘制柱状图通过Bar模块来实现,该模块的主要方法有:
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
# 导入数据
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)
)
bar.add_xaxis(x)
bar.add_yaxis('京东',y1)
bar.add_yaxis('天猫',y2)
bar.add_yaxis('自营',y3)
bar.render('mybar1.html')
折线/面积图——line模块
Line模块的主要方法有add_xaxis() 和 add_yaxis(),分别用来添加x轴数据和y轴数据。add_yaxis()的主要参数如下:
注意:绘制折线图时,x轴的数据必须是字符串,图线方可正常显示。
import pandas as pd
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType
# 导入数据
df = pd.read_excel('books.xlsx', sheet_name='Sheet2')
# x轴与y轴数据
x = list(df['年份'])
print(x)
x_data = [str(i) for i in x] #
y1 = list(df['京东'])
y2 = list(df['天猫'])
y3 = list(df['自营'])
line = Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 创建折线图
# 为折线图添加x轴和y轴数据
line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(series_name='京东', y_axis=y1)
line.add_yaxis(series_name='天猫', y_axis=y2)
line.add_yaxis(series_name='自营', y_axis=y3)
line.render('myline1.html')
绘制面积图时需要在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['年份'])
x_data = [str(i) for i in x]
y1 = list(df['京东'])
y2 = list(df['天猫'])
y3 = list(df['自营'])
line = Line() # 创建面积图
# 为面积图添加x轴和y轴数据
line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(series_name="自营", y_axis=y3, areastyle_opts=opts.AreaStyleOpts(opacity=1)) #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")
饼状图——pie模块
绘制饼形图使用的是Pie模块,该模块中需要使用的主要方法是add()方法该方法主要参数如下:
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 = [tuple(z) for z in zip(x_data, y_data)] #或者list(z)
# 数据排序
data.sort(key=lambda x: x[1])
pie = Pie() # 创建饼形图
# 为饼形图添加数据
pie.add(
series_name="地区", # 序列名称
data_pair=data, # 数据
)
pie.set_global_opts(
# 饼形图标题居中
title_opts=opts.TitleOpts(
title="各地区销量情况分析",
pos_left="center"),
# 不显示图例
legend_opts=opts.LegendOpts(is_show=False),
)
pie.set_series_opts(
# 序列标签
label_opts=opts.LabelOpts(),
)
# 渲染图表到HTML文件,存放在程序所在目录下
pie.render("mypie1.html")
箱型图——Boxplot模块
绘制箱线图使用的是Boxplot类。这里有一个细节,准备y轴数据y_data时需要在列表外再套一层列表,否则图线不会被显示。绘制箱线图使用的是Boxplot模块,
主要的方法有add_xaxis()和add_yaxis()
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')
涟漪特效散点图——EffectScatter模块
绘制涟漪图使用的是EffectScatter模块的add_xaxis()方法和add_yaxis()方法实现。
import pandas as pd
from pyecharts.charts import EffectScatter
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
# x轴与y轴数据
x = list(df['年份'])
x_data = [str(i) for i in x]
y1 = list(df['京东'])
y2 = list(df['天猫'])
y3 = list(df['自营'])
# 绘制涟漪图
scatter = EffectScatter()
scatter.add_xaxis(x_data)
scatter.add_yaxis('京东',y1)
scatter.add_yaxis('天猫',y2)
scatter.add_yaxis('自营',y3)
#渲染图表到html文件中
scatter.render('nyscatter.html')
词云图——WordCloud模块
绘制词云图使用的是WordCloud模块,主要的方法有add()方法。
add()方法的主要参数如下:
实现词云图首先需要通过jieba模块的TextRank算法从文本中提取关键词。TextRank是一种文本排序算法,是基于著名的网页排序算法PageRank改动而来。TextRank不仅能进行关键词提取,也能做自动文摘。根据某个词所连接的所有词汇的权重(权重指的是某一因素或指标相对于某一事物的重要程度,这里指某个词在整段文字中的重要程度),重新计算该词汇的权重,然后把重新计算的权重传递下去,直到这种变化达到均衡态,权重数值不再发生改变。根据最后的权重值,取其中排列靠前的词汇作为关键词。
from pyecharts.charts import WordCloud
from jieba import analyse
# 从文本中读取内容
with open('111.txt', mode='r', encoding='gbk') as file:
text = file.read()
# 基于TextRank算法从文本中提取关键词
textrank = analyse.textrank
keywords = textrank(text, topK=30)
# 关键字列表
list1 = []
for keyword, weight in textrank(text, topK=30, withWeight=True): #topK=30,30个词语
print(f'{keyword},{weight}')
list1.append((keyword, weight))
# 绘制词云图
wordcloud = WordCloud()
wordcloud.add('', list1, word_size_range=[20, 100])
wordcloud.render('wordcloud.html')
热力图——HeatMap模块
绘制热力图使用的是HeatMap模块。下面通过热力图统计2014-2019年双色球中奖号码出现的次数。
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import HeatMap
# 导入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")
水球图——Liquid模块
绘制水球图使用的是Liquid模块。
from pyecharts.charts import Liquid
# 绘制水球图
liquid = Liquid()
liquid.add('',[0.6])
liquid.render('myliquid.html')
日历图——Calendar模块
绘制日历图使用的是Calendar模块,主要使用的方法是add()方法。
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() # 行列转换
# 求最大值和最小值
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")
转载自:https://juejin.cn/post/7352387642845265960