Python练习(七)

目录

绘制TIOBE编程指数曲线

习题


绘制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中的面向对象

 参考文章:https://zhuanlan.zhihu.com/p/30024792

习题

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值