基本介绍
pyecharts是一个基于百度开发的echarts的一个第三方库,它绘制的图像功能更强大。交互性比较强,在用作展示等方面是一个值得使用的第三方库。在了解这个第三方库之前我们了解一下Echarts.
ECharts是一个免费的、功能强大的、可视化的一个库。它可以非常简单的往软件产品中添加直观的、动态的和高度可定制化的图表。它是一个全新的基于zrender的用纯JavaScript打造完成的canvas库。
如果你想了解详细的话,可以去官方网站查看。
pyecharts介绍
Echarts是一个由百度开源的数据可视化,能够进行良好的交互性,精巧的图表设计,得到了众多开发者的认可。而Python是一门富有表达力的语言,很适合用于数据处理。分析遇上数据可视化时,pyecharts诞生了。
✨特性
简洁的API设计,使用如丝滑般流畅,支持链式调用
囊括了30+种常见图表,应有尽有
支持主流Notebook环境,Jupyter Notebook和JupyterLab
可轻松集成至Flask,Django等主流Web框架
高度灵活的配置项,可轻松搭配出精美的图表
详细的文档和示例,帮助开发者重启的上手项目
超过400多个地图文件以及原生的百度地图,为地理数据可视化提供有意义的支持。
下面我们来学习具体如何使用。
入门绘制
pyecharts分为v0.5.X和v1两个大版本,v0.5.X和v1间不兼容,v1是一个全新的版本,在echarts中版本不同,对应的操作区别还是很大的。为了方便大家入门学习,我希望大家都采用我下面的版本号的pyecharts第三方库。
import pyecharts
print(pyecharts.__version__)
运行结果为:
1.5.1
版本不同的时候,我们采用对应的pip命令先卸载这个第三方库,在pip安装我们对应版本号的pyecharts第三方库。
pip install pyecharts==1.5.1
柱状图
下面我们开始绘制图像。首先以柱状图为例:
import pyecharts.charts as pyec
x = ['甲','乙','丙','丁']
y =[300,400,340,450]
bar = pyec.Bar()#实例化对象
bar.add_xaxis(x)#给一个空白柱状图添加横坐标数据
bar.add_yaxis(series_name='公司A',yaxis_data=y)#图例和y轴的坐标
bar.render_notebook()#显示在notebook笔记本上
运行结果为:
pyecharts更突出的特点的是交互性强,偏向用来展示,直观的观察保存图片和其他第三方库没区别。我们还可以保存为html文件这样更便于观察。
import pyecharts.charts as pyec
x = ['a','b','c','d']
y =[300,400,340,450]
bar = pyec.Bar()
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y)
#bar.render_notebook()#显示在notebook笔记本上
bar.render(r'C:\Users\lixue\Desktop\学习资料\数据可视化\render.html')#保存路径
bar.render()是设置保存的路径,我们也可以不设置,但它默认保存的是当前工作路径下。在刚入门学习,我还是推荐用jupyter notebook环境下显示。一个个保存的话查看起来不是特别方便。
我们还可以继续添加类别,比如上个图,我们可以另外还加一个B公司。
import pyecharts.charts as pyec
x = ['甲','乙','丙','丁']
y1=[300,400,340,450]
y2 =[200,100,300,500]
bar = pyec.Bar()
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1)
bar.add_yaxis(series_name='公司B',yaxis_data=y2)
bar.render_notebook()
运行结果是:
我们还可以点击图例,来控制我们希望显示的公司数据:
然后我们可以拖动鼠标到柱形图的顶部,会显示对应的信息,通过这两个细节我们可以大致了解到它的交互性,突出它的优点不同于其他绘图库。
我们还可以给图表添加标题:
import pyecharts.options as opts
bar.set_global_opts(title_opts=opts.TitleOpts(title ='比较图'))#加一个标题,全局标题
bar.render_notebook()
运行结果是:
我们还可以添加副标题以及在多一个类别:
import pyecharts.options as opts
y3=[200,300,400,700]
bar.set_global_opts(title_opts=opts.TitleOpts(title ='比较图',subtitle='副标题'))#加一个标题,全局标题,subtitle是副标题
bar.add_yaxis(series_name='公司C',yaxis_data=y3)
bar.render_notebook()
运行结果为:
我们还可以改变柱状图的大小以及,我们可以这样操作:
import pyecharts.charts as pyec
x = ['甲','乙','丙','丁']
y1=[300,400,340,450]
y2 =[200,100,300,500]
bar = pyec.Bar()
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1,category_gap="60%",color='#87CEFF')#category_gap同一系列的柱间距离,默认为类目间距的 20%,可设固定值,color设置柱状图的颜色
bar.render_notebook()
运行结果为:
还有我们想输出的是一个水平条形图,我们可以这样操作:
bar.reversal_axis()#交换x,y轴,水平条形图显示
bar.render_notebook()
运行结果为:
我们还可以将柱状图改为堆积形式的图表:
import pyecharts.charts as pyec
x = ['甲','乙','丙','丁']
y1=[300,400,340,450]
y2 =[200,100,300,500]
bar = pyec.Bar()
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1,category_gap="60%",color='#87CEFF', stack='11')#stack可以修改柱状图为堆积型,但同一个类别的stack要保持一致
bar.add_yaxis(series_name='公司B',yaxis_data=y2,category_gap="60%",color='#00B2EE', stack='11')
bar.render_notebook()
运行结果为:
我们还可以控制不同柱状图之间的距离:
import pyecharts.charts as pyec
x = ['甲','乙','丙','丁']
y1=[300,400,340,450]
y2 =[200,100,300,500]
bar = pyec.Bar()
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1,category_gap="60%",color='#FFBBFF')
bar.add_yaxis(series_name='公司B',yaxis_data=y2,category_gap="60%",color='#FF3E96', gap='90%')#gap控制不同系列之间柱状图间的距离,如果想要两个系列的柱子重叠,可以设置 gap 为 '-100%'。这在用柱子做背景的时候有用。
bar.render_notebook()
运行结果为:
折线图
在常用的统计图表中,折线图也是一种很常见的图表,下面我们可以来看看如何绘制,大部分操作和上面条形图的绘制是一样的,除了函数不同,基本没有区别。
import pyecharts.charts as pyec
import pyecharts.options as opts
line =pyec.Line()
line.add_xaxis(x)
line.add_yaxis(series_name='A',y_axis=y1)
line.add_yaxis(series_name='B',y_axis=y2)
line.add_yaxis(series_name='B',y_axis=y2)
line.render_notebook()
首先都是实例化,然后给对象添加对应的横纵坐标以及一些其他配置,最后再显示。我们可以看看下面的运行结果:
我们也还是可以点击图例来改变显示的折线:
我们还可以类似上面添加一些设置:
line.set_global_opts(title_opts=opts.TitleOpts('我的第一幅折线图',subtitle='test',pos_left=30),#添加图像主标题,subtitle='test'添加副标题,pos_left=30标题距离左边的距离
legend_opts =opts.LegendOpts(is_show=True),#默认展示图例
tooltip_opts =opts.TooltipOpts(trigger='axis',axis_pointer_type='cross'),
toolbox_opts =opts.ToolboxOpts(is_show=True,orient='horizontal')#添加工具箱配置#vertial竖直工具栏
)
line.render_notebook()
运行结果为:
我们生成了一个带有工具栏以及主标题和副标题,水平线等的折线图,我们还可以点击工具栏中的data view来查看数据和修改数据:
我们还可以对图表进行缩放显示,当数据比较多,我们可以采用这种方式,由于折线图不是很明显,我们可以用条形图来做示例:
x = ['a','b','c','d','g','f','n','e']
y1=[300,400,340,450,600,200,100,900]
y2=[350,500,390,450,800,600,300,700]
bar =pyec.Bar()
bar.set_global_opts(title_opts=opts.TitleOpts('我的第一幅折线图',subtitle='test',pos_left=30),#添加图像主标题,subtitle='test'添加副标题,pos_left=30标题距离左边的距离
legend_opts =opts.LegendOpts(is_show=True),#默认展示图例
tooltip_opts =opts.TooltipOpts(trigger='axis',axis_pointer_type='cross'),
toolbox_opts =opts.ToolboxOpts(is_show=True,orient='horizontal'),#添加工具箱配置#vertial竖直工具栏
datazoom_opts =opts.DataZoomOpts(type_='slider',range_start=0,range_end=2500)
)
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1)
bar.add_yaxis(series_name='公司B',yaxis_data=y2)
bar.render_notebook()
生成的图表是:
我们可以滑动图表最下方的那一块来放大需要观察部分的条形图:
折线图也可以这样操作,我们只需要修改部分代码就可以:
x = ['a','b','c','d','g','f','n','e']
y1=[300,400,340,450,600,200,100,900]
y2=[350,500,390,450,800,600,300,700]
line =pyec.Line()
line.set_global_opts(title_opts=opts.TitleOpts('我的第一幅折线图',subtitle='test',pos_left=30),#添加图像主标题,subtitle='test'添加副标题,pos_left=30标题距离左边的距离
legend_opts =opts.LegendOpts(is_show=True),#默认展示图例
tooltip_opts =opts.TooltipOpts(trigger='axis',axis_pointer_type='cross'),
toolbox_opts =opts.ToolboxOpts(is_show=True,orient='horizontal'),#添加工具箱配置#vertial竖直工具栏
datazoom_opts =opts.DataZoomOpts(type_='slider',range_start=0,range_end=2500)
)
line.add_xaxis(x)
line.add_yaxis(series_name='公司A',y_axis=y1)
line.add_yaxis(series_name='公司B',y_axis=y2)
line.render_notebook()
运行结果为:
饼状图
在统计图表中,还有一个常见的图表类型就是饼状图,我们可以来了解一下怎么绘制。
x_data =["甲",'乙','丙','丁']
y_data =[737,3784,3433,3456]
data_pair =list(zip(x_data,y_data))
pie = pyec.Pie()
pie.add(series_name='推广渠道',data_pair=data_pair)
pie.render_notebook()
我们采用列表中包含元组的形式来传入数据,我们可以看看生成的结果:
我们可以尝试修改添加一些参数,来让图表显示更加美观,比如我们可以修改饼状图在图中的位置。
x_data =["甲",'乙','丙','丁']
y_data =[737,3784,3433,3456]
data_pair =list(zip(x_data,y_data))
pie = pyec.Pie()
pie.add(series_name='推广渠道',data_pair=data_pair,center=['30%','50%'])## 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标
# 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度
pie.render_notebook()
运行结果为:
我们还可以修改饼图内外半径让它变成环状图:
pie1 =pyec.Pie()
pie1.add(series_name='推广渠道',data_pair=data_pair,radius =['60%','80%'])
pie1.set_global_opts()
pie.render_notebook()
运行结果为:
饼状图对应的参数也有很多,有兴趣了解的可以去官网了解一下。
词云图
pyecharts也提供了词云图,我们可以看看:
s = '''The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!'''
s = s.lower().split()
d = {}
for i in s:
d[i] = d.get(i,0) + 1
di = list(d.items())
import pyecharts.charts as pyec
wordcloud = pyec.WordCloud()
wordcloud.add(series_name="",data_pair=di)
wordcloud.render_notebook()
运行结果为:
总体配置
无论哪种图表,它都存在它最初的配置,比如图的背景,图的标题等很多配置,在pyecharts中这个也是很常用的,我们可以来看一下:
我们修改这些时总局配置项可通过set_global_options方法设置,我这里用背景做一个示例,有兴趣的再自己尝试一些其他的。
import pyecharts.charts as pyec
import pyecharts.options as opt
from pyecharts.globals import ThemeType
x =['1','2','3','5']
y1 =[34,56,67,67]
y2 =[13,34,45,66]
y3 =[23,56,67,77]
y4 =[24,56,34,66]
bar = pyec.Bar()
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1)
bar.add_yaxis(series_name='公司B',yaxis_data=y2)
bar.add_yaxis(series_name='公司C',yaxis_data=y3)
bar.add_yaxis(series_name='公司D',yaxis_data=y4)
bar.set_global_opts(title_opts=opts.TitleOpts(title='默认主题类型',subtitle='副标题'))
bar.render_notebook()
这个采用的是默认的主题,我们可以看看:
我们只需修改theme 对应的值便可以修改主题,比如下面这个:
bar =pyec.Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))#设置主题类型
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1)
bar.add_yaxis(series_name='公司B',yaxis_data=y2)
bar.add_yaxis(series_name='公司C',yaxis_data=y3)
bar.add_yaxis(series_name='公司D',yaxis_data=y4)
bar.set_global_opts(title_opts=opts.TitleOpts(title='LIGHT',subtitle='副标题'))
bar.render_notebook()
运行结果为:
我们还尝试一下其他几种:
bar =pyec.Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))#设置主题类型
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1)
bar.add_yaxis(series_name='公司B',yaxis_data=y2)
bar.add_yaxis(series_name='公司C',yaxis_data=y3)
bar.add_yaxis(series_name='公司D',yaxis_data=y4)
bar.set_global_opts(title_opts=opts.TitleOpts(title='WONDERLAND',subtitle='副标题'))
bar.render_notebook()
运行结果为:
bar =pyec.Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))#设置主题类型
bar.add_xaxis(x)
bar.add_yaxis(series_name='公司A',yaxis_data=y1)
bar.add_yaxis(series_name='公司B',yaxis_data=y2)
bar.add_yaxis(series_name='公司C',yaxis_data=y3)
bar.add_yaxis(series_name='公司D',yaxis_data=y4)
bar.set_global_opts(title_opts=opts.TitleOpts(title='CHALK',subtitle='副标题'))
bar.render_notebook()
运行结果为:
pyecharts内置提供了10+种不同的风格,大家可以在自己电脑上多尝试一下,看看效果,选择一种自己喜欢的主题,也可以对自己定制主题,这一块大家可以到官网上学习。至于其他总体配置项大家仿照这个,到官网查阅资料然后再来使用。pyecharts中每种图表还有它对应的系列配置项,有兴趣的大家可以去了解。关于pyecharts我介绍大致这些,最后我将官网上的一个图表给大家看看,我们就可以知道pyecharts多么的强大。
import datetime
import random
from pyecharts import options as opts
from pyecharts.charts import Calendar
def calendar_base() -> Calendar:
begin = datetime.date(2017, 1, 1)
end = datetime.date(2017, 12, 31)
data = [
[str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)]
for i in range((end - begin).days + 1)
]
c = (
Calendar()
.add("", data, calendar_opts=opts.CalendarOpts(range_="2017"))
.set_global_opts(
title_opts=opts.TitleOpts(title="Calendar-2017年微信步数情况"),
visualmap_opts=opts.VisualMapOpts(
max_=20000,
min_=500,
orient="horizontal",
is_piecewise=True,
pos_top="230px",
pos_left="100px",
),
)
)
return c
calendar_base().render_notebook()
运行结果为: