7. Python 画图#
本章将展示如何用 Python 的 matplotlib 工具包生成各种各样的图形,并简单介绍另外一个画图工具包 seaborn 如何生成更加美观与复杂的图形。
7.1. 初识 matplotlib 与 plot
#
使用 matplotlib 包画图时,我们一般加载里面的 pyplot 函数,并命名为 plt,然后使用plot
函数画图。
# 导入 matplotlib 中的 plot, 并命名为常用名 plt
import matplotlib.pyplot as plt
例如,下面的代码画出正弦函数 \(y=sin(x)\) 的图形。
# 导入工具包
import matplotlib.pyplot as plt
import numpy as np
# plt.style.use('default')
# 生成数据
x = np.arange(0, 15, 0.1) # 横坐标数据为从0到10之间,步长为0.1的等差数组
y = np.sin(x) # 纵坐标数据为 x 对应的 sin(x) 值
# 将横坐标数据,纵坐标数据放入 plot 函数中,生成图形
plt.plot(x, y)
plt.text(4, 0.5, "y=sin(x)") # 在指定坐标位置显示文字
# 显示图形
plt.show()

plot
函数的基本用法如下:
plot([x], y, [fmt], **kwargs) | |
---|---|
[x] | 可选参数,横坐标数据 |
y | 纵坐标数据 |
[fmt] | 可选参数,定义图形的基本样式:颜色,点形,线形 |
**kwargs | 可选参数,定义图形的线条粗细,标签等 |
[fmt] 的常用代码(包括颜色代码、点形代码、线形代码),由下标所示。
颜色代码 |
效果 |
线形代码 |
效果 |
点形代码 |
效果 |
---|---|---|---|---|---|
b |
蓝色 |
- |
实线 |
o |
实心圆形 |
r |
红色 |
– |
虚线 |
. |
点形 |
g |
绿色 |
-. |
折线 |
+ |
十字形 |
k |
黑色 |
: |
点线 |
* |
星号 |
w |
白色 |
+ |
加号 |
||
y |
黄色 |
x |
叉号 |
||
c |
青色 |
||||
m |
洋红色 |
tip
plot 函数实质上将不同坐标的点连线在一起,生成图像。因此,若仅提供两个横坐标与两个纵坐标,则生成一个线段。
下面一些 plot 函数的代码展示了 [x],[fmt],**Kwargs 的一些可选用法。
plt.plot(y) # 据纵坐标数据 y 画图,横坐标数据默认为从 0 到 N-1,步长为 1 的等差数组
[<matplotlib.lines.Line2D at 0x10fa4a7b0>]

plt.plot(x, y, "b ") # 颜色为蓝色('b')、点形为圆('o')
[<matplotlib.lines.Line2D at 0x10fa0ae40>]

plt.plot(y, "g-.") # 颜色为绿色('g'),线形为折线('-.')
[<matplotlib.lines.Line2D at 0x10fb2a030>]

plt.plot(
x, y, "yo:", label="y=sin(x)", lw=2
) # 颜色为黄色('y'),点形为圆形('o'),线形为虚线(':'),lable 内容为 'y=sin(x)', 线条宽度为 2
[<matplotlib.lines.Line2D at 0x10fbb1040>]

