中国各高校数据分析

中国各高校数据分析

一、爬取数据

爬取的网站:中国教育在线
对应的网址:https://gkcx.eol.cn/school/search

打开网址,按F12打开开发者工具
在这里插入图片描述

  • 切换页数发现网址的参数page在发生变化,
    所以想获取某一页的数据集,首先需将url的page参数改为这一页的页数,找到对应的url;
  • 需遍历多少页才能获得整个数据集呢?
    页面数 = 总个数/每页的个数
  1. 获取总个数
import json
import pandas as pd
import numpy as np
import warnings
import requests

url = "https://api.eol.cn/gkcx/api/?access_token=&admissions=&central=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page=1&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=2&sort=view_total&top_school_id=[2941]&type=&uri=apidata/api/gk/school/lists"
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}
res = requests.post(url, headers = headers)
data = json.loads(res.text)
size=data["data"]["numFound"]
  1. 爬取数据集
  • 利用总个数,求取总页数(集总请求数)
  • 遍历请求次数,构造每一次的请求 url,其实主要是更新page参数
  • 解析每一页的数据
# 构建爬取函数
def get_university_info(size, page_size=20):
    page_cnt = int(size/page_size) if size%page_size==0 else int(size/page_size)+1
    print('一共{0}页数据,即将开始爬取...'.format(page_cnt))
    df_result = pd.DataFrame()
    for index in range(1,page_cnt+1):
        print('正在爬取第 {0}/{1} 页数据'.format(index, page_cnt))
        url = "https://api.eol.cn/gkcx/api/?access_token=&admissions=&central=&department=& \
        dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page={0} \
        &province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total \
        &top_school_id=[2941]&type=&uri=apidata/api/gk/school/lists".format(index)
        res = requests.post(url, headers = headers)
        data = json.loads(res.text)
        if data["message"] == "成功":
            df_data = pd.DataFrame(data["data"]["item"])
            df_result = df_result.append(df_data)
    return df_result
#爬取数据
df_data = get_university_info(size)
df_data.head()
df_data.to_excel("11.xlsx") #保存数据

结果如下:
在这里插入图片描述

二、数据分析思维

数据包含字段:地点,官网,所属部门,城市,区域,是否双一流,是否211,是否985,是否招生,普通本科还是专科(高职),校名,性质,省份,类别,总浏览,周浏览,月浏览,年浏览

高校数据
月浏览 / 总浏览 / 周浏览 / 年浏览
前十高校条形图
性质 / 类别 / 普通本科还是专科高职
饼图
各省份高校数量
3D地图
省份/是否211/是否985/是否双一流结合
各省份百分比柱形图
经纬度
地图打点

三、数据分析

  1. 月浏览 / 总浏览 / 周浏览 / 年浏览前十高校条形图
# 读取数据,删除多余的列
data=pd.read_excel("11.xlsx")
data=data.drop("Unnamed: 0",axis=1)
data.head()
#导入库
import pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
  • 绘制周浏览量前十高校柱形图
#数据准备
view_week_number=data[["name","view_week_number"]].sort_values(by = "view_week_number",ascending = False).head(10) #获取周浏览量前十高校
view_week_number

在绘图之前需整理数据,数据结果如下:
在这里插入图片描述

#图形绘制
bar = (Bar()
            .add_xaxis(view_week_number["name"].tolist())
            .add_yaxis("",view_week_number["view_week_number"].tolist())
            .set_series_opts(label_opts=opts.LabelOpts(is_show=True, 
                                                       position='outsideLeft',
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0, 
                                             [{
                                                 offset: 0,
                                                 color: 'rgb(255,99,71)'
                                             }, {
                                                 offset: 1,
                                                 color: 'rgb(32,178,170)'
                                             }])""")) #柱体颜色配置
                            )
            .set_global_opts(
                title_opts=opts.TitleOpts(title="top10周浏览量的学校",
#                                         subtitle='数据截止日期:2021年5月'
                                         ),
#                xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
            )
            .reversal_axis()
        )
  • 绘制月浏览量前十高校柱形图
#数据准备
view_month_number=data[["name","view_month_number"]].sort_values(by = "view_month_number",ascending = False).head(10)
#图形绘制
bar1 = (Bar()
            .add_xaxis(view_month_number["name"].tolist())
            .add_yaxis("",view_month_number["view_month_number"].tolist())
            .set_series_opts(label_opts=opts.LabelOpts(is_show=True, 
                                                       position='outsideLeft',
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0, 
                                             [{
                                                 offset: 0,
                                                 color: 'rgb(255,99,71)'
                                             }, {
                                                 offset: 1,
                                                 color: 'rgb(32,178,170)'
                                             }])"""))
                            )
            .set_global_opts(
                title_opts=opts.TitleOpts(title="top10月浏览量的学校",
#                                         subtitle='数据截止日期:2021年5月',
                                          pos_right="35%"),
#                xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
            )
            .reversal_axis()
        )

  • 绘制年浏览量前十高校柱形图
