星巴克门店信息数据分析、数据清洗与可视化

一、星巴克门店信息数据分析

1.1.概述

本练习的目标是对星巴克门店的全球分布数据进行分析、清洗和可视化。我们将使用 pyecharts 库绘制地图,并通过数据分析和清洗确保数据的准确性和完整性。以下是步骤和方法的详细说明。

1.2.步骤

⑴.数据收集

  • 从 CSV 文件中读取星巴克门店的数据。

⑵.数据清洗

  • 检查数据的完整性和准确性。
  • 处理缺失值和异常值。
  • 转换数据格式,确保数据的一致性。

⑶.数据分析

  • 汇总和统计门店数量。
  • 计算各国门店的分布情况。

⑷.数据可视化

  • 使用 pyecharts 创建全球地图。
  • 将清洗后的数据添加到地图上,展示星巴克门店的全球分布情况

二、可视化

2.1.星巴克全球分布图

⑴.普通地图

from pyecharts import options as opts
from pyecharts.charts import Map
import pandas as pd

# 国家代码到国家名称的映射字典,用于将国家的简写代码转换为完整名称
country_mapping = {
    'US': 'United States',  # 美国
    'CN': 'China',          # 中国
    'CA': 'Canada',         # 加拿大
    'JP': 'Japan',          # 日本
    'KR': 'South Korea',    # 韩国
    'GB': 'United Kingdom', # 英国
    'MX': 'Mexico',         # 墨西哥
    'TW': 'Taiwan',         # 台湾
    'TR': 'Turkey',         # 土耳其
    'PH': 'Philippines',    # 菲律宾
    'TH': 'Thailand',       # 泰国
    'ID': 'Indonesia',      # 印度尼西亚
    'MY': 'Malaysia',       # 马来西亚
    'DE': 'Germany',        # 德国
    'AE': 'United Arab Emirates',  # 阿联酋
    'FR': 'France',         # 法国
    'SG': 'Singapore',      # 新加坡
    'RU': 'Russia',         # 俄罗斯
    'AR': 'Argentina',      # 阿根廷
    'KW': 'Kuwait',         # 科威特
    'BR': 'Brazil',         # 巴西
    'SA': 'Saudi Arabia',   # 沙特阿拉伯
    'ES': 'Spain',          # 西班牙
    'CL': 'Chile',          # 智利
    'PE': 'Peru',           # 秘鲁
    'IN': 'India',          # 印度
    'IE': 'Ireland',        # 爱尔兰
    'CH': 'Switzerland',    # 瑞士
    'NL': 'Netherlands',   # 荷兰
    'PL': 'Poland',         # 波兰
    'EG': 'Egypt',          # 埃及
    'LB': 'Lebanon',        # 黎巴嫩
    'CZ': 'Czech Republic', # 捷克共和国
    'GR': 'Greece',         # 希腊
    'RO': 'Romania',       # 罗马尼亚
    'VN': 'Vietnam',        # 越南
    'NZ': 'New Zealand',    # 新西兰
    'PR': 'Puerto Rico',    # 波多黎各
    'AU': 'Australia',      # 澳大利亚
    'BH': 'Bahrain',        # 巴林
    'DK': 'Denmark',        # 丹麦
    'BE': 'Belgium',        # 比利时
    'AT': 'Austria',        # 奥地利
    'SE': 'Sweden',         # 瑞典
    'QA': 'Qatar',          # 卡塔尔
    'NO': 'Norway',         # 挪威
    'JO': 'Jordan',         # 约旦
    'HU': 'Hungary',        # 匈牙利
    'OM': 'Oman',           # 阿曼
    'SV': 'El Salvador',    # 萨尔瓦多
    'PT': 'Portugal',       # 葡萄牙
    'CO': 'Colombia',       # 哥伦比亚
    'CR': 'Costa Rica',     # 哥斯达黎加
    'BS': 'Bahamas',        # 巴哈马
    'CY': 'Cyprus',         # 塞浦路斯
    'MA': 'Morocco',        # 摩洛哥
    'FI': 'Finland',        # 芬兰
    'KZ': 'Kazakhstan',     # 哈萨克斯坦
    'GT': 'Guatemala',      # 危地马拉
    'PA': 'Panama',         # 巴拿马
    'BN': 'Brunei',         # 文莱
    'BG': 'Bulgaria',       # 保加利亚
    'KH': 'Cambodia',       # 柬埔寨
    'BO': 'Bolivia',        # 玻利维亚
    'AZ': 'Azerbaijan',     # 阿塞拜疆
    'TT': 'Trinidad and Tobago', # 特立尼达和多巴哥
    'ZA': 'South Africa',   # 南非
    'SK': 'Slovakia',       # 斯洛伐克
    'CW': 'Curacao',        # 库拉索
    'AW': 'Aruba',          # 阿鲁巴
    'MC': 'Monaco',         # 摩纳哥
    'LU': 'Luxembourg',     # 卢森堡
    'AD': 'Andorra'         # 安道尔
}