如果我们想自定义坐标轴的标题,坐标轴的刻度,坐标轴刻度的范围,设置图形标题,添加图例时,可以通过设置 pyplot 函数中的 xlable(横坐标轴标题), ylabel(纵坐标轴标题), xticks(横坐标轴刻度),yticks(纵坐标轴刻度),title(图形标题), grid(显示网格),legend(显示图例)等属性来实现。若调整图像的清晰度,可以用plt.rcParams["figure.dpi"]
来调整图像的 dpi 值来实现,调整图像的大小可以通过 plt.rcParams('figsize')
来设置图像的长宽。
# 导入工具包
import matplotlib.pyplot as plt
import numpy as np
# 下面几行代码使得 pyplot 画出的图形中可以显示中文
# mac 系统下字体: 黑体 'Heiti TC',宋体:'Songti SC'; win 系统下黑体: 'SimHei'
# binder 下字体:'Noto Sans CJK JP'
import platform
os_name = platform.system()
if os_name == "Windows":
font = "SimHei"
elif os_name == "Darwin":
font = "Heiti TC"
else:
font = "Noto Sans CJK JP"
plt.rcParams["font.sans-serif"] = [font]
# 这行代码能够正确显示中文时坐标轴上的负刻度
plt.rcParams["axes.unicode_minus"] = False
# 生成数据
x = np.arange(0, 15, 0.5)
y1 = np.sin(x)
y2 = np.cos(x)
# figure size or dpi settings
plt.figure(figsize=(4, 3)) # 或者plt.rcParams('figsize') = [4, 3]
plt.rcParams["figure.dpi"] = 100 # 调整图像清晰度,默认为100
# 生成图形
plt.plot(x, y1, "go-.", label="y=sin(x)", linewidth=2) # 颜色绿色,点形圆形,线性虚线,设置图例显示内容,线条宽度为2
plt.plot(x, y2, "r*--", label="y=cos(x)", linewidth=2) # 颜色绿色,点形圆形,线性虚线,设置图例显示内容,线条宽度为2
plt.ylabel("y") # 横坐标轴的标题
plt.xlabel("x") # 纵坐标轴的标题
plt.xticks(np.arange(0, 16, 1)) # 设置横坐标轴的刻度为 0 到 10 的数组
plt.ylim([-2, 2]) # 设置纵坐标轴范围为 -2 到 2
plt.legend() # 显示图例, 图例中内容由 label 定义
plt.grid() # 显示网格
plt.text(5, 1.5, "数学图形") # 在指定坐标位置显示文字
plt.title("我的第一个 Python 图形") # 图形的标题
# 显示图形
plt.show()

可以看出,Python 画图关键是定义图像的坐标(横坐标、纵坐标),然后用一些参数进一步设置图像的细节
7.2. 散点图,条形图,直方图#
7.2.1. scatter
函数#
做散点图要用到 pyplot 中的scatter
函数,该函数的基本语法如下:
scatter(x, y, s=None, c=None, **kwargs) | |
---|---|
x | 横坐标数据 |
y | 纵坐标数据 |
[s] | 可选参数,一个数或一个数组,设置每个散点的大小 |
[c] | 可选参数,一个数或一个数组,设置每个散点的颜色 |
**kwargs | 可选参数,定义其他属性,例如图形透明度 alpha |
# 导入工具包
import matplotlib.pyplot as plt
import numpy as np
# 下面几行代码使得 pyplot 画出的图形中可以显示中文
# mac 系统下字体: 黑体 'Heiti TC',宋体:'Songti SC'; win 系统下黑体: 'SimHei'
# binder 下字体:'Noto Sans CJK JP'
import platform
os_name = platform.system()
if os_name == "Windows":
font = "SimHei"
elif os_name == "Darwin":
font = "Heiti TC"
else:
font = "Noto Sans CJK JP"
plt.rcParams["font.sans-serif"] = [font]
# 输入产量与温度数据
production = [1125, 1725, 2250, 2875, 2900, 3750, 4125]
temp = [6, 8, 10, 13, 14, 16, 21]
plt.scatter(temp, production, s=200, c="g") # 画散点图,大小为 200
plt.xlabel("温度") # 横坐标轴标题
plt.ylabel("产量") # 纵坐标轴标题
plt.show()

7.2.2. bar
, barh
函数#
条形图(bar chart),也称为柱状图,要用到 pyplot 中的bar
函数生成,该函数的基本语法为:
bar(x, height, width=None, **kwargs) | |
---|---|
x | 横坐标数据 |
height | 一个数或一个数组,条形的高度 |
width | 可选参数,一个数或一个数组,条形的宽度 |
**kwargs | 可选参数,定义其他属性,例如颜色,透明度等 |
假设某项针对男女大学生购买饮用水爱好的调查结果如下表:
选择 |
男 |
女 |
---|---|---|
碳酸饮料 |
6 |
9 |
绿茶 |
7 |
4 |
矿泉水 |
6 |
4 |
果汁 |
1 |
5 |
其他 |
2 |
6 |
总计 |
22 |
28 |
# 导入工具包
import matplotlib.pyplot as plt
import numpy as np
# 下面几行代码使得 pyplot 画出的图形中可以显示中文
# mac 系统下字体: 黑体 'Heiti TC',宋体:'Songti SC'; win 系统下黑体: 'SimHei'
# binder 下字体:'Noto Sans CJK JP'
import platform
os_name = platform.system()
if os_name == "Windows":
font = "SimHei"
elif os_name == "Darwin":
font = "Heiti TC"
else:
font = "Noto Sans CJK JP"
plt.rcParams["font.sans-serif"] = [font]
waters = ("碳酸饮料", "绿茶", "矿泉水", "果汁", "其他")
buy_number = [6, 7, 6, 1, 2]
plt.bar(waters, buy_number)
plt.title("男性购买饮用水情况的调查结果")
plt.show()

