1. 程式人生 > 其它 >資料視覺化之中國大學綜合排名實戰(二)

資料視覺化之中國大學綜合排名實戰(二)

中國大學綜合排名

1、導包

from pyecharts.charts import Map, Bar, Pie
from pyecharts import options as opts
from pyecharts.render import make_snapshot
import pandas as pd
from snapshot_selenium import snapshot

2、資料清洗

#  讀取資料
df = pd.read_excel("./xlsx/中國大學綜合排名2021.xlsx")
# 列印前5條資料
print(df.head())
# 查看錶格資料型別
print(df.dtypes)
# 查看錶格資料描述
print(df.describe())
# 查看錶格缺失資料
print(df.isnull().sum())
#  填充某一列缺失資料
# 填充升/降資料,以填充0為例:
df["升/降"].fillna(0, inplace=True)
# 再次查看錶格缺失資料
print(df.isnull().sum())
# 一次性填充所有缺失資料
df.fillna(0, inplace=True)
# 把資料的統計資訊給打印出來
print(df.describe())

# 統計所有排名未改變的學校
print(df[df["升/降"] == 0])
# 統計前50名中排名下降的學校
print(df.loc[(df["排名"] < 50) & (df["升/降"] < 0), :])

3、資料視覺化

1. 各省市大學數量和平均分柱狀圖(橫向)

# 統計各省市大學數量
df_counts = df.groupby('省市')['學校名稱'].agg("count")
# 各省市大學平均分排序
df_means0 = df.groupby('省市')['總分'].agg("mean")
df_means = df_means0.round(2)  # 保留兩位小數點
df1 = pd.concat([df_counts, df_means], axis=1)  # 重點concat資料連線axis=1按列
df1.columns = ['數量', '平均分']  # 重點設定groupby裡面的行標題
df1.sort_values(by=['平均分'], ascending=False, inplace=True)  # 使用平均分進行排序

# 把資料轉為list型別,做圖形
d1 = df1.index.tolist()
d2 = df1["數量"].values.tolist()
d3 = df1["平均分"].values.tolist()

# 各省市大學數量和平均分柱狀圖(橫向)
bar = (
    Bar(init_opts=opts.InitOpts(bg_color="white"))
        .add_xaxis(d1)
        .add_yaxis("數量", d2)
        .add_yaxis("平均分數", d3)
        .set_global_opts(title_opts=opts.TitleOpts(title="中國大學排名"),
                         yaxis_opts=opts.AxisOpts(name="量"),
                         xaxis_opts=opts.AxisOpts(name="省份"))
)

make_snapshot(snapshot, bar.render("./html/ChinaBarX.html"), "./img/ChinaBarX.png")

2. 各省市大學數量和平均分柱狀圖(縱向)

df1.sort_values(by=['平均分'], ascending=True, inplace=True)  # 使用平均分進行排序

d1 = df1.index.tolist()
d2 = df1["數量"].values.tolist()
d3 = df1["平均分"].values.tolist()

bar = (
    Bar(init_opts=opts.InitOpts(bg_color="white"))
        .add_xaxis(d1)
        .add_yaxis("數量", d2)
        .add_yaxis("平均分數", d3)
        .reversal_axis()
        .set_series_opts(label_opts=opts.LabelOpts(position='right'))
        .set_global_opts(title_opts=opts.TitleOpts(title="中國大學排名"),
                         yaxis_opts=opts.AxisOpts(name="量"),
                         xaxis_opts=opts.AxisOpts(name="省份"))
)

make_snapshot(snapshot, bar.render("./html/ChinaBarY.html"), "./img/ChinaBarY.png")

3. 各省市大學數量玫瑰圖

city = df_counts.index.tolist()
num = df_counts.values.tolist()
# radius=["20%", "60%"] 餅圖的半徑,陣列的第一項是內半徑,第二項是外半徑
# center=["50%", "55%"] 餅圖的中心(圓心)座標,陣列的第一項是橫座標,第二項是縱座標
# rosetype="radius" 是否展示成南丁格爾圖,通過半徑區分資料大小,有'radius'和'area'兩種模式。

pie = (
    Pie(init_opts=opts.InitOpts(bg_color="white"))
        .add("", [list(z) for z in zip(city, num)], radius=["20%", "60%"], center=["50%", "55%"], rosetype="radius")
        .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{d}%'))
)
#
make_snapshot(snapshot, pie.render("./html/meiguiPie.html"), "./img/meiguiPie.png")

4. 各省市大學數量南丁格爾玫瑰圖

df_counts.sort_values(ascending=False, inplace=True)
pro = df_counts.index.tolist()
nums = df_counts.values.tolist()

piendge = (
    Pie(init_opts=opts.InitOpts(bg_color="white"))
        .add("", [list(z) for z in zip(pro, nums)], radius=["30%", "105%"], center=["50%", "60%"], rosetype="area")
        .set_global_opts(title_opts=opts.TitleOpts(title="中國大學排名"), legend_opts=opts.LegendOpts(is_show=False))
        .set_series_opts(
        label_opts=opts.LabelOpts(is_show=True, position="inside", formatter='{b}:{c}', font_weight="bold",
                                  font_size=15))
)
make_snapshot(snapshot, piendge.render("./html/NdgePie.html"), "./img/NdgePie.png")

5. 中國大學排名地圖

citys = df_counts.index.tolist()
res = df_counts.values.tolist()

map = (
    Map(init_opts=opts.InitOpts(bg_color="white"))
        .add("", [list(z) for z in zip(citys, res)], "china")
        .set_global_opts(title_opts=opts.TitleOpts(title="中國大學排名"),
                         visualmap_opts=opts.VisualMapOpts(is_show=True, max_=40, split_number=8, is_piecewise=True))
)
make_snapshot(snapshot, map.render("./html/ChinaMap.html"), "./img/ChinaMap.png")