#数据准备
view_year=data[["name","view_year"]].sort_values(by = "view_year",ascending = False).head(10)
#图形绘制
bar2 = (Bar()
            .add_xaxis(view_year["name"].tolist())
            .add_yaxis("",view_year["view_year"].tolist())
            .set_series_opts(label_opts=opts.LabelOpts(is_show=True, 
                                                       position='outsideLeft',
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0, 
                                             [{
                                                 offset: 0,
                                                 color: 'rgb(255,99,71)'
                                             }, {
                                                 offset: 1,
                                                 color: 'rgb(32,178,170)'
                                             }])""")) #颜色配置
                            )
            .set_global_opts(
                title_opts=opts.TitleOpts(title="top10年浏览量的学校",
#                                         subtitle='数据截止日期:2021年5月',
                                          pos_top="50%"),
#                xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
            )
            .reversal_axis()
        )
  • 绘制总浏览量前十高校柱形图
#数据准备
view_total_number=data[["name","view_total_number"]].sort_values(by = "view_total_number",ascending = False).head(10)
#图形绘制
bar3 = (Bar()
            .add_xaxis(view_total_number["name"].tolist())
            .add_yaxis("",view_total_number["view_total_number"].tolist())
            .set_series_opts(label_opts=opts.LabelOpts(is_show=True, 
                                                       position='outsideLeft',
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0, 
                                             [{
                                                 offset: 0,
                                                 color: 'rgb(255,99,71)'
                                             }, {
                                                 offset: 1,
                                                 color: 'rgb(32,178,170)'
                                             }])"""))
                            )
            .set_global_opts(
                title_opts=opts.TitleOpts(title="top10总浏览量的学校",
#                                         subtitle='数据截止日期:2021年5月',
                                          pos_top="50%",pos_right="35%"),
                xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=25))
            )
            .reversal_axis()
        )

  • 将四个部分的图形组合
grid = (Grid(init_opts=opts.InitOpts(theme='dark', width=1000))
        .add(bar, grid_opts=opts.GridOpts(pos_left="15%",pos_right="50%",pos_top="5%",pos_bottom="55%"))
        .add(bar1, grid_opts=opts.GridOpts(pos_left="60%",pos_right="5%",pos_top="5%",pos_bottom="55%"))
        .add(bar2, grid_opts=opts.GridOpts(pos_left="15%",pos_right="50%",pos_top = "55%",pos_bottom="5%"))
        .add(bar3, grid_opts=opts.GridOpts(pos_left="60%",pos_right="5%",pos_top = "55%",pos_bottom="7%"))
        )
grid.render_notebook()

结果如下:
在这里插入图片描述

厦门大学和四川大学在总浏览量,年浏览量,月浏览量和周浏览量都处于前十,是相当热门和引人关注的大学;
武汉大学,北京大学,清华大学和中山大学在top10总浏览量学校榜,top10年浏览量学校榜靠前位置,但没在top10周浏览量学校榜,top10月浏览量学校榜,属于长期稳定热点大学,长期受广大学子家长关注,但是并不是在每个月的关注量十分突出。

  1. 高校性质,类别,普通本科还是专科(高职)饼图
  • 高校本专科分布饼图
#数据准备
temp = data.groupby('level_name')['name'].count().reset_index()
temp.columns = ['类别','计数']
data_pair = [(row['类别'], row['计数']) for _, row in temp.iterrows()]
data_pair = sorted(data_pair, key=lambda x: x[1], reverse=True)

data_pair

在绘图之前需整理数据,数据结果如下:
在这里插入图片描述