横放条形图使用barh
函数,用法与bar
基本一致。
waters = ("碳酸饮料", "绿茶", "矿泉水", "果汁", "其他")
buy_number = [6, 7, 6, 1, 2]
plt.barh(waters, buy_number)
plt.title("男性购买饮用水情况的调查结果")
plt.show()

若要将男生与女生的调查情况画出两个条形图一块显示,则可以使用bar
或barh
函数两次,并调整bar
或barh
函数的条形图位置坐标以及相应刻度,使得两组条形图能够并排显示。
# 导入工具包
import matplotlib.pyplot as plt
import numpy as np
# 下面几行代码使得 pyplot 画出的图形中可以显示中文
# mac 系统下字体: 黑体 'Heiti TC',宋体:'Songti SC'; win 系统下黑体: 'SimHei'
# binder 下字体:'Noto Sans CJK JP'
import platform
os_name = platform.system()
if os_name == "Windows":
font = "SimHei"
elif os_name == "Darwin":
font = "Heiti TC"
else:
font = "Noto Sans CJK JP"
plt.rcParams["font.sans-serif"] = [font]
# 输入统计数据
waters = ("碳酸饮料", "绿茶", "矿泉水", "果汁", "其他")
buy_number_male = [6, 7, 6, 1, 2]
buy_number_female = [9, 4, 4, 5, 6]
bar_width = 0.3 # 条形宽度
index_male = np.arange(len(waters)) # 男生条形图的横坐标
index_female = index_male + bar_width # 女生条形图的横坐标
# 使用两次 bar 函数画出两组条形图
plt.bar(index_male, height=buy_number_male, width=bar_width, color="b", label="男性")
plt.bar(index_female, height=buy_number_female, width=bar_width, color="g", label="女性")
plt.legend() # 显示图例
plt.xticks(
index_male + bar_width / 2, waters
) # 让横坐标轴刻度显示 waters 里的饮用水, index_male + bar_width/2 为横坐标轴刻度的位置
plt.ylabel("购买量") # 纵坐标轴标题
plt.title("购买饮用水情况的调查结果") # 图形标题
plt.show()

7.2.3. hist
函数#
直方图(histogram)虽然在样式上类似条形图,但它们的作用不一样。直方图用不同的矩形表示频数,常用来观察一组数据的概率分布。在直角坐标中,用横轴表示数据分组,纵轴表示频数或频率,各组与相应的频数就形成了一个个矩形,即直方图。画直方图用到 pyplot 中的hist
函数,它的基本语法为:
hist(x, bins=None, **kwargs) | |
---|---|
x | 输入数据 |
bins | 可选参数,条柱个数,若不指定则自动计算一个数 |
**kwargs | 可选参数,定义其他属性,例如颜色,透明度等 |
下面的代码根据一组数据生成直方图:
import matplotlib.pyplot as plt
x = [141, 159, 166, 172, 177, 182, 188, 196, 203, 214, 143, 160, 167, 173, 177, 183, 189, 196, 203, 215, 144, 160, 168,
173,
178, 184, 189, 196, 205, 218, 152, 162, 170, 174, 179, 186, 190, 197, 208, 226, 158, 165, 172, 176, 182, 188, 195,
202, 213, 237,
]
plt.hist(x, color="r", edgecolor="k",
alpha=0.35) # 设置直方图填充颜色为红,边线颜色为黑色,不透明度为 0.35
plt.show()