# 读取 CSV 文件中的数据,文件路径为 'directory.csv'
df = pd.read_csv('directory.csv')

# 将 CSV 文件中的国家简写和对应的数量转化为字典形式,并转换为列表的元组形式
# `value_counts()` 方法统计每个国家的出现次数
# `to_dict()` 方法将结果转化为字典,`items()` 方法将字典转化为列表的元组形式
data = list(df.Country.value_counts().to_dict().items())

# 使用映射字典将国家简写转换为完整的国家名称
# `country_mapping.get(code, code)`:如果在映射字典中找到国家代码,则替换为对应的国家名称,否则保留原代码
converted_data = [(country_mapping.get(code, code), value) for code, value in data]

# 创建地图实例
map = Map()

# 设置地图的全局配置项
map.set_global_opts(
    title_opts=opts.TitleOpts(
        title="Starbucks 门店全球分布图",  # 设置地图标题
        pos_left="center"  # 设置标题的位置为居中
    ),
    visualmap_opts=opts.VisualMapOpts(
        max_=14000  # 设置视觉映射的最大值,这里是根据数据的最大值设置的
    )
)

# 添加数据到地图
map.add(
    "",
    converted_data,  # 数据源,包含国家名称和对应的数值
    maptype="world",  # 使用世界地图
    is_roam=False,    # 禁用地图拖拽功能
    is_map_symbol_show=False,  # 禁用地图符号的显示
    label_opts=opts.LabelOpts(is_show=False)  # 禁用地图标签的显示
)

# 渲染地图并生成 HTML 文件,文件名为 "Starbucks 门店全球分布图.html"
map.render("星巴克门店全球分布图.html")

⑵.各国/地区星巴克门店数量(可点击下钻到城市)

# 导入所需的库
import pandas as pd
from pyecharts.charts import TreeMap
import pyecharts.options as opts

# 读取 CSV 文件中的数据,文件路径为 'directory.csv'
df = pd.read_csv('directory.csv')

# 填充缺失值
# 使用 fillna() 方法为缺失值填充默认值。这里为 'Country' 和 'City' 两列缺失的值填充 'NA'
df_t = df.fillna(value=dict(Country='NA', City='NA'))

# 按国家和城市分组,统计每个分组的数量
# groupby(['Country', 'City']) 按 'Country' 和 'City' 两列分组
# size() 计算每个分组的数量
# reset_index() 将分组后的结果转换为 DataFrame 并为新生成的列('Count')重新设置索引
df_t = df_t.groupby(['Country', 'City']).size().reset_index(name='Count')
print(df_t)
# 将数据转换为适合 TreeMap 的层次结构格式
tree_data = []
for country, group in df_t.groupby('Country'):
    children = []
    for _, row in group.iterrows():
        # 将每个城市的数据作为子节点(children)存储
        children.append({"name": row['City'], "value": row['Count']})
    # 将国家和其对应的城市列表添加到 tree_data 中
    tree_data.append({"name": country, "children": children})

# 创建 TreeMap 图表对象
treemap = TreeMap()