#图形绘制
pie = (Pie(init_opts=opts.InitOpts(theme='dark', width=400))
       .add('', data_pair,
            radius=["30%", "45%"],
             center=["15%", "50%"],#圆心位置,第一个坐标点为横轴位置,第二个坐标点为纵轴位置
            rosetype="radius")
       .set_global_opts(title_opts=opts.TitleOpts(title="高校本专科分布",
                                                  pos_left = "8%",pos_top = "15%"),
                        legend_opts=opts.LegendOpts(is_show=False),)
       .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%",position='inside')) # 显示在图形的标签形式
      )
  • 高校性质分布饼图
#数据准备
temp = data.groupby('nature_name')['name'].count().reset_index()
temp.columns = ['性质','计数']
data_pair = [(row['性质'], row['计数']) for _, row in temp.iterrows()]
data_pair = sorted(data_pair, key=lambda x: x[1], reverse=True)
#图形绘制
pie1 = (Pie(init_opts=opts.InitOpts(theme='dark', width=400))
       .add('', data_pair,
            radius=["30%", "45%"],
            center=["45%", "50%"], 
            rosetype="radius")
       .set_global_opts(title_opts=opts.TitleOpts(title="高校性质分布",
                                                  pos_left = "39%",pos_top = "15%"),
                        legend_opts=opts.LegendOpts(is_show=False),)
       .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%",position='inside'))
      )
  • 高校类别分布饼图
#数据准备
temp = data.groupby("type_name")["name"].count().reset_index()
temp.columns = ["类别","计数"]
data_pair = [(row["类别"],row["计数"]) for i,row in temp.iterrows()]
data_pair = sorted(data_pair,key = lambda x:x[1],reverse = True)
#图形绘制
pie2 = (Pie(init_opts=opts.InitOpts(theme='dark', width=400))
       .add('', data_pair,
            radius=["30%", "45%"],
            center=["80%", "50%"],
            rosetype="radius")
       .set_global_opts(title_opts=opts.TitleOpts(title="高校类别分布",
                                                  pos_left = "72%",pos_top = "15%"),
                        legend_opts=opts.LegendOpts(is_show=False),)
       .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
      )
  • 将三部分图形组合
grid = (Grid(init_opts=opts.InitOpts(theme='dark', width=1000))
        .add(pie, grid_opts=opts.GridOpts())
        .add(pie1, grid_opts=opts.GridOpts())
        .add(pie2, grid_opts=opts.GridOpts())
        )
grid.render_notebook()

结果如下:
在这里插入图片描述
本科高校占总体高校47.51%,专科高职高校占总体高校52.49%,各约占据全体高校半壁江山;
公办高校占据总体高校72.55%,民办高校占据总体高校26.75%,中外合作办学高校占据总体高校0.7%;
在所有高校类别中,理工类高校占比最高,占据全体高校30.61%,其次是综合类29.3%,师范类8.56%,医药类7.65%,财经类7.64%等。

  1. 各省份高校数量
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
#数据准备
coord = {
    '湖北': [114.31667, 30.51667],
    '广东': [113.23333, 23.16667],
    '北京': [116.41667, 39.91667],
    '上海': [121.48, 31.22],
    '辽宁': [123.38, 41.8],
    '江西': [115.90000, 28.68333],
    '四川': [104.06, 30.67],
    '安徽': [117.27, 31.86],
    '广西': [108.33, 22.84],
    '新疆': [87.68, 43.77],
    '江苏': [118.78, 32.04],
    '河北': [114.48, 38.03],
    '浙江': [120.19, 30.26],
    '湖南': [113, 28.21],
    '甘肃': [103.82, 36.07],
    '福建': [119.28000, 26.08],
    '贵州': [106.71, 26.57],
    '海南': [110.35, 20.02],
    '河南': [113.65, 34.76],
    '黑龙江': [126.63, 45.75],
    '吉林': [125.35, 43.88],
    '内蒙古': [111.65, 40.82],
    '宁夏': [106.27, 38.47],
    '山东': [117, 36.65],
    '山西': [112.53, 37.87],
    '陕西': [108.95, 34.27],
    '天津': [117.2, 39.13],
    '西藏': [91.11, 29.97],
    '云南': [102.73, 25.04],
    '重庆': [106.54, 29.59],
    '青海': [101.74, 36.56],
    '澳门': [113.5,22.2],
    '香港':[114.1,22.2]}

temp = data.groupby('province_name')['name'].count().reset_index()
temp.columns = ['地区','计数']
data_pair = []
for idx, row in temp.iterrows():
    name = row['地区']
    value = coord[name]
    value.append(row['计数'])
    data_pair.append([name, value])
data_pair