7.3. 饼图,箱线图#
7.3.1. pie
函数#
饼图(pie char)是一个划分为几个扇形的圆形统计图表,一般用于描述频率或百分比之间的相对关系。在饼图中,每个扇区的弧长(以及圆心角和面积)的大小与其所表示的数量呈固定比例。画饼图使用 pyplot 中的pie
函数,它的基本语法如下:
pie(x, expode=None, labels=None, autopic=None, **kwargs) | |
---|---|
x | 数组,每个扇区的比例 |
expode | 可选参数,数组,每个扇区突出的大小 |
labels | 可选参数,字符串数组,每个扇区的标签 |
autopct | 可选参数,字符串或函数,每个扇区显示的数字样式 |
**kwargs | 可选参数,定义其他属性,例如扇区阴影 shadow,起始角度 startangle 等 |
# 导入工具包
import matplotlib.pyplot as plt
# 下面几行代码使得 pyplot 画出的图形中可以显示中文
# mac 系统下字体: 黑体 'Heiti TC',宋体:'Songti SC'; win 系统下黑体: 'SimHei'
# binder 下字体:'Noto Sans CJK JP'
import platform
os_name = platform.system()
if os_name == "Windows":
font = "SimHei"
elif os_name == "Darwin":
font = "Heiti TC"
else:
font = "Noto Sans CJK JP"
plt.rcParams["font.sans-serif"] = [font]
labels = ["果汁", "矿泉水", "绿茶", "其他", "碳酸饮料"]
x = [6, 10, 11, 8, 15]
explode = [0, 0.1, 0, 0, 0] # 突出显示第二个扇区
plt.pie(x, explode=explode, labels=labels, autopct="%.2f%%", shadow=True, startangle=90)
plt.legend() # 显示标签
plt.show()

7.3.2. boxplot
函数#
箱线图(box plot)是一种用来显示数据统计分布情况的图形,包括数据的最大值、最小值、中位数、分位数等特征。画箱线图使用 pyplot 中的boxplot
函数,它的基本语法如下:
boxplot(x, notch=false, vert=false, **kwargs) | |
---|---|
x | 输入数据 |
notch | 可选参数,是否为锯齿状的箱线图 |
vert | 箱线图是否为竖直,否则为水平 |
**kwargs | 可选参数,定义其他属性 |
假设有下面的学生成绩单:
课程 |
学生A |
学生B |
学生C |
学生D |
学生E |
学生F |
学生G |
学生H |
学生I |
学生J |
学生K |
---|---|---|---|---|---|---|---|---|---|---|---|
英语 |
76 |
90 |
97 |
71 |
70 |
93 |
86 |
83 |
78 |
85 |
81 |
西方经济学 |
93 |
81 |
76 |
88 |
66 |
79 |
83 |
92 |
78 |
86 |
78 |
市场营销学 |
74 |
87 |
85 |
69 |
90 |
80 |
77 |
84 |
91 |
74 |
70 |
财务管理 |
68 |
75 |
70 |
84 |
73 |
60 |
76 |
81 |
88 |
68 |
75 |
统计学 |
55 |
91 |
68 |
73 |
84 |
81 |
70 |
69 |
94 |
62 |
71 |
画出它们的箱线图如下:
# 导入工具包
import matplotlib.pyplot as plt
import numpy as np
# 下面几行代码使得 pyplot 画出的图形中可以显示中文
# mac 系统下字体: 黑体 'Heiti TC',宋体:'Songti SC'; win 系统下黑体: 'SimHei'
# binder 下字体:'Noto Sans CJK JP'
import platform
os_name = platform.system()
if os_name == "Windows":
font = "SimHei"
elif os_name == "Darwin":
font = "Heiti TC"
else:
font = "Noto Sans CJK JP"
plt.rcParams["font.sans-serif"] = [font]
scores = [
[76, 90, 97, 71, 70, 93, 86, 83, 78, 85, 81],
[93, 81, 76, 88, 66, 79, 83, 92, 78, 86, 78],
[74, 87, 85, 69, 90, 80, 77, 84, 91, 74, 70],
[68, 75, 70, 84, 73, 60, 76, 81, 88, 68, 75],
[70, 73, 92, 65, 78, 87, 90, 70, 66, 79, 68],
[55, 91, 68, 73, 84, 81, 70, 69, 94, 62, 71],
]
courses = ("英语", "西方经济学", "市场营销学", "财务管理", "基础会计学", "统计学")
plt.boxplot(scores, vert=False)
plt.yticks(np.arange(1, 7), courses) # 更改横坐标刻度为课程名字
plt.show()

7.4. 子图函数 subplot#
若要 pyplot 一次生成多个图形,一般要用到subplot
函数,它的基本语法如下:
ax = plt.subplot(nrows=1, ncols=1, index=1, **kwargs) | |
---|---|
nrows | 子图的行数 |
ncols | 子图的列数 |
index | 子图的位置索引,从左上到右下查起,起始值为1 |
**kwargs | 其他参数,例如指定坐标轴范围等 |
ax | 子图对象的变量名,用于调整参数 |
下面举例说明如何生成 3 个子图,并且其中一个子图横跨 2 列。
# 导入工具包
import matplotlib.pyplot as plt
import numpy as np
# 下面几行代码使得 pyplot 画出的图形中可以显示中文
# mac 系统下字体: 黑体 'Heiti TC',宋体:'Songti SC'; win 系统下黑体: 'SimHei'
# binder 下字体:'Noto Sans CJK JP'
import platform
os_name = platform.system()
if os_name == "Windows":
font = "SimHei"
elif os_name == "Darwin":
font = "Heiti TC"
else:
font = "Noto Sans CJK JP"
plt.rcParams["font.sans-serif"] = [font]
# 第一个图形
x = np.arange(0, 10, 0.5)
y = np.sin(x)
ax1 = plt.subplot(2, 1, 1) # 将画布分为2行1列,该子图位于第1个位置
ax1.plot(x, y, "go-.")
ax1.grid()
ax1.set_title("sin(x)") # 设置子图标题
# 第二个图形
production = [1125, 1725, 2250, 2875, 2900, 3750, 4125]
temp = [6, 8, 10, 13, 14, 16, 21]
ax2 = plt.subplot(2, 2, 3) # 将画布分为2行1列,该子图位于第3个位置
ax2.scatter(temp, production, s=200, c="g") # 散点图
# 第三个图形
labels = ["果汁", "矿泉水", "绿茶", "其他", "碳酸饮料"]
num = [6, 10, 11, 8, 15]
explode = [0, 0.1, 0, 0, 0]
ax3 = plt.subplot(2, 2, 4) # 将画布分为2行2列,该子图位于第4个位置
ax3.pie(
num, explode=explode, labels=labels, autopct="%.2f%%", shadow=True, startangle=90
) # 饼图
plt.suptitle("我的几个图形") # 设置整体图形的标题
plt.show()

另外还有一个subplots
函数,使用方法是fig, axs = plt.subplots(nrows=1, ncols=1, index=1, **kwargs)
。其中,fig 用于调整整体图形的参数,而 axs 用于调整每个子图的参数。限于篇幅,我们不做过多介绍。
7.5. seaborn 简介#
seanborn 是 Python 的另外一个常用工具包,它基于 matplotlib,但画出的图形更加美观些,并且与 Pandas 的数据类型结合地较好。
# Import seaborn
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Apply the default theme
sns.set_theme() # 应用 seaborn 的默认主题
x = np.arange(0, 15, 0.5)
y = np.sin(x)
plt.plot(x, y)
plt.show()

可以看出,应用 seaborn 的主题后,图形的配色变化了些。下面我们导入 seaborn 自带的数据集 tips。
# Load an example dataset
tips = sns.load_dataset("tips") # seaborn 自带的数据集,国内导入网速慢可能出错,可以把数据集提前从 github 上下载到电脑里
print(tips)
type(tips)
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
.. ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
[244 rows x 7 columns]
pandas.core.frame.DataFrame
7.5.1. relplot
函数#
可以看出,tips 数据集载入后,是 Pandas 的 DataFrame 类型,seaborn 可以方便地针对 DataFrame 数据集画图。下面,我们以其中的relplot
函数为例,讲解如何使用 seanborn 画图。relplot
函数的基本用法如下:
relplot(data=None, x=None, y=None, row=None, col=None,hue=None, kind='scatter', **kwargs) | |
---|---|
data | 输入的数据,常见的数据类型,例如 Pandas 或 Numpy 中的数据 |
x | 横坐标数据 |
y | 纵坐标数据 |
row/col | 将数据按行或列划分为子数据集,生成多个子图 |
hue | 颜色,可以是数值类型或类别数据 |
kind | 图像类型,'line' 或 ‘scatter' |
**kwargs | 其他参数,例如 style,sizes 等 |
sns.relplot(
data=tips,
x="total_bill",
y="tip",
hue="smoker", # 按是否吸烟生成不同的颜色
col="sex", # 按不同性别生成子图
style="smoker", # 按是否吸烟生成不同的点形
)
plt.show()