# 向 TreeMap 对象中添加数据并设置相关选项
treemap.add('星巴克门店', tree_data,  # 添加数据,tree_data 是转换后的层次结构数据
            leaf_depth=1,  # 设定叶子节点的深度为 1,即只显示国家和城市两层
            label_opts=opts.LabelOpts(  # 标签设置选项
                position="inside",  # 标签位置设置为节点内部
                formatter='{b}:{c}门店'  # 标签的格式设置为 '城市名称:门店数量'
            ),
            levels=[  # 针对不同层级设置样式
                opts.TreeMapLevelsOpts(  # 第一层级(国家)的样式设置
                    treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                        border_color="#555",  # 边框颜色设置为 #555
                        border_width=4,  # 边框宽度设置为 4 像素
                        gap_width=4  # 节点间的间隔宽度设置为 4 像素
                    )
                ),
                opts.TreeMapLevelsOpts(  # 第二层级(城市)的样式设置
                    color_saturation=[0.3, 0.6],  # 颜色饱和度范围设置为 [0.3, 0.6]
                    treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                        border_color_saturation=0.7,  # 边框颜色饱和度设置为 0.7
                        gap_width=2,  # 节点间的间隔宽度设置为 2 像素
                        border_width=2  # 边框宽度设置为 2 像素
                    )
                )
            ])

# 设置标题和其他全局选项
treemap.set_global_opts(
    title_opts=opts.TitleOpts(  # 标题选项
        title="星巴克门店全球分布 TreeMap 图",  # 设置标题文字
        pos_left="center"  # 标题位置设置为居中
    ),
    legend_opts=opts.LegendOpts(is_show=False)  # 图例选项,is_show=False 表示不显示图例
)

# 渲染图表并保存为 HTML 文件
treemap.render("treemap_starbucks_distribution.html")  # 将图表渲染并保存为名为 'treemap_starbucks_distribution.html' 的 HTML 文件

2.2.门店数量前15的城市

# 导入所需的库
import pandas as pd
from pyecharts.charts import Bar
import pyecharts.options as opts

# 读取 CSV 文件中的数据,文件路径为 'directory.csv'
df = pd.read_csv('directory.csv')

# 获取每个城市的门店数量并按降序排列,取出前15名
# df.City.value_counts() 计算每个城市出现的次数,即每个城市的门店数量
# to_dict() 将结果转换为字典形式
# items() 返回字典的键值对,例如:dict_items([('上海市', 542), ('Seoul', 243), ('北京市', 234)]
# list(...)[0:15] 获取前15个城市及其对应的门店数量
b = list(df.City.value_counts().to_dict().items())[0:15]
print(b)  # 打印前15个城市及其门店数量

# 将获取的前15个城市及其门店数量转换为字典形式
data = dict(b)
print(data)  # 打印转换后的字典

# 获取城市名称列表,用于X轴
print(list(data.keys()))  # 打印前15个城市的名称

# 创建 Bar(柱状图)对象
bar = Bar()

# 设置全局选项,如标题、轴配置、视觉映射等
bar.set_global_opts(
    title_opts=opts.TitleOpts(
        title='门店数量在前15的城市',  # 设置图表标题
        pos_left="center"  # 标题位置设置为居中
    ),
    xaxis_opts=opts.AxisOpts(
        position='top'  # 将X轴位置设置为顶部
    ),
    yaxis_opts=opts.AxisOpts(
        is_inverse=True  # Y轴反转,最小值在顶部
    ),
    visualmap_opts=opts.VisualMapOpts(
        is_show=False,  # 视觉映射组件不显示
        dimension=0,  # 设置影响哪个维度(0表示X轴,1表示Y轴)
        max_=300,  # 设定最大值为300(用于颜色映射)
        range_color=['#FFE7D3', '#7A0616']  # 颜色范围,从浅色到深色
    )
)

# 添加X轴数据(城市名称)和Y轴数据(门店数量)
bar.add_xaxis(list(data.keys()))  # X轴数据:前15个城市的名称
bar.add_yaxis('', list(data.values()),  # Y轴数据:前15个城市的门店数量
              label_opts=opts.LabelOpts(position='right')  # 标签设置,标签显示在条形图的右侧
              )

# 将X轴和Y轴互换位置,生成水平条形图
bar.reversal_axis()