数据结果如下:
在这里插入图片描述

#图形绘制
chart = Map3D(init_opts=opts.InitOpts(
    width='1000px',
    height='600px',
    theme='dark')
)

# 引用添加的地图
chart.add_schema(
    maptype="china",
    shading="lambert", ## 三维地理坐标系组件中三维图形的着色效果,通过经典的 lambert 着色表现光照带来的明暗。
    emphasis_label_opts=opts.LabelOpts(is_show=True),
    itemstyle_opts=opts.ItemStyleOpts(
            color="#00BFFF",
            opacity=1,
            border_width=0.5,  #地图边界深浅
            border_color="rgb(0,0,0)", #地图边界颜色
    ),
    light_opts=opts.Map3DLightOpts(
        main_color ="#fff", # 主光源的颜色
        main_shadow_quality='high',  # 阴影的质量。可选'low', 'medium', 'high', 'ultra'
        is_main_shadow=True,# 主光源是否投射阴影。默认为关闭。
        main_intensity=1,# 主光源的强度。
        main_alpha=30,  # 主光源绕 x 轴,即上下旋转的角度。
    ),
    post_effect_opts=opts.Map3DPostEffectOpts(
        is_enable=True,# 是否开启后处理特效。默认关闭。
    )
)
chart.add(
    "学校数量",
    data_pair=data_pair,
    type_="bar3D",# 叠加图的类型(目前只支持 Bar3D,Line3D,Lines3D,Scatter3D)
     bar_size=1.5, # 设置柱子的大小
     min_height=3,  # 最小柱子高度
    bevel_size = 0.5, # 柱子的倒角尺寸。支持设置为从 0 到 1 的值。默认为 0,即没有倒角。
    bevel_smoothness = 5, # 柱子倒角的光滑/圆润度,数值越大越光滑/圆润
    shading="lambert",  # 三维地图中三维图形的着色效果。
    label_opts=opts.LabelOpts(
            is_show=False,
            formatter=JsCode(
                "function(data){return data.name + ': ' + data.value[2];}"),
    )    #设置标签显示
)
chart.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(
        is_show=False,
        type_='color',
        dimension=2,
        range_color=[
            '#313695',
            '#4575b4',
            '#74add1',
            '#abd9e9',
            '#e0f3f8',
            '#ffffbf',
            '#fee090',
            '#fdae61',
            '#f46d43',
            '#d73027',
            '#a50026']
    ),
    title_opts=opts.TitleOpts(
        title="全国各省学校统计",
        pos_left="2%",
        pos_top='1%',
        title_textstyle_opts=opts.TextStyleOpts(color='#00BFFF', font_size=20)
        ),
    tooltip_opts=opts.TooltipOpts(is_show=False),
    legend_opts=opts.LegendOpts(is_show=False)
)
chart.render_notebook()

结果如下:
在这里插入图片描述
江苏高校数量在全国各省份中,位居第一,共174个高校,其次广东,共163个高校,后面分别是山东160,河南158,四川137,湖南134,湖北129,安徽128,河北126。

  1. 省份与是否211,是否985,是否双一流结合 柱形图
  • 省份与是否211关系图
#数据准备
data_2111=data[data["f211"]==1].groupby("province_name")["f211"].count().reset_index()
data_2112=data[data["f211"]==2].groupby("province_name")["f211"].count().reset_index()
data_211=data_2111.merge(data_2112,how="outer",on="province_name")
data_211.columns = ["省份","211","非211"]
data_211=data_211.fillna(0)
data_211["总数"]=data_211["211"]+data_211["非211"]
data_211["211"] = round(data_211["211"]/data_211["总数"]*100,2)
data_211["非211"] = round(data_211["非211"]/data_211["总数"]*100,2)
data_211.sort_values(by='211', inplace=True)
data_211

在绘图之前需整理数据,数据结果如下:
在这里插入图片描述

#图形绘制
bar = Bar(
    init_opts=opts.InitOpts(
        width='1000px',
        height='1000px',
        bg_color='#d6e7ff')
)
bar.add_xaxis(
    data_211['省份'].tolist()
)
bar.add_yaxis(
    '211',
    data_211['211'].tolist(),
    stack=1,
    label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
    itemstyle_opts={
        'normal': {
            'shadowColor': 'rgba(0, 0, 0, .5)',  # 阴影颜色
            'shadowBlur': 5,  # 阴影大小
            'shadowOffsetY': 2,  # Y轴方向阴影偏移
            'shadowOffsetX': 2,  # x轴方向阴影偏移
            'borderColor': '#fff'
        }
    }
)

