第一次正经用Python做散点图,遇到了很多问题,记录下来
数据来源:QS世界大学排名
数据处理:把数据放置到一个excel中,做成如下图表:
一开始想做两个平面图,一个放学科和rank,一个放专业和rank,再把两个拼接起来,但是实在不是很会最后只做了一个专业的。为了便于读取数据,把专业和排名单独放在sheet3里面:
读取文件只需要读取sheet3的内容:
data2 = pd.read_excel(r'C:\Users\Lenovo\Desktop\QS Oxford Subject Ranks(2020)\QS_Oxford_Subject_Ranks(2020).xlsx',sheet_name=2)
要特别注意一点,文件的名字最好不要有空格,这里是用’_‘代替了空格’ '。
读取之后就是处理数据,两个过程要用到matplotlib和pandas库:
import pandas as pd
import matplotlib.pyplot as plt
关于库的下载,如果用的是IDLE之类的集成开发,应该需要进入cmd(搜索“运行”),输入pip install +库名
因为我用的是pycharm直接可以在setting的python interpreter下面搜索安装
将横纵轴的值保存在变量profession 和 rank下面
profession = data2['Profession']
rank2 = data2['Rank']
设计坐标轴名称,横轴为PROFESSION,纵轴RANK。并且希望坐标轴名称能够加粗、变个颜色,字号大一些,需要用到fontdict={}
# 设置坐标轴名称,fontdict用于改变字体属性,比如加粗、大小、颜色等
plt.xlabel('PROFESSIONS',fontdict={'weight':'heavy','size':50,'color':'blue'})
plt.ylabel('RANK',fontdict={'weight':'heavy','size':50,'color':'blue'})
设计坐标轴标签的样式
# 设置坐标轴标签的样式,fontsize表示字号,rotation是旋度
plt.xticks(fontsize=30,rotation=90) # 标签旋转90°
plt.yticks(fontsize=30)
如果不加rotation,因为横轴标签太长,会导致字符重叠
运行后发现这里存在一个问题,即纵轴是从0开始的,而排名没有第0名,希望从1开始,用到numpy下的一个函数arange,界定纵轴刻度、区间。
import numpy as np
y = np.arange(1,31,1)
plt.yticks(y,fontsize=30)
最后绘制散点图,用scatter函数
# 构建散点图
plt.title('QS Oxford Profession Ranks')
plt.scatter(profession, rank2, marker='o', s=400) # 可以写成plt.scatter(profession[:],rank2[:]),好处是可以只选择部分数据
fig = plt.gcf()
fig.set_size_inches(40,32,forward=True)
# 调节内容在整幅图的位置
plt.subplots_adjust(top=0.9,bottom=0.2,left=0.15,right=0.95)
plt.show()
# 保存为图片
fig.savefig('QS Oxford Subject Ranks(2020).png',dpi=100)
这时候发现纵轴是1,2,3···30,太过于密集,想写成1开头,但是在5,10,15,20,25,30标出,则可以把y直接定义成列表
y = [1, 5, 10, 15, 20, 25, 30]
完整代码如下:
# -*- coding:utf-8 -*-
# author:LMo time:2020/11/6
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 读取excel的专业数据
data2 = pd.read_excel(r'C:\Users\Lenovo\Desktop\QS Oxford Subject Ranks(2020)\QS_Oxford_Subject_Ranks(2020).xlsx',sheet_name=2)
print(data2)
profession = data2['Profession']
rank2 = data2['Rank']
# 设置坐标轴名称,fontdict用于改变字体属性,比如加粗、大小、颜色等
plt.xlabel('PROFESSIONS',fontdict={'weight':'heavy','size':50,'color':'blue'})
plt.ylabel('RANK',fontdict={'weight':'heavy','size':50,'color':'blue'})
# 设置坐标轴标签的样式,fontsize表示字号,rotation是旋度
plt.xticks(fontsize=30,rotation=90) # 标签旋转90°
y = [1,5,10,15,20,25,30]
plt.yticks(y,fontsize=30)
# 构建散点图
plt.title('QS Oxford Profession Ranks')
plt.scatter(profession, rank2, marker='o', s=400) # 可以写成plt.scatter(profession[:],rank2[:]),好处是可以只选择部分数据
fig = plt.gcf()
fig.set_size_inches(40,32,forward=True)
# 调节内容在整幅图的位置
plt.subplots_adjust(top=0.9,bottom=0.2,left=0.15,right=0.95)
plt.show()
# 保存为图片
fig.savefig('QS Oxford Subject Ranks(2020).png',dpi=100)
运行效果如图: