这是我国星巴克门店的位置,营业时间等数据。
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()