画图题目题解
饼状图的绘制
# encoding: utf-8
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
import numpy as np
import matplotlib.pyplot as plt
d={'美国':1368036,'英国':223060,'俄罗斯':221344,'法国':176970,'巴西':163510,'意大利':219070,'德国':171999,'西班牙':268143,'土耳其':138657,'伊朗':109286,'其他':1071569}
d=dict(sorted(d.items(),key=lambda x: x[1],reverse=True))
plt.pie(d.values(),labels=d.keys(),labeldistance=1.1,explode=(0.1,0,0,0,0,0,0,0,0,0,0),counterclock=False,startangle=90,rotatelabels=True)
plt.show()
这道题的代码比较简单,核心语句只有两句:字典的排序以及饼状图的绘制.排序部分可以参考字典那一章的资料,这里着重讲一下饼状图绘制的各个参数.
pie里必须包含的两个参数是数据和标签,要求必须是list格式,分别对应括号中的前两项.后面labeldistance控制的是标签和饼状图之间的距离,explode用于控制各个模块的突出程度,也必须是list格式.counterclock用于控制是顺时针排列还是逆时针排列.startangle控制从哪个角度开始绘制.rotatelabels控制标签是否随饼状图倾斜,True表示倾斜,False表示水平显示.大家可以自行修改一下上面的参数,观察一下效果.
会员们的伤害变化
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
x=[1,2,3,4,5]
A=[1127968,1193973,1330385,1211292,1365868]
B=[950600,967387,1102495,992571,1132938]
C=[797236,872468,922418,896010,950669]
D=[405868,540142,682967,774129,789672]
plt.plot(x,A,'--*',linewidth=2,color=(1,0,0),label='会员A')
plt.plot(x,B,'--*',linewidth=2,color=(0,1,0),label='会员B')
plt.plot(x,C,'--*',linewidth=2,color=(0,0,1),label='会员C')
plt.plot(x,D,'--*',linewidth=2,color=(0,0,0),label='会员D')
plt.xlabel('天数')
plt.ylabel('伤害')
plt.title('会员们的伤害变化')
plt.legend()
plt.show()
这道题主要的难点在于按照题目要求的格式进行显示.看上去是画四条线,其实只有一条,数据也不需要处理.
核心代码如下:
plt.plot(x,A,'--*',linewidth=2,color=(1,0,0),label='会员A')
前两个参数控制横坐标的值以及纵坐标的值,linewidth控制折现的粗细,color控制颜色.可以给color传不同形式的参,比如color='r'表示红色,或者传一个三元组,代表RGB格式,上面的(1,0,0)也代表红色.label是折线旁边的标签.
成绩统计
# encoding: utf-8
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 中文设置
import numpy as np
import matplotlib.pyplot as plt
import pylab as pl
import matplotlib as mpl
File=open("data.txt")
s=[0 for i in range(11)]
for i in range(466):
x=float(File.readline())
y=int(x/10+0.0005)
s[y]+=1
ind=np.arange(0,11,1)
width=0.5
flg,ax=plt.subplots()
r=ax.bar(ind,s,width,color='IndianRed')
ax.set_xlabel("分数段") #x轴标题
ax.set_ylabel("人数") #y轴标题
ax.set_xticks(ind)
ax.set_xticklabels(('[0,10)','[10,20)','[20,30)','[30,40)','[40,50)','[50,60)','[60,70)','[70,80)','[80,90)','[90,100)','100'))
#刻度设置
for i in range(11):
plt.text(i,s[i],'%d'%s[i], ha='center',va='bottom',fontsize=14)
# 显示数字
plt.show()
这道题多了一个数据处理部分,单独拿出来看一下:
File=open("data.txt") #打开指定的文件
s=[0 for i in range(11)] #准备统计各个分数段的人数
for i in range(466):
x=float(File.readline())#文件输入
y=int(x/10+0.0005) #分析该成绩对应的是哪个分数段
s[y]+=1 #更新人数
int(x/10)其实就可以直接得到x对应的分数段(下标从0开始),后面补了一个0.0005是为了防止浮点数运算产生误差,不补的话统计结果也是完全一样的.
后面是一个常规的柱状图绘制过程,通过set_xticklabels来设置x轴的刻度,然后使用text函数在每一根柱子上标上对应的数字.text函数中,前两个参数控制文字的横纵坐标,第三个参数控制文字内容,和print里面的参数类似;ha控制文字居中,va控制文字显示靠近地步,最后一个参数fontsize控制字号.
一些问题的解答
中文显示
Windows 10系统下,Spyder和VSCode环境,一般来说使用
# encoding: utf-8
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
就可以显示中文了.Mac系统稍微特殊一些,要换成下面的语句:
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
Linux系统的话,因为发行版比较多,请自行解决(都会装Linux了,查一下怎么显示中文肯定不在话下)
如果还是无法显示中文,可以考虑换个编辑器再试一下.还是不行的话请联系助教解决.
文件读取
在Windows 10下,Spyder或者是VSCode编辑器,使用
f=open('data.txt','r')
就可以直接打开文件.当然这需要提前把文档放在和代码相同的目录下.如果还是提示找不到文件,可以换成下面的形式:
f=open('.\data.txt','r')
要是还是不行,或者是Mac环境,就在文件名前面直接写绝对路径.
使用Linux系统的同学请自行解决问题,原因同上.
如何学习画图,科学计算以及GUI页面
我个人感觉这几个部分内容的定位是了解即可,也就是知道他们要用到哪些库,经常使用的函数是什么,如何传参,这就可以了.不一定非要记住每一个函数的具体用法.因为有些函数的完整参数甚至多达十几个,每个参数又要求不同的格式,全部记住是一件极其不现实的事情.正确的做法是,把每个类型的代码都保存下来(比如存下来几个画柱状图,折线图,饼图的代码),代码不用特别复杂,只要包括了最常用的几个函数就行.然后在需要的时候,粘贴出来,再根据具体需求改动就行了.
有时候题目中会涉及到一些PPT里没有讲过的参数,这时候只要去网上查"Python xxx函数用法",就可以得到某个函数的所有参数以及用法示例,根据需求进行选择就可以了.在学习后面这些内容的时候,查资料是一件非常正常的事情.要查的东西也并不复杂,合理运用搜索引擎基本上可以解决课内可能遇到的所有问题.
本文地址: Python第九周周报