2019-06-12 | UNLOCK

Python院拓第二学期期末结课作业

针对“信息安全”和“软件测试”赛项,
(1)分别用一张大图展示深职院队最近三年参赛排名情况(两个赛项分开可视化);
(2)采用3d技术,展示“软件测试”赛项中三校(深职院、深圳信息职院和番禺职院)最近三年排名对比情况;
(3)采用3d技术,展示“信息安全”赛项中三校(深职院、深圳信息职院和番禺职院)最近三年排名对比情况。
注意:
(1)要求排名靠前显示的柱子或矩形条越高!
(2)代码适当注释。


(1)分别用一张大图展示深职院队最近三年参赛排名情况(两个赛项分开可视化);

深职院队最近三年”信息安全”参赛排名情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook

#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
#打开excel文件并读取
file = '信息安全.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('Sheet1')

x=[]
y=[]
rows = ws.max_row

for i in range(2,rows):
if(ws.cell(i,2).value == "深职院"):
print(ws.cell(i,1).value) #年份
print(ws.cell(i,2).value) #学校
print(ws.cell(i,3).value) #排名
x.append(ws.cell(i,1).value)
y.append(int(ws.cell(i,3).value))


print(y)

plt.bar(x,y)#绘制直方图
#添加数据标签
for a, b in zip(x, y):
plt.text(a, b + 0.25, "%0.f" % b, ha='center', va='bottom', fontsize=10)
plt.xlabel("年份")
plt.ylabel("排名")
plt.xticks(range(2016,2018+1))
plt.title('深职院队最近三年"信息安全"参赛排名情况')
plt.show()

Test01-1运行结果

file-list

深职院队最近三年”软件测试”参赛排名情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook

#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False

#打开excel文件并读取
file = '软件测试.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('Sheet1')

x=[]
y=[]
rows = ws.max_row

for i in range(2,rows):
if(ws.cell(i,2).value == "深职院"):
print(ws.cell(i,1).value) #年份
print(ws.cell(i,2).value) #学校
print(ws.cell(i,3).value) #排名
x.append(ws.cell(i,1).value)
y.append(int(ws.cell(i,3).value))

maxRange = max(y)+1
plt.bar(x,y)#绘制直方图
#添加数据标签
for a, b in zip(x, y):
plt.text(a, b + 0.05, "%.0f" % b, ha='center', va='bottom', fontsize=10)
plt.xlabel("年份")
plt.ylabel("排名")
plt.xticks(range(2016,2018+1))
plt.yticks(range(maxRange)) #设置y轴刻度范围
plt.title('深职院队最近三年"软件测试"参赛排名情况')
plt.show()

Test01-2运行结果

file-list

(2)采用3d技术,展示“软件测试”赛项中三校(深职院、深圳信息职院和番禺职院)最近三年排名对比情况;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib
from openpyxl import load_workbook

from mpl_toolkits.mplot3d import Axes3D
#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.size'] = 10
#读取excel文件
file = '软件测试.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('Sheet1')

#初始化空数组
z=[] # szy排名
z1=[] # sxx排名
z2=[] # pyzy排名
rows = ws.max_row #获取行数

for i in range(2,rows+1):
if (ws.cell(i, 2).value == "深职院"):
z.append(21 - ws.cell(i, 3).value) #获取深职院的排名 然后用21去减掉它,这样才能做到“要求排名靠前显示的柱子或矩形条越高!”
if (ws.cell(i, 2).value == "深信息"):
z1.append(21 -ws.cell(i, 3).value) #同理
if (ws.cell(i, 2).value == "番禺职院"):
z2.append(21 - ws.cell(i, 3).value) #同理

#绘制绘图范围大小
fig = plt.figure(figsize=[10,5])
ax = fig.add_subplot(111, projection='3d') #参考书上的代码

x= np.linspace(0,3,3)
y= np.linspace(1,3,3)

ax.bar(x,z,zs=1,zdir='y',label='深职院',color='yellow',alpha=.8)
ax.bar(x,z1,zs=2,zdir='y',label='深信息',color='blue',alpha=.8)
ax.bar(x,z2,zs=3,zdir='y',label='番禺职院',color='green',alpha=.8)

ax.set_xticks(x)
ax.set_xticklabels(np.array(['2016','2017','2018']))
ax.set_yticks(y)
ax.set_yticklabels(np.array(['深职院','深信息','番禺职院']))
ax.set_zticks(np.arange(0,21,2))
ax.set_zticklabels((np.arange(0,21,2))[::-1])

plt.title("【软件测试】赛项中三校(深职院、深圳信息职院和番禺职院)最近三年排名对比情况")
plt.show()

Test01-3运行结果

file-list

(3)采用3d技术,展示“信息安全”赛项中三校(深职院、深圳信息职院和番禺职院)最近三年排名对比情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib
from openpyxl import load_workbook

