前言
主要使用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()
总结
在此,我学习到了
- 文本换行方法
- 刻度标签的设置方法
- x轴的移动(或者称为’显示‘)方法
- 为图中某点加标签方法annonate
- 坐标轴边框可视化方法