pyecharts交互式绘图

实验项目名称:pyecharts交互式绘图

实验目的及要求:

(1)掌握pyecharts的基础语法
(2)掌握柱形图的绘制方法
(3)掌握折线图的绘制方法
(4)掌握饼图的绘制方法
(5)掌握并行多图的绘制方法
(6)掌握时间线轮播多图的绘制方法

实验内容:

(1)根据第2章实训2处理后的数据,统计2017年6月销量前5的商品销量、每台售货机每月的总交易额、每台售货机各类(按大类)商品的销售额,并利用这些数据绘制相关图形。
(2)根据第2章实训2处理后的数据,统计2017年每月每台售货机的销售额、每台售货机每月各类(按大类)商品的销售额,并利用这些数据绘制相关图形

实验步骤

(1)获取处理好的数据

In [179]:

#(1)获取处理好的数据
import pandas as pd
import numpy as np 
from pyecharts.charts import Bar,Pie,Line
from pyecharts import options as opts
data=pd.read_csv('./处理后的数据.csv',encoding='gbk')
data.head()

Out[179]:

订单号设备ID应付金额实际金额商品支付时间地点状态提现大类二级类
0DD201708167493663618499909784E43A6E078A076314.54.568g好丽友巧克力派2枚2017-01-01 00:53:00D已出货未退款已提现非饮料饼干糕点
1DD201708167493663555814061164E43A6E078A041723.03.040g双汇玉米热狗肠2017-01-01 01:33:00A已出货未退款已提现非饮料肉干/豆制品/蛋
2DD201708167493578526890939886E43A6E078A068745.55.5430g泰奇八宝粥2017-01-01 08:45:00E已出货未退款已提现非饮料方便速食
3DD201708167493683507186615837E43A6E078A042285.05.048g好丽友薯愿香烤原味2017-01-01 09:05:00C已出货未退款已提现非饮料膨化食品
4DD201708167493759548618252006E43A6E078A041343.03.0600ml可口可乐2017-01-01 09:41:00B已出货未退款已提现饮料碳酸饮料

(2)设置系统配置项和全局配置项,绘制销量前5的商品销量柱形图

In [180]:

#(2)设置系统配置项和全局配置项,绘制销量前5的商品销量柱形图
data1=data.groupby('商品').count()###按商品分组,统计商品的出现频次====>即为商品的销量
data2=data1.sort_values('订单号',ascending=False).head()['订单号']###获取销量前五的数据
columns={'订单号':'销量'}#对列进行重新命名
data2=pd.DataFrame(data2)###将其转换成一个DataFrame类型
data2=data2.rename(columns=columns)##对列索引进行重新命名
data3=data2.T##将获取已经处理好的数据进行一个转置
init_opts=opts.InitOpts(width='1000px', height='800px')
bar=(
    Bar(init_opts)
          .add_xaxis(data3.columns.tolist())
          .add_yaxis('销量', data3.loc['销量'].tolist(), 
                     label_opts=opts.LabelOpts(position='insideTop'))
         .set_global_opts(title_opts=opts.TitleOpts(
         title='销量前5的商品销量柱形图'))
     )
bar.render('销量前5的商品销量柱形图.html')
bar.render_notebook()

Out[180]:

 

(3)设置系统配置项和全局配置项,绘制售货机每月总交易额折线图

In [181]:

#(3)设置系统配置项和全局配置项,绘制售货机每月总交易额折线图
data['支付时间']=pd.to_datetime(data['支付时间'])#将支付时间转换成datetime类型,便于分析
data['月份']=data['支付时间'].dt.month##从数据中提取出销售月份具体是哪月,并将其添加到data当中去
temp=data.groupby(by=['月份','地点'],as_index=False)['实际金额'].sum()
x=sorted(list(set(data['月份'].values.tolist())))
x_data=[str(i)+'月' for i in x]
location=list(set(temp['地点'].values.tolist()))
location=sorted(location)
y=[]
for i in location:
    y.append(np.round(temp[temp['地点']==i]['实际金额'].values.tolist(),2))
line=(Line()
     .add_xaxis(x_data)
     .add_yaxis('售货机A',y[0],label_opts=opts.LabelOpts(is_show=False))
     .add_yaxis('售货机B',y[1],label_opts=opts.LabelOpts(is_show=False))
     .add_yaxis('售货机C',y[2],label_opts=opts.LabelOpts(is_show=False))
     .add_yaxis('售货机D',y[3],label_opts=opts.LabelOpts(is_show=False))
     .add_yaxis('售货机E',y[4],label_opts=opts.LabelOpts(is_show=False))
     )