#同理制作一份
from mpl_toolkits.mplot3d import Axes3D
#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.size'] = 10
file = '信息安全.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('Sheet1')

z=[] # szy排名
z1=[] # sxx排名
z2=[] # pyzy排名
rows = ws.max_row

for i in range(2,rows+1):
if (ws.cell(i, 2).value == "深职院"):
z.append(21 - ws.cell(i, 3).value)
if (ws.cell(i, 2).value == "深信息"):
z1.append(21 -ws.cell(i, 3).value)
if (ws.cell(i, 2).value == "番禺职院"):
z2.append(21 - ws.cell(i, 3).value)

fig = plt.figure(figsize=[10,5])
ax = fig.add_subplot(111, projection='3d')

x= np.linspace(0,3,3)
y= np.linspace(1,3,3)

ax.bar(x,z,zs=1,zdir='y',label='深职院',color='yellow',alpha=.8)
ax.bar(x,z1,zs=2,zdir='y',label='深信息',color='blue',alpha=.8)
ax.bar(x,z2,zs=3,zdir='y',label='番禺职院',color='green',alpha=.8)

ax.set_xticks(x)
ax.set_xticklabels(np.array(['2016','2017','2018']))
ax.set_yticks(y)
ax.set_yticklabels(np.array(['深职院','深信息','番禺职院']))
ax.set_zticks(np.arange(0,21,2))
ax.set_zticklabels((np.arange(0,21,2))[::-1])

plt.title("【信息安全】赛项中三校(深职院、深圳信息职院和番禺职院)最近三年排名对比情况")
plt.show()

Test01-4运行结果

file-list

根据所下载的数据,以可视化方式展示如下信息:
(1)大图1:2019年五月份成交金额前20名;
(2)大图2:2019年五月份换手率前20名;
(3)大图3:2019年五月份市盈率前20名;
(4)大图4:2019年五月份涨幅前20名;
(5)对于在以上四图中出现两次以上的公司,单独研究,自行下载数据,以可视化的方式展示这些公司近3年净资产收益率的变化情况。


(1)大图1:2019年五月份成交金额前20名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook

#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False

file = '成交金额前20名.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('成交金额前20名')

x1=[]
labels=[]
rows = ws.max_row

for i in range(2,rows):
print(ws.cell(i,3).value) #证券简称
print(ws.cell(i,6).value) #成交金额
x1.append(ws.cell(i,3).value)
labels.append(float(ws.cell(i,6).value))

print(labels)
plt.bar(x1,labels)
for a, b in zip(x1, labels):
plt.text(a, b + 0.05, "%.2e" % b, ha='center', va='bottom', fontsize=7)
plt.xlabel("证券简称")
plt.ylabel("成交金额(元)")
plt.title('成交金额前20名')
plt.show()

Test02-1运行结果

file-list

(2)大图2:2019年五月份换手率前20名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook

#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False

file = '换手率前20名.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('换手率前20名')

x1=[]
labels=[]
rows = ws.max_row

for i in range(2,rows):
print(ws.cell(i,3).value) #证券简称
print(ws.cell(i,8).value) #换手率
x1.append(ws.cell(i,3).value)
labels.append(float(ws.cell(i,8).value))

print(labels)
plt.bar(x1,labels)
for a, b in zip(x1, labels):
plt.text(a, b + 0.05, "%.2f" % b+"%", ha='center', va='bottom', fontsize=7)
plt.xlabel("证券简称")
plt.ylabel("换手率")
plt.title('换手率前20名')
plt.show()

Test02-2运行结果

file-list

(3)大图3:2019年五月份市盈率前20名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook

#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False

file = '市盈率前20名.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('市盈率前20名')

x1=[]
labels=[]
rows = ws.max_row

for i in range(2,rows):
print(ws.cell(i,3).value) #证券简称
print(ws.cell(i,8).value) #市盈率
x1.append(ws.cell(i,3).value)
labels.append(float(ws.cell(i,8).value))

print(labels)
plt.bar(x1,labels)
for a, b in zip(x1, labels):
plt.text(a, b + 0.05, "%.2f" % b, ha='center', va='bottom', fontsize=7)
plt.xlabel("证券简称")
plt.ylabel("市盈率")
plt.title('市盈率前20名')
plt.show()

Test02-3运行结果

file-list

(4)大图4:2019年五月份涨幅前20名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook

#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False

file = '涨幅前20名.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('涨幅前20名')

x1=[]
labels=[]
rows = ws.max_row

for i in range(2,rows):
print(ws.cell(i,3).value) #证券简称
print(ws.cell(i,8).value) #涨幅
x1.append(ws.cell(i,3).value)
labels.append(float(ws.cell(i,8).value))

print(labels)
plt.bar(x1,labels)
for a, b in zip(x1, labels):
plt.text(a, b + 0.05, "%.2f" % b +"%", ha='center', va='bottom', fontsize=7)
plt.xlabel("证券简称")
plt.ylabel("涨幅")
plt.title('涨幅前20名')
plt.show()

