编写程序,绘制正弦曲线和余弦曲线。
提示:利用numpy的linspace()、sin()或cos()函数生成样本数据、正弦或余弦值。
import matplotlib.pyplot as plt
import 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轴,默认值为Ture
plt.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()
x = np.linspace(-np.pi, np.pi, num=256)
print(x)
#加上print看看linspace函数的输出
#改变num的数值为1,2,10,50,100
plt.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 全校高二男生、女生的平均成绩
学科 |
平均成绩(男) |
平均成绩(女) |
语文 |
85.5 |
94 |
数学 |
91 |
82 |
英语 |
72 |
89.5 |
物理 |
59 |
62 |
化学 |
66 |
49 |
生物 |
55 |
53 |
按照以下要求绘制图表:
(1)绘制柱形图。柱形图的x轴为学科,y轴为平均成绩。
(2)绘制堆积柱形图。堆积柱形图的x轴为学科,y轴为平均成绩。
(1)柱形图
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = [u'SimHei']
#避免图例中无法显示中文
bar_wight = 0.3
x_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 plt
plt.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()
(1)柱状图
(2)堆积柱状图
拼多多作为互联网电商的一匹黑马,短短几年用户的规模已经超过3亿。2019年9月拼多多平台对所有子类目的销售额进行了统计,结果如表2所示。
表2 拼多多平台子类目的销售额
子类目 |
销售额(亿) |
童装 |
29665 |
奶粉辅食 |
3135.4 |
孕妈专区 |
4292.4 |
洗护喂养 |
5240.9 |
宝宝尿裤 |
5543.4 |
春夏新品 |
5633.8 |
童车童床 |
6414.5 |
玩具文娱 |
9308.1 |
童鞋 |
10353 |
根据表2的数据绘制一个反映拼多多平台子类目销售额占比情况的饼图。
import matplotlib.pyplot as plt
import numpy as np
plt.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()
下表为郑州近一个月天气,根据要求绘制图形。
城市 |
日期 |
白天 |
夜间 |
||||
天气状况 |
风力方向 |
最高温度 |
天气状况 |
风力方向 |
最低温度 |
||
郑州 |
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℃ |
使用折线图绘制三十天的最高温度和最低温度变化图,纵坐标为温度,横坐标为日期。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = 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()
按照自定义的布局结构绘制子图,具体如图1:
图1 自定义的布局结构
import matplotlib.pyplot as plt
fig = 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()
绘制一个具有动画效果的图表,具体要求如下:
1>绘制一条正弦曲线;
2>绘制一个红色圆点,该圆点最初位于正弦曲线的左端;
3>制作一个圆点沿曲线运动的动画,并时刻显示圆点的坐标位置。
import numpy as np
import matplotlib.pyplot as plt
import 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()