利用matplotlib仿照时间轴图,绘制不同大学在不同机构上的排名变化图

前言

主要使用matlib基于对象的一些简单技术,本文一是为了留存,二是为了学习。

所用库

matplotlib.pylplot
pathlib
csv
warning #忽视一部分由于版本问题警告
textwrap #对过长的标签分行处理

代码

由于数据中有一部分数据为被比较对象,有一部分为比较主体,即CSI指数,所以先对主体数据绘制图像,在补充说明被比较的数据,故代码中绘图部分分别放在了两个循环体中。定制图像时使用的是比较主体的数据。

'''这是一个绘制时间轴图的程序'''
import matplotlib.pyplot as plt
import textwrap

import warnings  
warnings.filterwarnings('ignore')   #忽略警告内容,即该函数未来可能被其他函数取代的警告
plt.rcParams['font.sans-serif']=['SimHei']      #让中文字符顺利展示
plt.rcParams['axes.unicode_minus']=False     #让负号顺利显示   ,params (参数)

from pathlib import Path
import csv 
path = Path("四大机构大学排名.csv")
lines = path.read_text().splitlines()
reader = csv.reader(lines)
header = next(reader)
for index, proper in enumerate(header):
    print(f"{index} : {proper}")

#画板
fig, ax = plt.subplots(figsize=(12,10))
#设置颜色队列
colorlist = ['#FFD700','#B8860B','#FF8C00','#DEB887','#A0522D','#D2B48C','#DAA520',
             '#DAA520','#FFD700','#D2691E','#6495ED','#FA8072','#FF0000','#B22222',
             '#EE82EE','#800080','#FF00FF','#0000FF','#483D8B','#0000CD',]

#采值,绘图
univ_name = []
colorid = 0
#采CSI的数据
for index in reader:
    if index[1] != 'CSI':
        break
    #采值
    univ_name.append(index[0])
    x_data = []
    y_data = []
    y_value = 5
    for i in range(2,7):
        if index[i] == '0':
            y_value -= 1
        else:
            x_data.append(int(index[i]))
            y_data.append(y_value)
            y_value -= 1

    #绘图
    #作线图
    ax.plot(x_data,y_data,linewidth=1.5,color=colorlist[colorid])

    # #做散点图
    ax.scatter(x_data,y_data,s=300,color=colorlist[colorid])
    colorid += 1

    #给首个散点加上大学标签
    # ax.annotate(f"{univ_name}", xy=(x_data[0],y_data[0]), xytext=(x_data[0]-0.04,y_data[0]+0.1),color='black',fontsize=14)

    #给首个散点加上排序标签
    ax.annotate(f"{x_data[0]}", xy=(x_data[0],y_data[0]), xytext=(x_data[0]-0.2,y_data[0]-0.05),color='white',fontsize=14)

#采其他机构开头的数据
for index in reader:
    if index[1] == 'CSI':
        break
    #采值
    uname = index[0]
    x_data = []
    y_data = []
    y_value = 5
    for i in range(2,7):
        if index[i] == '0':
            y_value -= 1
        else:
            x_data.append(int(index[i]))
            y_data.append(y_value)
            y_value -= 1

    #绘图
    #作线图
    ax.plot(x_data,y_data,linewidth=2, linestyle='--',color='black',alpha=0.3)

    #做散点图
    ax.scatter(x_data,y_data,s=300,color="black", alpha=0.3)

    #标签换行处理
    wlabel = textwrap.fill(uname, 4)

    #给首个散点加上大学标签
    ax.annotate(f"{wlabel}", xy=(x_data[0],y_data[0]), xytext=(x_data[0]-0.35,y_data[0]+0.1),color='black',fontsize=7)

    #给首个散点加上排序标签
    ax.annotate(f"{x_data[0]}", xy=(x_data[0],y_data[0]), xytext=(x_data[0]-0.2,y_data[0]-0.05),color='white',fontsize=14)


#移动x轴到上方
ax.tick_params(top=True, labeltop=True, bottom=False, labelbottom=False) 



#设置x轴刻度标签
ax.set_xticks(list(range(1,len(univ_name)+1)))
#x轴标签换行处理
wrapped_labels = [textwrap.fill(label, 6) for label in univ_name]
ax.set_xticklabels(wrapped_labels, fontsize=8, rotation=45 , ha='center')


#设置y轴刻度表标签
y_labels_data = [5,4,3,2,1]
y_labels = ['学者指数CSI排名','软科榜','QS榜','USnews榜','泰晤士榜',]
ax.set_yticks(y_labels_data)
ax.set_yticklabels(y_labels)

#去除边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

plt.show()

总结

在此,我学习到了

  1. 文本换行方法
  2. 刻度标签的设置方法
  3. x轴的移动(或者称为’显示‘)方法
  4. 为图中某点加标签方法annonate
  5. 坐标轴边框可视化方法
  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值