Test02-4运行结果

file-list

(5)对于在以上四图中出现两次以上的公司,单独研究,自行下载数据,以可视化的方式展示这些公司近3年净资产收益率的变化情况。

这里的数据主要是用了“新浪财经”网的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook
from matplotlib import pyplot
#指定默认字体
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
#打开excel文件并读取数据
file = '净资产收益率.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('Sheet4')

#初始化空数据
x1=[]
labels=[]
a=[]
b=[]
c=[]
d=[]
e=[]
f=[]
rows = ws.max_row #获取行数

#将数据追加到空数组里
for i in range(2,rows+1):
x1.append(ws.cell(i,1).value)
a.append(ws.cell(i, 2).value)
b.append(ws.cell(i, 3).value)
c.append(ws.cell(i, 4).value)
d.append(ws.cell(i, 5).value)
e.append(ws.cell(i, 6).value)
f.append(ws.cell(i, 7).value)

x= [2018,2017,2016] #定义近三年的范围
plt.plot(x, a, marker='*', ms=10, label='丰乐种业')
plt.plot(x, b, marker='*', ms=10, label='运达股份')
plt.plot(x, c, marker='*', ms=10, label='金力永磁')
plt.plot(x, d, marker='*', ms=10, label='春兴精工')
plt.plot(x, e, marker='*', ms=10, label='二六三')
plt.plot(x, f, marker='*', ms=10, label='吴通控股')

#这里设置一堆数据标签
for a1,b1 in zip(x,a):
plt.text(a1, b1+ 0.05, "%.2f" % b1, ha='center', va='bottom', fontsize=12)

for a1,b1 in zip(x,b):
plt.text(a1, b1+ 0.05, "%.2f" % b1, ha='center', va='bottom', fontsize=12)

for a1,b1 in zip(x,c):
plt.text(a1, b1+ 0.05, "%.2f" % b1, ha='center', va='bottom', fontsize=12)

for a1,b1 in zip(x,d):
plt.text(a1, b1+ 0.05, "%.2f" % b1, ha='center', va='bottom', fontsize=12)

for a1,b1 in zip(x,e):
plt.text(a1, b1+ 0.05, "%.2f" % b1, ha='center', va='bottom', fontsize=12)

for a1,b1 in zip(x,f):
plt.text(a1, b1+ 0.05, "%.2f" % b1, ha='center', va='bottom', fontsize=12)

plt.legend() # 让图例生效
plt.xlabel('年份') # X轴标签
plt.ylabel("净资产收益率") # Y轴标签
pyplot.xticks(x)
plt.title('净资产收益率')
plt.show()

#方法有点笨,但是能做出来,找数据比较难找,找完还得处理数据...o(╥﹏╥)o

Test02-5运行结果

file-list


(3)在项目文件夹中拷入自己喜欢的大图(可以是自己的景区留念照)二十张以上,采用图像处理技术,得到这些大图的缩略图;
在一张大图中,展示所有这些缩略图。


生成一张大图,里面是好多张缩略图组成的

参考 https://www.cnblogs.com/shadrach/p/7453845.html
参考 https://blog.csdn.net/tellsummer/article/details/80815411
参考 https://www.cnblogs.com/kongzhagen/p/6295925.html
参考 https://www.cnblogs.com/lyrichu/p/9124504.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from PIL import Image,ImageDraw
import os, sys
imgCount = 22 #我这里有22张图
for i in range(1,imgCount+1):
im = Image.open ('./lbxx/lbxx ('+str(i)+').jpg')
im.thumbnail((150,150))
im.save('./img/lbxx'+str(i)+'.jpg','JPEG')
# im.show()

# 图片拼接
mw = 250 # 图片大小
toImage = Image.new('RGB', (1250, 1000),'white')#构造图片的宽和高,如果图片不能填充完全会出现黑色区域
count = 1 #计数
for y in range(5):#0-5 五行五列
for x in range(5):#0-5
if (count == imgCount+1):
continue
fname = "./img/lbxx"+str(count)+".jpg"
fromImage = Image.open(fname)
toImage.paste(fromImage, (x * mw, y * mw))
count = count+1
toImage.save('./img/final.jpg')
toImage.show()

参考了上一节课的代码

1
2
3
4
5
6
7
8
9
from PIL import Image,ImageDraw
# 创建一副空图
blank = Image.new('RGB',(1000,800),'white')
# 以空图为基础,创建可操作的一幅图
drawable = ImageDraw.Draw(blank)
drawable.line([100,50,500,250],fill='red',width=2)
drawable.line([500,250,250,500],fill='blue',width=2)
drawable.line([250,500,100,50],fill='green',width=2)
blank.show()

Test02-5运行结果

file-list

完结~!祝大家取得好成绩!