line.render('售货机每月总交易额折线图.html')
line.render_notebook()

Out[182]:

(4)设置系统配置项和全局配置项,绘制售货机各类(按大类)商品的销售额饼图

In [183]:

import warnings
warnings.filterwarnings('ignore')
category_sales = data.groupby(['地点', '大类'])['实际金额'].sum().reset_index()
###写一个类方法,按照大类(非饮料和饮料)和各类(A、B、C、D、E)来对大类重新进行一个命名,可以更加直观看出数据属于哪类
##以字典形式处理
def dl_gl(dl):
    mapping = {
        ('非饮料', 'A'): 'A非饮料',
        ('非饮料', 'B'): 'B非饮料',
        ('非饮料', 'C'): 'C非饮料',
        ('非饮料', 'D'): 'D非饮料',
        ('非饮料', 'E'): 'E非饮料',
        ('饮料', 'A'): 'A饮料',
        ('饮料', 'B'): 'B饮料',
        ('饮料', 'C'): 'C饮料',
        ('饮料', 'D'): 'D饮料',
    }
    return mapping.get((dl['大类'], dl['地点']), 'E饮料')
##调用方法
category_sales['大类'] = category_sales.apply(dl_gl, axis=1)

from pyecharts.charts import Pie
# 绘制饼图
pie = Pie()
pie.add("", [list(z) for z in zip(category_sales['大类'].values.tolist(), list(category_sales.sum(axis=1)))])
pie.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
pie.render('售货机各类(按大类)商品的销售额饼图.html')
pie.render_notebook()

 

 

#(4)设置系统配置项和全局配置项,绘制售货机各类(按大类)商品的销售额饼图
temp=data.groupby('大类')['实际金额'].sum()##进行分组统计
temp=pd.DataFrame(temp)
temp=temp.T##将获取的数据进行一个转置,便于计算
pie = (
    Pie()
        .add('', [list(z) for z in zip(temp.columns.tolist(), temp.loc['实际金额'].values.tolist())])
        .set_global_opts(title_opts=opts.TitleOpts(title='售货机各类(按大类)商品的销售额饼图'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} ({d}%)'))
)
pie.render('售货机各类(按大类)商品的销售额饼图2.html')
pie.render_notebook()

In [185]:

 

(5)设置系统配置项和全局配置项,绘制2017年每月每台售货机的销售额的时间线轮播多图

In [186]:

from pyecharts.charts import Timeline

# 按售货机和月份分组,计算每台售货机每月的总交易额
data_monthly = data.groupby(['地点', '月份'])['实际金额'].sum().reset_index()

# 创建时间线轮播多图
timeline = Timeline()

# 添加每个月的图表
for month in data_monthly['月份'].unique().tolist():
    bar = (
        Bar()
        .add_xaxis(data_monthly[data_monthly['月份'] == month]['地点'].tolist())
        .add_yaxis("销售额", data_monthly[data_monthly['月份'] == month]['实际金额'].tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="2017年{}月每台售货机销售额".format(month)))
    )
    timeline.add(bar, "{}月".format(month))
timeline.render('2017年每月每台售货机的销售额的时间线轮播多图.html')
timeline.render_notebook()

Out[186]:

 

In [187]:

from pyecharts import options as opts
from pyecharts.charts import Line, Timeline
data['年份']=data['支付时间'].dt.year
# 获取2017年每月每台售货机的销售额数据
monthly_amount = data[data['年份'] == 2017].groupby(['地点', '月份']).sum()['实际金额'].reset_index()

# 绘制时间线轮播多图
timeline = (
    Timeline()
    .add_schema(play_interval=1000)
)

for location in ['A', 'B', 'C','D','E']:
    line = (
        Line()
        .add_xaxis(monthly_amount[monthly_amount['地点'] == location].月份.tolist())
        .add_yaxis("销售额", monthly_amount[monthly_amount['地点'] == location]['实际金额'].tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="售货机{}每月销售额折线图".format(location)))
    )
    timeline.add(line, "{}售货机".format(location))