生成线图时,相同横坐标的数据将会合并,并且,图像会显示均值以及 95% 的置信区间:
sns.relplot(data=tips, x="day", y="tip", hue="smoker", kind="line") # 按是否吸烟生成不同的颜色
plt.show()

seaborn 还有一个函数regplot
,可以进一步对数据进行线性拟合。
sns.regplot(data=tips, x="total_bill", y="tip")
<Axes: xlabel='total_bill', ylabel='tip'>

若要进行曲线拟合,可以进一步设置regplot
里面的参数 order, logx, logistic 等来生成。
7.5.2. barplot
函数#
seaborn 自带一些函数生成常见的图形,例如``barplot``生成条形图,``histplot``生成直方图,``boxplot``生成箱线图:
sns.barplot(
data=tips, y="day", x="tip", hue="smoker", orient="h" # 按是否吸烟生成不同的颜色 # 调整柱子横竖
)
plt.show()

sns.histplot(
data=tips,
x="tip",
)
plt.show()

sns.boxplot(
data=tips,
x="day",
y="tip",
)
plt.show()

seaborn 还有其他一些画图函数,例如heatmap
生成热力图,violinplot
生成小提琴图,限于篇幅,本文不再赘述,有兴趣的读者可以查阅官方文档。
7.6. 练习#
Exercise 7.1
画出下面这两个函数的图形,并填充两个函数之间的区域。(提示:用fill_between
函数填充颜色)
Solution to Exercise 7.1
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.linspace(-2, 2, 1000)
y1 = [math.sqrt(2 * abs(i) - i**2) for i in x]
y2 = [-2.14 * math.sqrt(math.sqrt(2) - math.sqrt(abs(i))) for i in x]
plt.plot(x, y1, "r")
plt.plot(x, y2, "r")
plt.fill_between(x, y1, y2, color="r")
plt.show()
Exercise 7.2
画出下面这个函数的图形,并尝试从0 到 20 变化 \(\alpha\) 的值实现动态心形的效果。(提示:用循环,结合参数 pause,clf 实现图形刷新)
Solution to Exercise 7.2
This is a solution:
import matplotlib.pyplot as plt
import numpy as np
# type %matplotlib qt to shown figure in a separate window
x = np.linspace(-1.8, 1.8, 1000)
alpha = 1
while alpha <= 21:
plt.xlim(-3, 3)
plt.ylim(-2, 4)
y = abs(x)**(2/3) + 0.9*np.sqrt(3.3 - x**2)*np.sin(alpha*(np.pi)*x)
plt.plot(x, y)
plt.text(-1.6, 3, r'$f(x)=x^{2/3}+0.9(3.3-x^2)^{1/2}\sin(\alpha\pi x)$')
alpha_s = str(round(alpha, 2))
tx = plt.text(-0.5, 2.5, r'$\alpha=$' + alpha_s)
plt.pause(0.02) # 停顿 0.02 s
if alpha <= 20:
alpha += 0.1
plt.clf() # 清除当前图像
else:
break
Solution to Exercise 7.2
This is another solution:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def animate(alpha):
x = np.linspace(-1.8, 1.8, 1000)
y = abs(x) ** (2 / 3) + 0.9 * np.sqrt(3.3 - x**2) * np.sin(alpha * (np.pi) * x)
PLOT.set_data(x, y)
time_text.set_text(r"$\alpha$ = " + str(round(alpha, 2)))
return PLOT, time_text
fig = plt.figure()
ax = fig.add_subplot(111, xlim=(-2.5, 2.5), ylim=(-2, 4)) # or plt.subplot
(PLOT,) = ax.plot([], []) # return all the lines
plt.text(-1.2, 3, r"$f(x)=x^{2/3}+0.9(3.3-x^2)^{1/2}\sin(\alpha\pi x)$")
time_text = ax.text(-0.45, 2.5, "") # transform = ax.transAxes
ani = FuncAnimation(fig, animate, frames=100, interval=200, repeat=False)
plt.show()