基于python的matplotlib、numpy库实现的图形绘制(数据可视化)

一、sin,cos函数

1.题目要求

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

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

2.函数讲解及代码

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()

 3.运行图样

4.扩展

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所示。

表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 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()

 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 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()

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 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()

3.运行图样

 

五、自定义布局构建子图

 1.题目要求

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

图1 自定义的布局结构 

2.函数讲解及代码

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()

3.运行图样

 六、绘制动态图

1.题目要求

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

1>绘制一条正弦曲线;

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

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

2. 函数讲解及代码

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()

3.运行图样(部分)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年10月18日
下一篇 2023年10月18日

相关推荐