timeline.render('2017年每月每台售货机的销售额的时间线轮播多图2.html')
timeline.render_notebook()

(6)设置系统配置项和全局配置项,绘制售货机每月各类(按大类)商品的销售额饼图的并行多图

In [188]:

#(6)设置系统配置项和全局配置项,绘制售货机每月各类(按大类)商品的销售额饼图的并行多图
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.charts import Bar,Line,Pie, Timeline,Grid
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
colors1= ["#00FF80","#800000"]
colors2= ["#000080","#008000 "]
colors3= ["red", "yellow"]
colors4= ["#FF0080", "#80FF00"]
colors5= ["#FF0000", "#00FF00#800000"]
# 获取每台售货机各类(按大类)商品的销售额数据
category_amount = data.groupby(['地点', '大类']).sum()['实际金额'].reset_index()
# init_opts=opts.InitOpts(width='50px', height='40px')
pie1 = (
    Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.LIGHT))
    .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'A'].大类.tolist(), 
                                     category_amount[category_amount['地点'] == 'A']['实际金额'].tolist())], 
         radius=["30%", "50%"], center=["15%", "50%"], rosetype="radius" ) 
    .set_colors(colors1)
    .set_global_opts(title_opts=opts.TitleOpts(title="商品的销售额饼图的并行多图"))
)
pie2= (
    Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.VINTAGE))
    .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'B'].大类.tolist(), 
                                     category_amount[category_amount['地点'] == 'B']['实际金额'].tolist())], 
         radius=["30%", "50%"], center=["30%", "50%"], rosetype="radius").set_colors(colors1)
    .set_colors(colors2)
)

# 绘制饼图
pie3 = (
    Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.WONDERLAND))
    .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'C'].大类.tolist(), 
                                     category_amount[category_amount['地点'] == 'C']['实际金额'].tolist())],
         radius=["30%", "50%"], center=["50%", "50%"], rosetype="radius")
    .set_colors(colors3)
)
pie4 = (
    Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.ROMA))
    .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'D'].大类.tolist(), 
                                     category_amount[category_amount['地点'] == 'D']['实际金额'].tolist())],
         radius=["30%", "50%"], center=["65%", "50%"], rosetype="radius")
    .set_colors(colors4)
)
pie5 = (
    Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.WESTEROS))
    .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'E'].大类.tolist(), 
                                     category_amount[category_amount['地点'] == 'E']['实际金额'].tolist())], 
         radius=["30%", "50%"], center=["85%", "50%"], rosetype="radius") 
    .set_colors(colors5)
)

grid = (
    Grid()
    .add(pie1, grid_opts=opts.GridOpts(pos_left="30%", pos_top="30%"))
    .add(pie2, grid_opts=opts.GridOpts(pos_left="60%", pos_right="30%"))
    .add(pie3, grid_opts=opts.GridOpts(pos_left="50%", pos_right="5%"))
    .add(pie4, grid_opts=opts.GridOpts(pos_left="70%", pos_right="5%"))
    .add(pie5, grid_opts=opts.GridOpts(pos_left="90%", pos_right="5%"))
)
grid.render('售货机每月各类(按大类)商品的销售额饼图的并行多图.html')
grid.render_notebook()#从左到右分别是A,B,C,D,E

绘制售货机各类(按大类)全年商品的销售额饼图和柱形图的并行多图

In [189]:

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Pie, Grid, Timeline
from pyecharts.charts import Page
from pyecharts.globals import ThemeType
from pyecharts.charts import Timeline
bart = data.groupby(['地点', '大类']).sum()['实际金额'].reset_index()
bart=pd.DataFrame(bart)
fyl = []
yl = []
for index, row in bart.iterrows():
    if row['大类'] == '非饮料' and row['地点'] in ['A', 'B', 'C', 'D', 'E']:
        fyl.append(row)
    else:
        yl.append(row)
        
fyl=pd.DataFrame(fyl)
yl=pd.DataFrame(yl)
are=['A', 'B', 'C', 'D', 'E']
fyl=fyl['实际金额'].values.tolist()
yl=yl['实际金额'].values.tolist()
init_opts=opts.InitOpts(width='1200px',height='720px',theme=ThemeType.ROMA)
bar=(
    Bar(init_opts)
    .add_xaxis(are)
    .add_yaxis('非饮料',fyl)
    .add_yaxis('饮料',yl)
    .set_global_opts(title_opts=opts.TitleOpts(title='售货机每月各类(按大类)商品的销售额饼图的并行多图'),
                     legend_opts=opts.LegendOpts(pos_left="15%",pos_top="25"),
                     yaxis_opts=opts.AxisOpts(name='销售额'),
                     xaxis_opts=opts.AxisOpts(name='地点'))
    
)
area=['售货机A', '售货机B', '售货机C', '售货机D', '售货机E']
pie1=(
    Pie()
    .add('',[list(z) for z in zip(area,fyl)],
        radius=[20,100],center=[750,600])
    .set_global_opts(title_opts=opts.TitleOpts(title='非饮料类销售情况',pos_top="60%",pos_left="55%"),
                    legend_opts=opts.LegendOpts(orient='vertical',pos_left="90%",pos_bottom="50"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} ({d}%)',position="outside",color=['red','blue','green','purple','skyblue']))

)
pie2=(
    Pie()
    .add('',[list(z) for z in zip(area,yl)],
        radius=[15,100],center=[750,200])
    .set_global_opts(title_opts=opts.TitleOpts(title='饮料类销售情况',pos_top="50",pos_left="55%"),
                    legend_opts=opts.LegendOpts(orient='vertical',pos_left="90%"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} \n ({d}%)'),position="outside",color=['red','blue','green','purple','skyblue'])

)
grid=(Grid(init_opts=opts.InitOpts(width='1200px',height='720px',theme=ThemeType.ROMA)))
grid.add(bar,grid_opts=opts.GridOpts(pos_left="5%", pos_right="60%"))
grid.add(pie1,grid_opts=opts.GridOpts(pos_bottom="60",pos_left="60%"))
grid.add(pie2,grid_opts=opts.GridOpts(pos_top="60",pos_left="60%"))
grid.render('售货机各类(按大类)全年商品的销售额饼图和柱形图的并行多图.html')
grid.render_notebook()

实验环境:

硬件:计算机
软件:python+jupyter notebook+matplotlib

实验结果:

销量前5的商品是?

In [191]:

data3.columns

Out[191]:

Index(['怡宝纯净水', '脉动', '东鹏特饮', '阿萨姆奶茶', '营养快线'], dtype='object', name='商品')
答:由(1)可知销量前5的商品是怡宝纯净水、脉动、东鹏特饮、阿萨姆奶茶、营养快线。

售货机每月总交易情况如何?

答:从中可以看出5 ~ 12月相对来说,波动比较大。
从第(3)题售货机每月总交易额折线图和第(5)题2017年每月每台售货机的销售额的时间线轮播多图的折线图结合起来,
可以看出总交易额A售货机在5 ~ 12 月波动比较大,B售货机和C售货机在6 ~ 11月波动较大,
D售货机6 ~ 10 月波动较大,E售货机在7 ~ 12 月波动较大。
在十二个月当中,A售货机和D售货机在十二月份的时候有一个最高点,
B售货机和C售货机在十月份的时候有一个最高点,
E售货机在十一月份的时候有一个最高点,
也就是说这是总交易额最高的时候的月份,销售量最好的时候。
在二月和七月当中各类售货机的总交易额都比较低,和其他月份相比较起来,
在六月份时候,出现5 ~ 6月份总交易额暴涨,6 ~ 7月总交易额爆跌的现象。
总体来看E售货机的总交易额波动最为明显,当先看第(5)题2017年每月每台售货机的销售额的时间线轮播多图的折线图会发现其实波动起#### 伏都比较大,
但是再回过来看第(3)题的图的时候你会发现E售货机的波动起伏最为明显,其他售货机的相对来说平缓一些。
对比发现,E售货机的总交易额就像股票呈现一个暴涨暴跌的状态,如果选择E售货机进行炒股的话,对于稳定性收入的人不太适合。
但总体来说,E售货机的销量额是比较好的,因为它的总交易额在十二个月当中普遍最高。
从第(5)题2017年每月每台售货机的销售额的时间线轮播多图的柱形图来看,
从柱形图当中可以很清楚的看到十二个月里面经常会出现这样的情形E售货机 > C售货机> B售货机 > A售货机> D售货机 ;
按各类售货机来看,总体来说十二月中,E售货机每月的总交易额普遍偏高,D售货机普遍偏低,相对于其他售货机而言。

 

 

 

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值