bar.add_yaxis(
    '非211',
    data_211['非211'].tolist(),
    stack=1,
    label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
    itemstyle_opts={
        'normal': {
            'shadowColor': 'rgba(0, 0, 0, .5)',  # 阴影颜色
            'shadowBlur': 5,  # 阴影大小
            'shadowOffsetY': 2,  # Y轴方向阴影偏移
            'shadowOffsetX': 2,  # x轴方向阴影偏移
            'borderColor': '#fff'
        }
    }
)

bar.set_global_opts(
    xaxis_opts=opts.AxisOpts(is_show=False, max_=100),
    yaxis_opts=opts.AxisOpts(
        axisline_opts=opts.AxisLineOpts(is_show=False),
        axistick_opts=opts.AxisTickOpts(is_show=False)),
    legend_opts=opts.LegendOpts(is_show=True, pos_top='1%', pos_right='10%'),
    title_opts=opts.TitleOpts(
        title="全国各省211学校分布",
        pos_left="5%",
        pos_top='1%',
        title_textstyle_opts=opts.TextStyleOpts(font_size=20)
        ),
)

bar.reversal_axis()
bar.set_colors(['red', 'blue'])
bar.render_notebook()

结果如下:
在这里插入图片描述

  • 省份与是否985关系图
#数据准备
data_9851=data[data["f985"]==1].groupby("province_name")["f985"].count().reset_index()
data_9852=data[data["f985"]==2].groupby("province_name")["f985"].count().reset_index()
data_985=data_9851.merge(data_9852,how="outer",on="province_name")
data_985.columns = ["省份","985","非985"]
data_985=data_985.fillna(0)
data_985["总数"]=data_985["985"]+data_985["非985"]
data_985["985"] = round(data_985["985"]/data_985["总数"]*100,2)
data_985["非985"] = round(data_985["非985"]/data_985["总数"]*100,2)
data_985.sort_values(by='985', inplace=True)
#图形绘制
bar = Bar(
    init_opts=opts.InitOpts(
        theme='dark',
        width='1000px',
        height='1000px',
        bg_color='#000')
)
bar.add_xaxis(
    data_985['省份'].tolist()
)
bar.add_yaxis(
    '985',
    data_985['985'].tolist(),
    stack=1,
    label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
    itemstyle_opts={
        'normal': {
            'shadowColor': 'rgba(0, 0, 0, .5)',  # 阴影颜色
            'shadowBlur': 5,  # 阴影大小
            'shadowOffsetY': 2,  # Y轴方向阴影偏移
            'shadowOffsetX': 2,  # x轴方向阴影偏移
            'borderColor': '#fff'
        }
    }
)

bar.add_yaxis(
    '非985',
    data_985['非985'].tolist(),
    stack=1,
    label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
    itemstyle_opts={
        'normal': {
            'shadowColor': 'rgba(0, 0, 0, .5)',  # 阴影颜色
            'shadowBlur': 5,  # 阴影大小
            'shadowOffsetY': 2,  # Y轴方向阴影偏移
            'shadowOffsetX': 2,  # x轴方向阴影偏移
            'borderColor': '#fff'
        }
    }
)

bar.set_global_opts(
    xaxis_opts=opts.AxisOpts(is_show=False, max_=100),
    yaxis_opts=opts.AxisOpts(
        axisline_opts=opts.AxisLineOpts(is_show=False),
        axistick_opts=opts.AxisTickOpts(is_show=False)),
    legend_opts=opts.LegendOpts(is_show=True, pos_top='1%', pos_right='10%'),
    title_opts=opts.TitleOpts(
        title="全国各省985学校分布",
        pos_left="5%",
        pos_top='1%',
        title_textstyle_opts=opts.TextStyleOpts(font_size=20)
        ),
)

bar.reversal_axis()
bar.set_colors(['red', 'blue'])
bar.render_notebook()

结果如下:
在这里插入图片描述

  • 省份与是否双一流关系图