# 渲染图表并保存为HTML文件
bar.render('Top_15_cities_by_number_Starbucks_stores.html')  # 将图表渲染并保存为HTML文件

2.3.门店所有权占比

星巴克门店类型有 :

Company Owned:公司所有
Joint Venture:合资
Licensed:授权许可
Franchise:加盟店
# 导入所需的库
import pandas as pd
from pyecharts.charts import Pie
import pyecharts.options as opts

# 读取 CSV 文件中的数据,文件路径为 'directory.csv'
df = pd.read_csv('directory.csv')

# 统计每种所有权类型的门店数量,并将结果转换为字典项列表
# df['Ownership Type'].value_counts() 计算每种所有权类型的数量
# to_dict() 将结果转换为字典形式
# items() 返回字典的键值对
# list(...) 将结果转换为列表形式
data = list(df['Ownership Type'].value_counts().to_dict().items())
print(data)  # 打印所有权类型及其对应的数量

# 创建 Pie(饼图)对象
p = Pie()

# 设置全局选项,如标题
p.set_global_opts(
    title_opts=opts.TitleOpts(
        title='门店所有权占比'  # 设置图表标题
    )
)

# 向 Pie 图表对象中添加数据并设置相关选项
p.add(
    '',  # 图例名称,这里为空字符串表示没有图例名称
    data,  # 数据源,包含所有权类型及其数量
    rosetype='area',  # 饼图的玫瑰图类型,'area' 表示按照区域大小绘制图形
    label_opts=opts.LabelOpts(
        formatter='{b}:{d}%'  # 标签格式设置为 '类别名称:占比百分比'
    ),
    radius=['10%', '45%']  # 设置饼图的半径范围,第一个值是内半径,第二个值是外半径
)

# 渲染图表并保存为 HTML 文件
p.render('starbucks_store_ownership_percentage.html')  # 将图表渲染并保存为名为 'starbucks_store_ownership_percentage.html' 的 HTML 文件

2.4.星巴克在中国的分布

⑴.根据经纬度绘制热力地图

# 导入所需的库
import pandas as pd
from pyecharts.charts import Geo
import pyecharts.options as opts

# 读取 CSV 文件中的数据,文件路径为 'directory.csv'
df = pd.read_csv('directory.csv')

# 过滤出中国的数据
df_china = df[df['Country'] == 'CN']

# 按经纬度分组,统计每个经纬度的门店数量
a = df_china.groupby(['Longitude', 'Latitude']).size()
print(a)
print(list(a.to_dict().items()))

# 将数据转换为适合 Geo 图表的格式
jwd, data = [], []
for (longitude, latitude), count in a.to_dict().items():
    # jwd 列表存储了每个点的名称及其经纬度
    jwd.append((f"{longitude}-{latitude}", longitude, latitude))
    # data 列表存储了每个点的名称及其对应的数量
    data.append((f"{longitude}-{latitude}", count))

# 创建 Geo(地理图)对象
geo = Geo()

# 添加每个门店的经纬度坐标
for name, longitude, latitude in jwd:
    geo.add_coordinate(name, longitude, latitude)

# 设置地图样式
geo.add_schema(maptype='china', is_roam=False)

# 添加数据,并设置为热力图类型
geo.add(
    '',  # 系列名称,这里为空字符串
    data,  # 数据源
    type_='heatmap',  # 设置为热力图
    is_large=True,  # 启用大规模模式,适用于大量数据点
    blur_size=10,  # 模糊大小
    point_size=2  # 点大小
)

# 设置全局选项,包括视觉映射选项
geo.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(
        is_show=True,  # 显示视觉映射
        max_=max([count for name, count in data]),  # 设置数据的最大值,以便正确映射颜色
        min_=1,  # 设置数据的最小值
        range_color=["blue", "green", "yellow", "red"],  # 颜色范围
    ),
    title_opts=opts.TitleOpts(
        title="中国星巴克门店分布热力图",  # 设置标题
        pos_left="center"  # 标题位置
    )
)

# 渲染图表并保存为 HTML 文件
geo.render("heatmap_distribution_starbucks_stores_china.html")

 

