一、sin,cos函数

1.题目要求

编写程序,绘制正弦曲线和余弦曲线。

提示:利用numpy的linspace()、sin()或cos()函数生成样本数据、正弦或余弦值。

2.函数讲解及代码

import matplotlib.pyplot as pltimport numpy as np#linspace函数是用于生成一个等差数列的函数。它的作用是将给定的区间等分成若干份,然后返回这些点的坐标值,从而得到一个等差数列。linspace函数的参数包括起始点、终止点和要生成的点的个数等。#np.linspace(起始值,最终值,取点数)x = np.linspace(-np.pi, np.pi, num=256)#np.pi就表示为Π,创建x数组,去-Π到Π等间隔的256个数(如不定义num,默认值为50)y = np.sin(x)z = np.cos(x)#设置x轴的刻度范围和刻度标签#xlim(left=None,right=None,emit=Ture,auto=Flase,*,xmin=None,xmax=None)#left/right:表示x轴刻度取值区间的左位数/右位数#emit:表示是否通知限制变化的观察者,默认为True#auto:表示是否允许自动缩放x轴,默认值为Tureplt.xlim(x.min()*1.5, x.max()*1.5)#刻画刻度取值范围,最小值前取1.5,最大值后取1.5#xticks(tick=None, lable=None, **kwargs)#ticks:表示刻度显示的位置列表,该参数可以设置为空列表,以此禁用x轴的刻度#labels:表示指定位置刻度的标签列表plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', 0, r'$\pi/2$', r'$\pi$'])#第一个列表表示刻度名称,第二个列表刻画图上刻度位置plt.plot(x, y)plt.plot(x, z)plt.show()

3.运行图样

4.扩展

x = np.linspace(-np.pi, np.pi, num=256)print(x)#加上print看看linspace函数的输出#改变num的数值为1,2,10,50,100plt.xlim(x.min()*1.5, x.max()*1.5)#将代码中此行替换为plt.xlim(x.min(), x.max())plt.xlim(x.min()*2, x.max()*1.5)plt.xlim(x.min()*1, x.max()*1.5)#进行对xlim函数的理解

二、柱状图

1.题目要求

已知实验中学举行了高二期中模拟考试,考试后分别计算了全体男生、女生各科的平均成绩,统计结果如表1所示。

表1全校高二男生、女生的平均成绩

学科

平均成绩(男)

平均成绩(女)

语文

85.5

94

数学

91

82

英语

72

89.5

物理

59

62

化学

66

49

生物

55

53

按照以下要求绘制图表:

(1)绘制柱形图。柱形图的x轴为学科,y轴为平均成绩。

(2)绘制堆积柱形图。堆积柱形图的x轴为学科,y轴为平均成绩。

2.函数讲解及代码

(1)柱形图

import matplotlib.pyplot as pltimport numpy as npplt.rcParams['font.sans-serif'] = [u'SimHei']#避免图例中无法显示中文bar_wight = 0.3x_title = ["语文", "数学", "英语", "物理", "化学", "生物"]y_boy = np.array([85.5, 91, 72, 59, 66, 55])y_girl = np.array([94, 82, 89.5, 62, 49, 53])x_value = np.arange(len(x_title))plt.bar(x_value, y_boy, tick_label=x_title, width=bar_wight, label="男生")plt.bar(x_value+bar_wight, y_girl, width=bar_wight, label="女生")#向每个柱形的顶部添加注释文本,标注平均成绩for a, b, c in zip(x_value, y_boy, y_girl):# zip函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。plt.text(a - bar_wight/2, b, y_boy[a], fontsize=9)plt.text(a + bar_wight/2, c, y_girl[a], fontsize=9)# text(x, y, s, **kwargs)#x,y定位#s要显示的内容plt.xticks(x_value+bar_wight/2, x_title)#将x轴刻度标签放在两组柱形中间plt.axhline(y=(85.5+91+72+59+66+55+94+82+89.5+62+49+53)/12, linestyle='--', label='平均成绩')#在轴上添加一条直线plt.ylabel("平均成绩(分)")plt.title("高二男生、女生的平均成绩")plt.legend()plt.show()

(2)堆积柱形图

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = [u'SimHei']girl = plt.bar([1, 2, 3, 4, 5, 6], [94, 82, 89.5, 62, 49, 53], label="女生")boy = plt.bar([1, 2, 3, 4, 5, 6], [85.5, 91, 72, 59, 66, 55], bottom=[94, 82, 89.5, 62, 49, 53], label="男生")plt.xticks([1, 2, 3, 4, 5, 6], ["语文", "数学", "英语", "物理", "化学", "生物"])plt.xlabel("学科")plt.ylabel("平均成绩")plt.legend()plt.show()

3.运行图样

(1)柱状图

(2)堆积柱状图

三、饼状图

1.题目要求

拼多多作为互联网电商的一匹黑马,短短几年用户的规模已经超过3亿。2019年9月拼多多平台对所有子类目的销售额进行了统计,结果如表2所示。

表2 拼多多平台子类目的销售额

子类目

销售额(亿)

童装

29665

奶粉辅食

3135.4

孕妈专区

4292.4

洗护喂养

5240.9

宝宝尿裤

5543.4

春夏新品

5633.8

童车童床

6414.5

玩具文娱

9308.1

童鞋

10353

根据表2的数据绘制一个反映拼多多平台子类目销售额占比情况的饼图。

2.函数讲解及代码

import matplotlib.pyplot as pltimport numpy as npplt.rcParams["font.sans-serif"] = [u'SimHei']y = np.array([29665, 3135.4, 4292.4, 5240.9, 5543.4, 5633.8, 6414.5, 9308.1, 10353])title = np.array(["童装", "奶粉辅食", "孕妈专区", "洗护喂养", "宝宝尿裤", "春夏新品", "童车童床", "玩具文娱", "童鞋"])plt.figure(dpi=100, figsize=(10, 8))plt.pie(y, autopct='%.2f%%')plt.legend(title, loc='upper right', ncol=5)plt.table(cellText=[y],colWidths=[0.1] * 9,rowLabels=['单位:亿元'],colLabels=title,loc='lower center')plt.title("拼多多平台子类目的销售额")plt.show()

3.运行图样

四、折线图

1.题目要求

下表为郑州近一个月天气,根据要求绘制图形。

城市

日期

白天

夜间

天气状况

风力方向

最高温度

天气状况

风力方向

最低温度

郑州

2022-04-07

南风 1-2级

25℃

南风 1-2级

13℃

郑州

2022-04-06

东北风 3-4级

23℃

东北风 3-4级

10℃

郑州

2022-04-05

西北风 1-2级

29℃

西北风 1-2级

12℃

郑州

2022-04-04

多云

南风 3-4级

24℃

多云

南风 3-4级

14℃

郑州

2022-04-03(星期日)

南风 3-4级

22℃

多云

南风 3-4级

9℃

郑州

2022-04-02(星期六)

北风 3-4级

19℃

北风 3-4级

5℃

郑州

2022-04-01

多云

南风 3-4级

18℃

南风 3-4级

7℃

郑州

2022-03-31

东北风 1-2级

15℃

多云

东北风 1-2级

6℃

郑州

2022-03-30

东北风 3-4级

19℃

东北风 3-4级

9℃

郑州

2022-03-29

多云

南风 3-4级

22℃

南风 3-4级

10℃

郑州

2022-03-28

多云

南风 3-4级

18℃

多云

南风 3-4级

9℃

郑州

2022-03-27(星期日)

多云

东北风 1-2级

15℃

多云

东北风 1-2级

6℃

郑州

2022-03-26(星期六)

多云

西风 3-4级

20℃

多云

西风 3-4级

8℃

郑州

2022-03-25

小雨

北风 1-2级

13℃

北风 1-2级

8℃

郑州

2022-03-24

多云

南风 1-2级

19℃

小雨

南风 1-2级

9℃

郑州

2022-03-23

南风 3-4级

19℃

南风 3-4级

6℃

郑州

2022-03-22

西南风 3-4级

12℃

西南风 3-4级

3℃

郑州

2022-03-21

小雨

东北风 1-2级

8℃

东北风 1-2级

3℃

郑州

2022-03-20(星期日)

东南风 1-2级

10℃

东南风 1-2级

5℃

郑州

2022-03-19(星期六)

东北风 1-2级

7℃

东北风 1-2级

3℃

郑州

2022-03-18

多云

南风 3-4级

13℃

多云

南风 3-4级

3℃

郑州

2022-03-17

东北风 3-4级

9℃

东北风 3-4级

3℃

郑州

2022-03-16

小雨

东北风 4-5级

16℃

小雨

东北风 4-5级

3℃

郑州

2022-03-15

多云

西北风 1-2级

24℃

西北风 1-2级

12℃

郑州

2022-03-14

多云

西北风 3-4级

