嗨, 大家好, 我是Jack, 一名自学python, 目前在一家上市公司工作的小小数据分析师。
如果大家要学python图表动态可视化, 强烈推荐pyechart工具包。首先它是中国制造, 其次确实很好用.
pyechart官网介绍 : Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了
本文我们从柱形图的19种变化, 介绍pyechart的作图套路, 大家可以通过这些技巧扩展到其他的图表类型(曲线图,饼图,散点图等)
python开发软件有很多, 比如pycharm、Jupyter notebook、spyder, 我电脑安装的是anaconda, 它自带jupyter notebook和spyder, 适合初学者.
下载适合自己电脑的版本, 用anaconda最大的优势是基本不用再去安装其他的工具包, 如果手动安装工具包会出现版本不兼容或者要安装很多依赖包的问题。
pyechart工具包需要手动安装: 请安装V1.0以上版本, pyechartV0.5版本和V1.0版本不兼容
pip install pyecharts -U
pyechart所使用的图表都放在 pyecharts.charts 里面, 每次都需要导入对应的图表, 比如柱形图:
from pyecharts.charts import Bar
还有其他很多, 需要哪几个就导入哪几个
from pyecharts.charts import Bar ,Pie,Grid,Line,Boxplot,Scatter,EffectScatter,Kline,Geo,Pie,Map,Funnel,Gauge,Liquid,Calendar,Polar,Radar,Sunburst,ThemeRiver,WordCloud,Scatter3D,MapGlobe,Sankey
# 柱形图,饼图,组合图,线形图,盒形图,散点图,涟漪图,k线图,地图,饼图,地图,漏斗图,仪表盘图,水球图,日历图,极坐标系,雷达图,旭日图,河流图,词云图,3D散点图,3D地球,桑基图
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.render()
以上代码翻译大致如下: 从pyecharts.charts工具箱中拿出Bar小工具, 用这个小工具做了一个柱子(还只是毛坯), 然后对柱子进行装饰(添加数据等)
3.1.1 那对柱子可以做哪些装饰呢, 可以从官网的这里面找: 柱形图设置→
3.1.2 在对柱子进行装饰的时候, 有时候会对整个图表或者系列进行详细的设置, 就需要用到 .set_global_opts和 .set_series_opts,
from pyecharts.charts import Bar
bar = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
)
bar.render()
效果和第1种一样, 第1种比较好理解, 第2中比较简洁. 第2种要注意括号要成对出现, 再就是代码末尾逗号问题
pyechart让人不太好弄懂的地方就是图表元素之间一层层嵌套关系, 接下来我们来一一介绍:
为了便于理解, 适合工作中使用, 我们用Faker工具包生成模拟数据。
工具包安装:
pip install faker
模拟dataframe数据, 如果是excel文件可用pandas.read_excel()读取
4.1.1 数据
import faker
faker.Faker.seed(10) # 每次随机数不变
import pandas as pd
import numpy as np
np.random.seed(10000) # 每次随机数不变
f = faker.Faker(locale='zh-CN')
data = pd.DataFrame()
for i in range(10):
datai = pd.DataFrame({
'公司':f.company(),
'销售额':np.random.randint(100,300,1)},
index = [i])
data = data.append(datai)
data
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(data['公司'].tolist())
.add_yaxis("销售额", data['销售额'].tolist())
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), # x轴旋转
title_opts=opts.TitleOpts(title="公司销售额对比", subtitle="x轴文字过长调整"),
)
.render("柱形图_x轴旋转.html"))
pyechart中有很多类似于下面这种写法, 参数一层层嵌套:
.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)))
在 pyecharts 中,一切皆 Options。经常用到options 配置项。
除设置rotate外, 还可以设置
is_show: 是否显示 True False
color: 颜色
font_size: 字体大小 整数
font_style: 文字风格 ‘normal’,‘italic’,‘oblique’
font_weight: 字体粗细 ‘normal’,‘bold’,‘bolder’,‘lighter’
font_family: 字体 ‘serif’ , ‘monospace’, ‘Arial’, ‘Courier New’, ‘Microsoft YaHei’,
更多详细设置: 标签配置项
4.2.1 模拟数据
import faker
faker.Faker.seed(1) # 每次随机数不变
import pandas as pd
import numpy as np
np.random.seed(1) # 每次随机数不变
f = faker.Faker(locale='zh-CN')
data = pd.DataFrame()
for i in range(10):
datai = pd.DataFrame({
'员工姓名':f.name(),
'1月销售额':np.random.randint(100,300,1),
'2月销售额':np.random.randint(100,300,1)},
index = [i])
data = data.append(datai)
data
4.2.2 作图
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(), stack="stack1")
.add_yaxis("2月", data['2月销售额'].tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="堆积柱形图"))
.render("堆积柱形图.html"))
设置stack参数为同一名称即可
还是以上面的数据为例:
4.3.1 黑色背景
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='dark'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(), stack="stack1")
.add_yaxis("2月", data['2月销售额'].tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="堆积柱形图"))
.render("堆积柱形图_主题.html"))
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(), stack="stack1")
.add_yaxis("2月", data['2月销售额'].tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="堆积柱形图"))
.render("堆积柱形图_主题.html"))
theme参数的15个风格: ‘chalk’,‘dark’, essos’, ‘infographic’, ‘light’, ‘macarons’,
‘purple-passion’, ‘roma’, ‘romantic’, ‘shine’, ‘vintage’, ‘walden’, ‘westeros’, ‘white’, ‘wonderland’
除了设置theme参数外, 还可以通过其他参数修改图表背景色, 还是以上面的数据为例
4.4.1 参数写法1: 16进制格式
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(bg_color='#c0fefc'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(), stack="stack1")
.add_yaxis("2月", data['2月销售额'].tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="堆积柱形图"))
.render("堆积柱形图_背景色.html"))
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(bg_color='rgba(192, 254, 252, 0.2)'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(), stack="stack1")
.add_yaxis("2月", data['2月销售额'].tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="堆积柱形图"))
.render("堆积柱形图_背景色_透明度.html"))
bg_color参数的两种颜色设置方法, 16进制格式和RGB格式, 其中RGB格式可设置透明度
还是以上面的数据为例
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(), stack="stack1")
.add_yaxis("2月", data['2月销售额'].tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="堆积柱形图"),
brush_opts=opts.BrushOpts())
.render("堆积柱形图_工具栏.html"))
设置brush_opts参数, 更详细的设置可点击→
设置brush_opts参数, 更多配置项→
4.6.1 模拟数据
import pandas as pd
import numpy as np
np.random.seed(1) # 每次随机数不变
data = pd.DataFrame({
'日期':pd.period_range('2020-1-1',periods=100),
'销售额':np.random.randint(100,300,100)})
data
c = (
Bar()
.add_xaxis([str(i) for i in data['日期']])
.add_yaxis("销售额", data['销售额'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="销售额分析"),
datazoom_opts=opts.DataZoomOpts(), # 水平缩放 orient="vertical" 垂直数据缩放
)
.render("水平缩放.html"))
datazoom_opts参数, 默认是对x轴设置, orient="vertical"对y轴设置. 更多配置项→
还是以上面的数据为例
c = (
Bar()
.add_xaxis([str(i) for i in data['日期']])
.add_yaxis("销售额", data['销售额'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="销售额分析"),
toolbox_opts=opts.ToolboxOpts(),
)
.render("工具栏.html"))
设置toolbox_opts参数, 更多配置项→
4.8.1 模拟数据
import faker
faker.Faker.seed(10) # 每次随机数不变
import pandas as pd
import numpy as np
np.random.seed(10) # 每次随机数不变
f = faker.Faker(locale='zh-CN')
data = pd.DataFrame()
for i in range(10):
datai = pd.DataFrame({
'员工姓名':f.name(),
'销售额':np.random.randint(100,300,1)},
index = [i])
data = data.append(datai)
data
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"),
tooltip_opts=opts.TooltipOpts(is_show=True,
trigger="axis",
axis_pointer_type="cross"))
.render("堆积柱形图_提示框.html"))
trigger: 提示器三种方式: 'item’数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用,'axis’坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用,'none’什么都不触发
trigger_on: 触发条件, ‘mousemove’: 鼠标移动时触发。 ‘click’: 鼠标点击时触发。‘mousemove|click’: 同时鼠标移动和点击时触发。‘none’: 不在 ‘mousemove’ 或 ‘click’ 时触发,
axis_pointer_type: 提示器类型. ‘line’:直线指示器(默认),‘shadow’:阴影指示器,‘none’:无指示器,‘cross’:十字准星指示器。
提示器更多配置项→
axis_pointer_type 设置成shadow后,效果如下:
还是以上面的数据为例
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"),
yaxis_opts=opts.AxisOpts(name="销售额",
name_location='middle',
name_gap=30),
xaxis_opts=opts.AxisOpts(name="姓名",
name_location='middle',
name_gap=30),
)
.render("堆积柱形图_轴名称.html"))
name: 轴名称 ,name_location: 名称位置( ‘start’, ‘middle’ 或者 ‘center’,‘end’),name_gap:坐标轴名称与轴线之间的距离。
更多配置项设置→
以上面数据为例
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"),
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} /万元"))
)
.render("堆积柱形图_增加单位.html"))
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值")]))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"))
.render("堆积柱形图_添加最值.html"))
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(name="自定义标记点",
coord=[data['员工姓名'][2],
data['销售额'].tolist()[2]],
value=data['销售额'].tolist()[2])]))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"))
.render("堆积柱形图_自定义标记点.html"))
name: 标记名称; type_: min,max, average; symbol: 标记点样式 ‘circle’, ‘rect’, ‘roundRect’, ‘triangle’, ‘diamond’, ‘pin’, ‘arrow’, ‘none’
更多配置项→
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist(),category_gap="50%")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"))
.render("堆积柱形图_间距_40%.html"))
4.13.1 均值 最大值 最小值
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
markline_opts=opts.MarkLineOpts( # 辅助线
data=[opts.MarkLineItem(type_="min", name="最小值"),
opts.MarkLineItem(type_="max", name="最大值"),
opts.MarkLineItem(type_="average", name="平均值")]))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"))
.render("堆积柱形图_辅助线.html"))
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar(init_opts=opts.InitOpts(theme='westeros'))
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("", data['销售额'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(y=150, name="水平参考线"),
opts.MarkLineItem(x=5, name="垂直参考下")],
label_opts= opts.LabelOpts(formatter="{b}"),
linestyle_opts=opts.LineStyleOpts(color='#1cc5dc',
type_='dotted')))
.set_global_opts(title_opts=opts.TitleOpts(title="销售额分析"))
.render("堆积柱形图_自定义辅助线.html"))
更多markline_opts配置项→
4.14.1 模拟数据
import faker
faker.Faker.seed(1) # 每次随机数不变
import pandas as pd
import numpy as np
np.random.seed(1) # 每次随机数不变
f = faker.Faker(locale='zh-CN')
data = pd.DataFrame()
for i in range(10):
datai = pd.DataFrame({
'员工姓名':f.name(),
'1月销售额':np.random.randint(100,300,1),
'2月销售额':np.random.randint(100,300,1)},
index = [i])
data = data.append(datai)
data
4.14.2 作图
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(),gap="0%")
.add_yaxis("2月", data['2月销售额'].tolist(),gap="0%",is_selected=False)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="堆积柱形图"))
.render("默认选中.html"))
is_selected 参数
对上面的数据进行处理
data_re = data[['员工姓名','1月销售额']].sort_values(by='1月销售额')
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(data_re['员工姓名'].tolist())
.add_yaxis("", data_re['1月销售额'].tolist(),gap="0%")
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="销售分析"))
.render("条形图.html"))
更多label_opts配置项→:
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(),color='#325288')
.add_yaxis("2月", data['2月销售额'].tolist(),color='#f5cebe')
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="销售分析"))
.render("系列颜色.html"))
更多颜色可参考: https://colorhunt.co/palettes/blue
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(data['员工姓名'].tolist())
.add_yaxis("1月", data['1月销售额'].tolist(),color='#325288')
.add_yaxis("2月", data['2月销售额'].tolist(),color='#f5cebe')
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(title_opts=opts.TitleOpts(title="销售分析"))
.render("数据标签.html"))
以上就是柱形图的19个技巧, 实际工作中需要我们进行组合运用!
官网提供了更多的设置方法, 我们掌握其中的套路就可以定制我们想要的动态图表, 举个栗子:
Bar(init_opts=opts.InitOpts(theme='westeros',width='1500px',height='600px',gb_color='blue'))
相关博文: 懂点excel作图, 怎么让pyechart作的图更具“职场范“呢?丨pyechart工作作图模板
如果对大家有帮助, 欢迎点赞、收藏, 后期还有继续更新pyechart可视化方面内容!