#数据准备
data["dual_class_name"] = data["dual_class_name"].fillna("非双一流")
data_dual_class_name1=data[data["dual_class_name"]=="双一流"].groupby("province_name")["dual_class_name"].count().reset_index()
data_dual_class_name2=data[data["dual_class_name"]=="非双一流"].groupby("province_name")["dual_class_name"].count().reset_index()
data_dual_class_name=data_dual_class_name1.merge(data_dual_class_name2,how="outer",on="province_name")
data_dual_class_name.columns = ["省份","双一流","非双一流"]
data_dual_class_name=data_dual_class_name.fillna(0)
data_dual_class_name["总数"]=data_dual_class_name["双一流"]+data_dual_class_name["非双一流"]
data_dual_class_name["双一流"] = round(data_dual_class_name["双一流"]/data_dual_class_name["总数"]*100,2)
data_dual_class_name["非双一流"] = round(data_dual_class_name["非双一流"]/data_dual_class_name["总数"]*100,2)
data_dual_class_name.sort_values(by='双一流', inplace=True)

#图形绘制
bar = Bar(
    init_opts=opts.InitOpts(
        theme='dark',
        width='1000px',
        height='1000px',
        bg_color='#000')
)
bar.add_xaxis(
    data_dual_class_name["省份"] .tolist()
)
bar.add_yaxis(
    '双一流',
    data_dual_class_name["双一流"] .tolist(),
    stack=1,
    label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
    itemstyle_opts={
        'normal': {
            'shadowColor': 'rgba(0, 0, 0, .5)',  # 阴影颜色
            'shadowBlur': 5,  # 阴影大小
            'shadowOffsetY': 2,  # Y轴方向阴影偏移
            'shadowOffsetX': 2,  # x轴方向阴影偏移
            'borderColor': '#fff'
        }
    }
)

bar.add_yaxis(
    '非双一流',
    data_dual_class_name["非双一流"] .tolist(),
    stack=1,
    label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
    itemstyle_opts={
        'normal': {
            'shadowColor': 'rgba(0, 0, 0, .5)',  # 阴影颜色
            'shadowBlur': 5,  # 阴影大小
            'shadowOffsetY': 2,  # Y轴方向阴影偏移
            'shadowOffsetX': 2,  # x轴方向阴影偏移
            'borderColor': '#fff'
        }
    }
)

bar.set_global_opts(
    xaxis_opts=opts.AxisOpts(is_show=False, max_=100),
    yaxis_opts=opts.AxisOpts(
        axisline_opts=opts.AxisLineOpts(is_show=False),
        axistick_opts=opts.AxisTickOpts(is_show=False)),
    legend_opts=opts.LegendOpts(is_show=True, pos_top='1%', pos_right='10%'),
    title_opts=opts.TitleOpts(
        title="全国各省双一流分布",
        pos_left="5%",
        pos_top='1%',
        title_textstyle_opts=opts.TextStyleOpts(font_size=20)
        ),
)

bar.reversal_axis()
bar.set_colors(['red', 'blue'])
bar.render_notebook()

结果如下:
在这里插入图片描述

  1. 地图打点
  • 获取各高校经纬度
#读取数据
df_data=pd.read_excel("11.xlsx")
df_data.drop("Unnamed: 0",axis=1,inplace=True)
df_data.head()
#构建获取经纬度函数
def get_data(url):
    res = requests.get(url,headers = headers)
    data = json.loads(res.text)
    if len(data["results"])>0:
        df_data = pd.DataFrame(data["results"])
        df_data["lat"] = df_data["location"].apply(lambda x:x["lat"])
        df_data["lng"] = df_data["location"].apply(lambda x:x["lng"])
        bd_lng = df_data.loc[0,"lng"]
        bd_lat = df_data.loc[0,"lat"]
        return bd_lng,bd_lat
#遍历各高校,获取各高校经纬度
for row_index,data_row in df_data.iterrows():
    region = data_row["province_name"]+data_row['city_name']
    query = data_row["name"]
    url = "http://api.map.baidu.com/place/v2/search?query={0}&tag={1}&region={2}&output=json&ak={3}".format(query,"高等院校",region,"")
    try:
        bd_lng,bd_lat = get_data(url)
        df_data.loc[df_data["name"]==query,'bd经度'] = bd_lng
        df_data.loc[df_data["name"]==query,'bd维度'] = bd_lat
    except:
        print("{0} 爬取失败,请注意!".format(query))
        print(url)
        continue
#将数据保存
df_data.to_excel("55.xlsx")
  • 绘制散点地图
#读取数据
data = pd.read_excel("55.xlsx")
#绘制图形
#使用pyecharts中的Geo类绘制散点图

from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType

city = 'china'

#实例化一个Geo类
geo = Geo(init_opts=opts.InitOpts(theme='dark', width=1000))
#中国地图为底景
geo.add_schema(maptype=city)
# 添加地点坐标至坐标库中
for i in range(len(data["name"])):
    geo.add_coordinate(data.iloc[i]['name'],data.iloc[i]['bd经度'],data.iloc[i]['bd维度'])

data_pair = [(data.iloc[i]['name'],int(data.iloc[i]['view_month_number'])) for i in range(len(data["name"]))]
    
# 将数据添加到地图上
geo.add('',data_pair,type_=GeoType.EFFECT_SCATTER, symbol_size=5)
# 设置样式
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
#自定义分级
pieces = [
        {'min': 0, 'max': 50, 'label': '1', 'color': '#FFFFF4'},
        {'min':500, 'max': 100, 'label': '1', 'color': '#FFFF93'},
        {'min': 100, 'max': 250, 'label': '2', 'color': '#F9F900'},
        {'min': 250, 'max': 500, 'label': '2', 'color': '#FFD306'},
        {'min': 500, 'max': 750, 'label': '2', 'color': '#FFA042'},
         {'min': 750, 'max': 1000, 'label': '2', 'color': '#FF8040'},
        {'min': 1000, 'max': 10000, 'label': '3', 'color': '#2828FF'},
        {'min': 10000, 'label': '4', 'color': '#3700A4'}
]
#是否自定义分段
geo.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
        title_opts=opts.TitleOpts(title='各高校可视化'),
    )
    
geo.render_notebook()

结果如下:
在这里插入图片描述

  • 利用聚类,找出高校几个集群
    a. 采用肘方法来选取一个恰当的K值
from sklearn.cluster import KMeans

inertia = []
for i in range(1,21):
    
    kmeans = KMeans(n_clusters=i,
    init='k-means++',
    n_jobs=1)
    
    X = data[['bd经度','bd维度']]
    kmeans.fit(X)
    inertia.append(kmeans.inertia_)

#绘制误差和随K值的变化曲线图

import matplotlib.pyplot as plt

plt.style.use('fivethirtyeight')
plt.figure(figsize=(12,6))
plt.plot(range(1,21),inertia)

plt.title('The Elbow Method')
plt.xlabel('K')
plt.ylabel('inertia')

plt.show()

结果如下:
在这里插入图片描述
b. 根据图形,将数据分为5组

kmeans = KMeans(n_clusters=5,
init='k-means++',
n_jobs=1)

X = data[['bd经度','bd维度']]
kmeans.fit(X)
y_pred = kmeans.predict(X)

c. 绘制地图,查看分组结果



from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType

city = 'china'

#实例化一个Geo类
geo = Geo()

geo.add_schema(maptype=city)
# #添加地点坐标至坐标库中
for i in range(len(data["name"])):
    geo.add_coordinate(data.iloc[i]['name'],data.iloc[i]['bd经度'],data.iloc[i]['bd维度'])

data_pair = [(data.iloc[i]['name'],int(y_pred[i])) for i in range(len(data["name"]))]
    
# 将数据添加到地图上
geo.add('',data_pair,type_=GeoType.EFFECT_SCATTER, symbol_size=5)
# 设置样式
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
#自定义分级
pieces = [
        {'min': 0, 'max': 0, 'label': '1', 'color': '#50A3BA'},
        {'min': 0, 'max': 1, 'label': '2', 'color': '#DD0200'},
        {'min': 1, 'max': 2, 'label': '3', 'color': '#E2C568'},
        {'min': 2, 'max': 3, 'label': '4', 'color': '#FFD306'},
        {'min': 3, 'max': 4, 'label': '5', 'color': '#FFFF93'}
]
#是否自定义分段
geo.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
        title_opts=opts.TitleOpts(title='中国高校分组可视化'),
    )
    
geo.render_notebook()

结果如下:
在这里插入图片描述
d. 获取聚类中心坐标

center_ = kmeans.cluster_centers_
center_

结果如下:
在这里插入图片描述

这五个经纬度对应的地址:
江西省上饶市余干县
河北省衡水市冀州区
新疆维吾尔自治区巴音郭楞蒙古自治州轮台县
重庆市江津区油溪长江大桥
吉林省四平市铁东区四平服务区

由此可见,这五个高校群的中心点可视为江西省,河北省,新疆,重庆市,吉林省。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值