23℃

多云

西北风 3-4级

11℃

郑州

2022-03-13(星期日)

多云

东风 3-4级

22℃

小雨

东风 3-4级

9℃

郑州

2022-03-12(星期六)

小雨

东风 1-2级

20℃

多云

东风 1-2级

9℃

郑州

2022-03-11

东风 3-4级

25℃

东风 3-4级

12℃

郑州

2022-03-10

多云

南风 1-2级

24℃

南风 1-2级

10℃

郑州

2022-03-09

多云

东南风 3-4级

22℃

多云

东南风 3-4级

10℃

使用折线图绘制三十天的最高温度和最低温度变化图,纵坐标为温度,横坐标为日期。

2.函数讲解及代码

import matplotlib.pyplot as pltimport numpy as npplt.rcParams["font.sans-serif"] = [u'SimHei']plt.rcParams['axes.unicode_minus'] = Falsefig = plt.figure(figsize=(15, 10), dpi=90)x_data = np.array(["03-09", "03-10", "03-11", "03-12", "03-13", "03-14", "03-15", "03-16", "03-17", "03-18", "03-19", "03-20", "03-21", "03-22", "03-23", "03-24", "03-25", "03-26", "03-27", "03-28", "03-29", "03-30", "03-31", "04-01", "04-02", "04-03", "04-04", "04-05", "04-06", "04-07"])max = np.array([22, 24, 25, 20, 22, 23, 24, 16, 9, 13, 7, 10, 8, 12, 19, 19, 13, 20, 15, 18, 22, 19, 15, 18, 19, 22, 24, 29, 23, 25])min = np.array([10, 10, 12, 9, 9, 11, 12, 3, 3, 3, 3, 5, 3, 3, 6, 9, 8, 8, 6, 9, 10, 9, 6, 7, 5, 9, 14, 12, 10, 13])plt.ylim(-5, 40)plt.grid(axis='y')plt.annotate("最高温", xy=("03-20", 10), xytext=("03-20", 15), arrowprops=dict(arrowstyle="->"))plt.plot(x_data, max, marker=".", label='一天之内的最高温')plt.plot(x_data, min, marker=".", label='一天之内的最低温')plt.xlabel("日期")plt.ylabel("温度/℃")plt.legend()plt.show()

3.运行图样

五、自定义布局构建子图

1.题目要求

按照自定义的布局结构绘制子图,具体如图1:

图1 自定义的布局结构

2.函数讲解及代码

import matplotlib.pyplot as pltfig = plt.figure()ax1 = plt.subplot2grid((3, 4), (0, 0), colspan=4)ax2 = plt.subplot2grid((3, 4), (1, 0), colspan=2)ax3 = plt.subplot2grid((3, 4), (1, 2), colspan=2)ax4 = plt.subplot2grid((3, 4), (2, 0), colspan=1)ax5 = plt.subplot2grid((3, 4), (2, 1), colspan=3)fig.tight_layout()plt.show()

3.运行图样

六、绘制动态图

1.题目要求

绘制一个具有动画效果的图表,具体要求如下:

1>绘制一条正弦曲线;

2>绘制一个红色圆点,该圆点最初位于正弦曲线的左端;

3>制作一个圆点沿曲线运动的动画,并时刻显示圆点的坐标位置。

2.函数讲解及代码

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animation# 指定渲染环境# %matplotlib notebook # Warning: Cannot change to a different GUI toolkit: notebook. Using qt5 instead.# %matplotlib inline# 添加动画点def update(num):# if num%5==0:# point_ani.set_marker("*")# point_ani.set_markersize(12)# else:# point_ani.set_marker("o")# point_ani.set_markersize(8)point_ani.set_data(x[num], y[num])text_pt.set_text("x=%.3f, y=%.3f" % (x[num], y[num]))# 设置文本字符串 s。它可能包含换行符 () 或 LaTeX 语法中的数学运算return point_ani, text_pt,x = np.linspace(0, 2 * np.pi, 100)y = np.sin(x)fig = plt.figure(tight_layout=True)plt.plot(x, y)point_ani, = plt.plot(x[0], y[0], 'ro')plt.grid(ls="--")text_pt = plt.text(4, 0.8, '', fontsize=16)# 点的位置以文本形式输出ani = animation.FuncAnimation(fig, update, np.arange(0, 100), interval=100, blit=False)# ani.save('sin_test3.gif', writer='imagemagick', fps=10)plt.show()

3.运行图样(部分)