⑵.国内星巴克门店最多的20个城市

# 导入所需的库
import pandas as pd  # 用于数据处理
from pyecharts.charts import Bar  # 用于绘制条形图
import pyecharts.options as opts  # 用于设置图表的各种配置项

# 读取 CSV 文件中的数据,文件路径为 'directory.csv'
df = pd.read_csv('directory.csv')

# 过滤出中国的城市数据,并统计每个城市的星巴克门店数量,取出门店数量最多的前20个城市
# df[df['Country'] == 'CN'] 筛选出国家为中国的数据
# ['City'].value_counts() 按城市统计门店数量
# .to_dict().items() 将统计结果转为字典并转为列表
data = list(df[df['Country'] == 'CN']['City'].value_counts().to_dict().items())[0:20]
print(data)  # 打印出统计结果,查看前20个城市及其门店数量

# 创建一个 Bar 对象,用于生成条形图
bar = Bar()

# 设置全局选项,包括标题、坐标轴和视觉映射
bar.set_global_opts(
    title_opts=opts.TitleOpts(
        title="国内星巴克门店最多的20个城市",  # 设置图表标题
        pos_left="center"  # 将标题位置设置在图表的中央
    ),
    xaxis_opts=opts.AxisOpts(
        position="top"  # 将 X 轴的位置设置在图表的顶部
    ),
    yaxis_opts=opts.AxisOpts(
        is_inverse=True  # 将 Y 轴反转,即从上到下显示城市名称
    ),
    visualmap_opts=opts.VisualMapOpts(
        is_show=False,  # 不显示视觉映射组件(因为这里只显示单一颜色)
        dimension=0,  # 选择应用视觉映射的维度,这里是 X 轴
        max_=300  # 设置视觉映射的最大值,用于规范颜色映射范围
    )
)

# 添加 X 轴数据(城市名称)和 Y 轴数据(门店数量)
bar.add_xaxis(list(dict(data).keys()))  # 将城市名称作为 X 轴标签
bar.add_yaxis(
    "",  # 系列名称,这里为空字符串
    list(dict(data).values()),  # 将门店数量作为 Y 轴数据
    label_opts=opts.LabelOpts(position='right')  # 设置标签显示在条形图的右侧
)

# 反转轴,使得条形图横向显示
bar.reversal_axis()

# 渲染图表并保存为 HTML 文件
bar.render("The_20_cities_with_most_starbucks_stores_china.html")  # 将图表渲染为 HTML 文件,并保存

三、Page组件拖拽实现可视化看板

完整的代码如下:

from pyecharts import options as opts
from pyecharts.charts import Map, TreeMap, Bar, Pie, Geo, Page
import pandas as pd
from pyecharts.components import Table

