目录
绘制TIOBE编程指数曲线
描述
TIOBE 编程社区指数是编程语言流行程度的指标。索引每月更新一次。基于全球熟练工程师、课程和第三方供应商的数量而定得出相应评级。流行搜索引擎如谷歌、必应、雅虎、维基百科、亚马逊、YouTube 和百度等都用于指数计算。
需要注意的是,TIOBE 索引并不代表语言的好坏,该索引可用于检查开发者的编程技能是否仍然是最新的,或在开始构建新软件系统时,对应采用何种编程语言做出战略性决策。
访问网址:https://www.tiobe.com/tiobe-index/,可以看到2021年12月编程语言指数曲线如下:
这个曲线的数据就隐藏在网页中,提取网页中的数据保存在附件的文本中,读取文本中的数据,用matplotlib绘制示例中的图:
示例一为线型图,要求线宽度为2,Python语言的曲线粗为4,标签放在合适的位置。
示例二为饼图,绘制要求参考图示,数据为最后一个月的排名数据。
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, normalize=True, data=None)
要求:提交可以运行的代码,绘图结果截图以附件形式上传。
输入输出示例
import numpy
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
#**********读取数据**********
class Date:
def UTC(obj,year,month,day):
date=[str(year),str(month),str(day)]
return '-'.join(date)
with open('tiobe202112.txt','r') as f:
name,data,Date='name','data',Date()
res=eval(f.read())
print(res)
#**********绘制折线图**********
_data={}
for i in res:
_data[i['name']]=i['data']
_x=['2002','2004','2006','2008','2010',
'2012','2014','2016','2018','2020']
fig = plt.figure(figsize=(30, 20), dpi=100)
for i in _data.keys():
x=[x[0] for x in _data[i]]
y=[y[1] for y in _data[i]]
plt.plot(x,y,lw=4)
plt.legend(_data.keys(), ncol=2)
plt.xticks([x[0] for x in _data['Python'] if x[0][0:4] in _x][::12],labels=_x)
plt.savefig('_data.png')
plt.show()
#**********绘制饼图**********
_data_=[i['data'][-1][1] for i in res]
plt.pie(_data_,labels=_data.keys(),autopct='%.2f%%')
plt.legend(_data.keys(),loc=2,bbox_to_anchor=(1.05,1.0),borderaxespad=0.)
plt.savefig('_data_.png')
plt.show()
本题中的数据处理
JSON数据:
[{"firstName":"John","lastName":"Doe" },
{"firstName":"Anna","lastName":"Smith" },
{"firstName":"Peter","lastName":"Jones" }]
本题的数据:
[{name:'Python',data:[[Date.UTC(2001, 5, 30), 1.25],[Date.UTC(2001, 6, 30), 1.13],...]},
{name:'C',data:[[Date.UTC(2001, 5, 30), 20.24],[Date.UTC(2001, 6, 30), 20.77],...]},
...]
JSON数据和本题的数据结构上均为键值对,但前者的key均为字符串,而本题的数据中的key不是字符串,且value还包括JS的Date对象(如,Date.UTC(2001, 5, 30))。综上所述,本题的数据显然是无法使用JSON库进行读取的,而若使用对其使用eval(),则会出现如下问题:
with open('tiobe202112.txt','r') as f:
res=eval(f.read())
图中的错误信息表明,eval()将数据中的name(key)识别为变量。修改代码,尝试定义name,data,结果如下:
with open('tiobe202112.txt','r') as f:
name,data='name','data'
res=eval(f.read())
图中的错误信息表明,eval()无法识别JS的Date对象的UTC方法。同样,再次修改代码,尝试定义Date对象并在其内部创建方法UTC,结果成功读取
class Date:
def UTC(obj,year,month,day):
date=[str(year),str(month),str(day)]
return '-'.join(date)
with open('tiobe202112.txt','r') as f:
name,data,Date='name','data',Date()
res=eval(f.read())
Python中的面向对象
习题
1.动态绘制一条笛卡尔心形线。
以下代码是搬运的,推荐阅读原博主的博客
传送门:https://blog.csdn.net/qq_42951560/article/details/118519398
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
figure = plt.figure()
line1, = plt.axes(xlim=(-1.5, 1.5), ylim=(-2.2, 0.45)).plot([], [], c='r')
line2, = plt.axes(xlim=(-1.5, 1.5), ylim=(-2.2, 0.45)).plot([], [], c='r')
def init():
line1.set_data([], [])
line2.set_data([], [])
return line1, line2
def update(i, a):
theta = np.linspace(0, i/np.pi, 100)
x = a*(1-np.cos(theta))*np.sin(theta)
y = a*(1-np.cos(theta))*np.cos(theta)
line1.set_data(x, y)
line2.set_data(-x, y)
return line1, line2
def cardioid_animate(a):
ani = animation.FuncAnimation(figure, update, init_func=init, frames=11, fargs=(a,), blit=True)
plt.axis('off')
ani.save('./img.gif')
plt.show()
if __name__ == '__main__':
cardioid_animate(1)
matplotlib库中的animation
animation.FuncAnimation(figure, update, init_func, frames, fargs, blit)
fig:设置绘制动画的画布
func:设置帧函数,每帧调用该函数
frames:定义动画帧数
init_func:设置初始化函数,用于动画的初始帧
fargs:可选参数,可以是元组或None,是传递给func的每个调用的附加参数
blit:选择更新所有点,还是仅更新产生变化的点。通常为True(而mac用户请选择False,否则无法显)
参考博客:https://blog.csdn.net/miracleoa/article/details/115407901
参考文章:https://vimsky.com/examples/usage/matplotlib-animation-funcanimation-class-in-python.html
2.王者荣耀有5中对应的位置职业:上单、中单、打野、辅助、AD。每种职业的当局评分为0-16分。分别对上述5种不同职业进行10局游戏,随机评分,并记录它们的平均得分。最后绘制这5种职业评分分布的雷达图。
# coding=utf-8
import random
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]="SimHei"
plt.rcParams["axes.unicode_minus"]=False
pi=np.pi
occs=['上单','中单','打野','辅助','AD']
occ=np.concatenate((occs,[occs[0]]))
thetas=[0,0.4,0.8,1.2,1.6]
theta=np.concatenate((thetas,[thetas[0]]))
def game():
res={}
for i in occs:
res[i]=random.randint(0,16)
return res
if __name__=='__main__':
res=[i for i in game().values()]
r=np.concatenate((res,[res[0]]))
print(r)
fig = plt.figure(figsize=(6, 6), dpi=100)
ax=plt.subplot(111, polar=True)
ax.set_theta_zero_location('N') #设置极轴方向
ax.set_thetagrids(theta*180,occ) #设置标签
ax.set_rlabel_position(0.2*180) #设置刻度位置
ax.plot(theta*pi,r,'ro-',lw=2) #填充颜色
ax.fill(theta*pi,r,facecolor='r',alpha=0.2)
ax.set_rlim(0,16) #设置极轴区间
plt.savefig('./_img.png')
plt.show()
numpy库中的concatenate()
用于多拼接个数组
import numpy as np
a=np.array([1,2,3])
b=np.array([4,5,6])
c=np.concatenate((a,b))
#[1,2,3,4,5,6]
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[7,8,9],[10,11,12]])
np.concatenate((a,b),axis=0) #axis=0按列拼接
'''
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
'''
np.concatenate((a,b),axis=1) #axis=0按行拼接
'''
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
'''
参考博客:https://blog.csdn.net/qq_30638831/article/details/79938841