数据可视化每周挑战——全国星巴克门店数据可视化

发布于:2024-05-22 ⋅ 阅读:(76) ⋅ 点赞:(0)

这是我国星巴克门店的位置,营业时间等数据。

1.导入需要用的库,同时设置绘图时用到的字体,同时防止绘图时负号无法正常显示的情况。

import pandas as pd
from pyecharts.charts import Bar,Map,Line,Pie,Geo
from pyecharts import options as opts
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

 2.读取数据,并且查看数据是否有缺失值等

data = pd.read_excel('D:/每周挑战/星巴克门店.xlsx')
data.info()

从上面可以看出该数据集中没有缺失值,且营业时间属于标成属性,但是实际中时间应该是时间类型,因此我们将其转换为时间,以便于后续的可视化 

3.首先先对营业时间进行处理,然后对星巴克在我国分布省份进行统计汇总。

data['开始营业时间_1'] = pd.to_datetime(data['开始营业时间'])
data['停止营业时间_1'] = pd.to_datetime(data['停止营业时间'])
data['营业时长'] = data['停止营业时间_1'] - data['开始营业时间_1']
data['营业时长'] = pd.to_timedelta(data['营业时长'])
data['营业时长'] = data['营业时长'].dt.total_seconds()/3600
data = data.drop(['开始营业时间_1','停止营业时间_1'],axis=1)
data['营业时长区间'] = pd.cut(data['营业时长'],bins=[0,8,10,12,14,16,24],labels=["0-8h","8-10h","10-12h","12-14h","14-16h","16-24h"])
range_colors = ['#228be6','#1864ab','#8BC34A','#FFCA28','#FF5722','#D32F2F','#1DFFF5','#FF850E']
province_data = data['省份'].value_counts().reset_index()
x = province_data['index'].tolist()
y = province_data['省份'].tolist()
bar = (
    Bar(init_opts = opts.InitOpts(width='1000px',height='800px'))                        # 创建一个柱状图,设置初始化选项(宽和高)
    .add_xaxis(x[::-1])                                                                  # 设置X轴数据,将其反转      
    .add_yaxis('',y[::-1],label_opts = opts.LabelOpts(position='right'))                 # 设置y轴数据,将其反转,同时设置其为值为右侧
    .reversal_axis()                                                                     # 反转x轴和y轴
    .set_global_opts(
        title_opts = opts.TitleOpts(
            title='全国各省星巴克门店数量',                                              # 标题内容
            pos_top='2%',                                                                # 标题距离图表顶部的相对位置
            pos_left='center',                                                           # 指定了标题距离图表左侧的相对位置,这里是图表中心
            title_textstyle_opts = opts.TextStyleOpts(
                color='#FFC0CB',font_size='20',font_weight='bold'                        # 指定标题文本的颜色,字体大小,和粗细
            )
        ),
        visualmap_opts = opts.VisualMapOpts(
            is_show=False,                                                               # 视觉映射组件是否显示
            max_=600,                                                                    # 视觉映射组件的最大值
            dimension=0,                                                                 # 视觉映射组件的维度。为 0 时根据数据的值来映射颜色。
            orient='horizontal',
            pos_top='20%',
            pos_left='70%',
            range_color=range_colors                                                     # 设置视觉映射组件的颜色范围
        ),
     )
)
bar.render_notebook()

上海市星巴克门店最多,超过了1000家。 广东省、浙江省、江苏省、北京市以超过500家的门店分列第二至五位。

4.对各省星巴克的占比进行可视化。

pie = (
    Pie()
    .add(
        series_name='',
        data_pair=[list(z) for z in zip(x,y)],
        radius=['30%','50%'],
        label_opts=opts.LabelOpts(is_show=False,position='center')
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title='各省星巴克门店数量占比',
            pos_top='2%',
            pos_left='center'
        ),
        visualmap_opts=opts.VisualMapOpts(
            is_show=False,
            range_color=range_colors,
            max_=600,
            dimension=0
        ),
        legend_opts=opts.LegendOpts(is_show=True, pos_right="2%", pos_top="8%",orient="vertical")     #horizontal水平方向
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{d}%'))
)
pie.render_notebook()

 

 5.对各省星巴克的数量进行可视化

map = (
    Map().add('',[list(z) for z in zip(x,y)],maptype='china',is_map_symbol_show=False)
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title='各省星巴克门店分布数量',
            pos_top='2%',
            pos_left='center'
        ),
        visualmap_opts=opts.VisualMapOpts(
            is_show=True,
            max_=600,
            dimension=0,
            pos_top='80%',
            pos_left='20%',
            range_color=range_colors
        ),
        legend_opts=opts.LegendOpts(is_show=True)
    )
)
map.render_notebook()

 

 

6.各省数量的热力图可视化。

data_pair = []

# 新建一个BMap对象
geo = Geo(init_opts=opts.InitOpts(theme='dark'))

for _, row in data.iterrows():
    geo.add_coordinate(row['城市'], row['经度'], row['纬度'])  
    data_pair.append([row['城市'], 1])
    
    
geo = (
    geo
    .add_schema(maptype='china')
    .add('',data_pair,type_='heatmap',symbol_size=5)
    .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title='各城市星巴克门店数量分布热力图',
            pos_top='2%',
            pos_left='center'
        ),
        visualmap_opts = opts.VisualMapOpts(
            pos_top='60%',
            pos_left='20%'
        ),
        legend_opts = opts.LegendOpts(is_show=True)
    )
)
geo.render_notebook()

7.对营业开始时间进行分析

data['开始营业时间'] = pd.to_datetime(data['开始营业时间'])
time_data = data['开始营业时间'].value_counts().reset_index().sort_values(by='index', ascending=True)
x = time_data['index'].tolist()
y = time_data['开始营业时间'].tolist()

bar = (
    Bar()
    .add_xaxis(x[::-1])
    .add_yaxis('',y[::-1])
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title='开始营业时间分布',
            pos_top='2%',
            pos_left="center"
        ),
        visualmap_opts=opts.VisualMapOpts(
            is_show=False
        ),
        legend_opts=opts.LegendOpts(is_show=True, pos_right="8%", pos_top="8%",orient="vertical"),
    )
)
bar.render_notebook()

7.对一天内的营业时间进行可视化分析。

df_duration = data['营业时长区间'].value_counts()
df_duration_g = data.groupby('营业时长区间')['店铺名称'].count()
x_data = df_duration_g.index.tolist()
y_data = df_duration_g.values.tolist()
bar = (
    Bar(
        init_opts=opts.InitOpts(width='1000px', height='600px')
    )
    .add_xaxis(x_data)
    .add_yaxis("", y_data)
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title='营业时长区间数量分布',
            pos_top='2%',
            pos_left="center",
            title_textstyle_opts=opts.TextStyleOpts(color='#228be6',font_size=20)
        ),
         visualmap_opts=opts.VisualMapOpts(
            is_show=False,
            max_=2000,
            orient="horizontal",
            pos_top='70%',
            pos_left='20%',
            range_color=range_colors
        ),
        legend_opts=opts.LegendOpts(is_show=True, pos_right="8%", pos_top="8%",orient="vertical"),
    )
)
bar.render_notebook()