# 国家代码到国家名称的映射字典,用于将国家的简写代码转换为完整名称
country_mapping = {
    'US': 'United States',  # 美国
    'CN': 'China',  # 中国
    'CA': 'Canada',  # 加拿大
    'JP': 'Japan',  # 日本
    'KR': 'South Korea',  # 韩国
    'GB': 'United Kingdom',  # 英国
    'MX': 'Mexico',  # 墨西哥
    'TW': 'Taiwan',  # 台湾
    'TR': 'Turkey',  # 土耳其
    'PH': 'Philippines',  # 菲律宾
    'TH': 'Thailand',  # 泰国
    'ID': 'Indonesia',  # 印度尼西亚
    'MY': 'Malaysia',  # 马来西亚
    'DE': 'Germany',  # 德国
    'AE': 'United Arab Emirates',  # 阿联酋
    'FR': 'France',  # 法国
    'SG': 'Singapore',  # 新加坡
    'RU': 'Russia',  # 俄罗斯
    'AR': 'Argentina',  # 阿根廷
    'KW': 'Kuwait',  # 科威特
    'BR': 'Brazil',  # 巴西
    'SA': 'Saudi Arabia',  # 沙特阿拉伯
    'ES': 'Spain',  # 西班牙
    'CL': 'Chile',  # 智利
    'PE': 'Peru',  # 秘鲁
    'IN': 'India',  # 印度
    'IE': 'Ireland',  # 爱尔兰
    'CH': 'Switzerland',  # 瑞士
    'NL': 'Netherlands',  # 荷兰
    'PL': 'Poland',  # 波兰
    'EG': 'Egypt',  # 埃及
    'LB': 'Lebanon',  # 黎巴嫩
    'CZ': 'Czech Republic',  # 捷克共和国
    'GR': 'Greece',  # 希腊
    'RO': 'Romania',  # 罗马尼亚
    'VN': 'Vietnam',  # 越南
    'NZ': 'New Zealand',  # 新西兰
    'PR': 'Puerto Rico',  # 波多黎各
    'AU': 'Australia',  # 澳大利亚
    'BH': 'Bahrain',  # 巴林
    'DK': 'Denmark',  # 丹麦
    'BE': 'Belgium',  # 比利时
    'AT': 'Austria',  # 奥地利
    'SE': 'Sweden',  # 瑞典
    'QA': 'Qatar',  # 卡塔尔
    'NO': 'Norway',  # 挪威
    'JO': 'Jordan',  # 约旦
    'HU': 'Hungary',  # 匈牙利
    'OM': 'Oman',  # 阿曼
    'SV': 'El Salvador',  # 萨尔瓦多
    'PT': 'Portugal',  # 葡萄牙
    'CO': 'Colombia',  # 哥伦比亚
    'CR': 'Costa Rica',  # 哥斯达黎加
    'BS': 'Bahamas',  # 巴哈马
    'CY': 'Cyprus',  # 塞浦路斯
    'MA': 'Morocco',  # 摩洛哥
    'FI': 'Finland',  # 芬兰
    'KZ': 'Kazakhstan',  # 哈萨克斯坦
    'GT': 'Guatemala',  # 危地马拉
    'PA': 'Panama',  # 巴拿马
    'BN': 'Brunei',  # 文莱
    'BG': 'Bulgaria',  # 保加利亚
    'KH': 'Cambodia',  # 柬埔寨
    'BO': 'Bolivia',  # 玻利维亚
    'AZ': 'Azerbaijan',  # 阿塞拜疆
    'TT': 'Trinidad and Tobago',  # 特立尼达和多巴哥
    'ZA': 'South Africa',  # 南非
    'SK': 'Slovakia',  # 斯洛伐克
    'CW': 'Curacao',  # 库拉索
    'AW': 'Aruba',  # 阿鲁巴
    'MC': 'Monaco',  # 摩纳哥
    'LU': 'Luxembourg',  # 卢森堡
    'AD': 'Andorra'  # 安道尔
}

# 读取 CSV 文件中的数据
df = pd.read_csv('directory.csv')


def starbucks_stores_worldwide():
    """
    星巴克门店全球分布图
    :return:
    """
    # 处理地图图表
    data = list(df.Country.value_counts().to_dict().items())
    converted_data = [(country_mapping.get(code, code), value) for code, value in data]
    map_chart = Map()
    map_chart.set_global_opts(
        title_opts=opts.TitleOpts(title="星巴克门店全球分布图", pos_left="center"),
        visualmap_opts=opts.VisualMapOpts(max_=14000)
    )
    map_chart.add("", converted_data, maptype="world", is_roam=False, is_map_symbol_show=False,
                  label_opts=opts.LabelOpts(is_show=False))

    return map_chart


def TreeMap_starbucks_stores_worldwide():
    """
    TreeMap图表
    :return:
    """
    # 处理 TreeMap 图表
    df_t = df.fillna(value=dict(Country='NA', City='NA'))
    df_t = df_t.groupby(['Country', 'City']).size().reset_index(name='Count')
    tree_data = []
    for country, group in df_t.groupby('Country'):
        children = [{"name": row['City'], "value": row['Count']} for _, row in group.iterrows()]
        tree_data.append({"name": country, "children": children})

    treemap_chart = TreeMap()

    treemap_chart.add('星巴克门店', tree_data, leaf_depth=1,
                      label_opts=opts.LabelOpts(position="inside", formatter='{b}:{c}门店'),
                      levels=[
                          opts.TreeMapLevelsOpts(
                              treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(border_color="#555", border_width=4,
                                                                               gap_width=4)),
                          opts.TreeMapLevelsOpts(color_saturation=[0.3, 0.6],
                                                 treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                                                     border_color_saturation=0.7, gap_width=2, border_width=2))
                      ])
    treemap_chart.set_global_opts(
        title_opts=opts.TitleOpts(title="星巴克门店全球分布 TreeMap 图", pos_left="center"),
        legend_opts=opts.LegendOpts(is_show=False)
    )
    return treemap_chart


