資料視覺化之中國大學綜合排名實戰(二)
阿新 • • 發佈:2022-03-10
中國大學綜合排名
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")