def cities_top_15_stores():
    # 处理 Bar 图表
    top_cities = list(df.City.value_counts().to_dict().items())[0:15]
    bar_chart = Bar()
    bar_chart.set_global_opts(
        title_opts=opts.TitleOpts(title='门店数量在前15的城市', pos_left="center"),
        xaxis_opts=opts.AxisOpts(position='top'),
        yaxis_opts=opts.AxisOpts(is_inverse=True),
        visualmap_opts=opts.VisualMapOpts(is_show=False, dimension=0, max_=300, range_color=['#FFE7D3', '#7A0616'])
    )
    bar_chart.add_xaxis(list(dict(top_cities).keys()))
    bar_chart.add_yaxis('', list(dict(top_cities).values()), label_opts=opts.LabelOpts(position='right'))
    bar_chart.reversal_axis()

    return bar_chart


def percentage_store_ownership():
    # 处理 Pie 图表
    ownership_data = list(df['Ownership Type'].value_counts().to_dict().items())
    pie_chart = Pie()
    pie_chart.set_global_opts(
        title_opts=opts.TitleOpts(title='门店所有权占比')
    )
    pie_chart.add(
        '', ownership_data, rosetype='area', label_opts=opts.LabelOpts(formatter='{b}:{d}%'), radius=['10%', '45%']
    )
    return pie_chart

def starbucks_stores_china():
    # 处理 Geo 图表
    df_china = df[df['Country'] == 'CN']
    geo_data = df_china.groupby(['Longitude', 'Latitude']).size()
    jwd, geo_data_list = [], []
    for (longitude, latitude), count in geo_data.to_dict().items():
        jwd.append((f"{longitude}-{latitude}", longitude, latitude))
        geo_data_list.append((f"{longitude}-{latitude}", count))

    geo_chart = Geo()
    for name, longitude, latitude in jwd:
        geo_chart.add_coordinate(name, longitude, latitude)
    geo_chart.add_schema(maptype='china', is_roam=False)
    geo_chart.add('', geo_data_list, type_='heatmap', is_large=True, blur_size=10, point_size=2)
    geo_chart.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_show=True, max_=max([count for name, count in geo_data_list]), min_=1,
                                          range_color=["blue", "green", "yellow", "red"]),
        title_opts=opts.TitleOpts(title="中国星巴克门店分布热力图", pos_left="center")
    )

    return geo_chart

def make_title(v_title):
    table = Table()
    table.add(headers=[v_title], rows=[], attributes={
        "align": "center",
        "padding": "2px",
        "style": "background:#f5f5f5; width:100%; height:80px; font-size:60px; color:#333333; border:none;"
    })
    table.render("大标题.html")
    return table


# 使用 Page 合并图表
page = Page(layout=Page.DraggablePageLayout)
page.add(
    make_title("星巴克门店分布量化分布可视化"), # 标题
    starbucks_stores_worldwide(), # 图标
    TreeMap_starbucks_stores_worldwide(),
    cities_top_15_stores(),
    percentage_store_ownership(),
    starbucks_stores_china())

# 渲染到 HTML 文件
page.render('starbucks_dashboard.html')

拖拽调整央视布局,保存配置文件

导出配置文件 ,生成可视化报表:

from pyecharts.charts import Page

Page.save_resize_html(
    source="starbucks_dashboard.html",
    cfg_file="chart_config_0809.json",
    dest="starbucks_dashboard_new.html"
)

posted @ 2024-08-08 17:30  酒剑仙*  阅读(744)  评论(0)    收藏  举报