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()
_images/28a252cf2c52ec80a75dd8aa947e19c55fe17816e124fc1495ed2d7f3e85d396.png

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>]
_images/1960487e02705e64fb782ada7ace8abe1dd245bdfa5e771b1382dc8b53c4e990.png
plt.plot(x, y, "b ")  # 颜色为蓝色('b')、点形为圆('o')
[<matplotlib.lines.Line2D at 0x10fa0ae40>]
_images/b251f6d31de10b926e1c8f6448d698544a5c5dbd3ba8494ec71315b5bceca67a.png
plt.plot(y, "g-.")  # 颜色为绿色('g'),线形为折线('-.')
[<matplotlib.lines.Line2D at 0x10fb2a030>]
_images/6a6574b83139e69cc65d4fe67da903ec6432ec1fa3fa00ffc1e0a12b78020fbf.png
plt.plot(
    x, y, "yo:", label="y=sin(x)", lw=2
)  # 颜色为黄色('y'),点形为圆形('o'),线形为虚线(':'),lable 内容为 'y=sin(x)', 线条宽度为 2
[<matplotlib.lines.Line2D at 0x10fbb1040>]
_images/816540be985965cc59eafc61e284d3ffa703880a5a6b49649fb811d2911b84bd.png

如果我们想自定义坐标轴的标题,坐标轴的刻度,坐标轴刻度的范围,设置图形标题,添加图例时,可以通过设置 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()
_images/8d57567c51b59d9359081906c651bdfb980f91245bddfa1a940bfc7065bd8c21.png
  • 可以看出,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()
_images/0c4f82efe68d9f1d44cee21c29a94a5ebd97650dd500b59f26f2ebcb60443adc.png

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()
_images/c019a7d241707692214969cd4ff18a25375e6d8eb15bcf97dc78b1146bc9d246.png

横放条形图使用barh函数,用法与bar基本一致。

waters = ("碳酸饮料", "绿茶", "矿泉水", "果汁", "其他")
buy_number = [6, 7, 6, 1, 2]

plt.barh(waters, buy_number)
plt.title("男性购买饮用水情况的调查结果")

plt.show()
_images/ef802372854e88ea575a0e077ed678cb72a351283faafb674a67ea0e4d0f7be3.png

若要将男生与女生的调查情况画出两个条形图一块显示,则可以使用barbarh函数两次,并调整barbarh函数的条形图位置坐标以及相应刻度,使得两组条形图能够并排显示。

# 导入工具包
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()
_images/d279070f80303a08cb7b0e51de27c2d2a52ea2bf7e11466845bd50645a99bcd4.png

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()
_images/0ce9ee524c549869631cb0930aead76c6c817f885f14e6c940fe815ffdab02d8.png

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()
_images/a49845c3fc6bd9af3cf4ab423651305e535b18344f76ca6a4aa9db9b5ea86d57.png

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()
_images/003b893d2f37aaca7d7a6ad9cef5a2ac6ea638b1662f56aea6a42b9b55f46e14.png

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()
_images/f90ff4371db7c4124ad433dcd2f5a0cb2c30cd7f4398ad4f873a910c61531291.png

另外还有一个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()
_images/35f09abc0649f8967ffd26e061bb88f681c51818f491ccfaecd376432a700516.png

可以看出,应用 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()
_images/60af268be7890664fe7ccfaec71317c7334bb594017737d980153328b2160855.png

生成线图时,相同横坐标的数据将会合并,并且,图像会显示均值以及 95% 的置信区间:

sns.relplot(data=tips, x="day", y="tip", hue="smoker", kind="line")  # 按是否吸烟生成不同的颜色
plt.show()
_images/d2cb16a6b5dc00be8c55d7554920ea9a8d3cc4e840277c781f11e5b1c0a22022.png

seaborn 还有一个函数regplot,可以进一步对数据进行线性拟合。

sns.regplot(data=tips, x="total_bill", y="tip")
<Axes: xlabel='total_bill', ylabel='tip'>
_images/387de721ee30f726809ea5d5156230e49a2c3ee49b031fbb68a0c737070ca400.png

若要进行曲线拟合,可以进一步设置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()
_images/e555af13d653b491680757ea61f6bcb4b9e61f0fa0d839a128fc1325017ac363.png
sns.histplot(
    data=tips,
    x="tip",
)
plt.show()
_images/5438a3554142524d164dc95d8f30e907ab92f5adfb1ced60c2f5e8f32ef9165b.png
sns.boxplot(
    data=tips,
    x="day",
    y="tip",
)
plt.show()
_images/db570bf910202cf3036fd0e6deeed6b5f6966b027865bdab17ea1a248aee7b69.png

seaborn 还有其他一些画图函数,例如heatmap生成热力图,violinplot生成小提琴图,限于篇幅,本文不再赘述,有兴趣的读者可以查阅官方文档。

7.6. 练习#


Exercise 7.1

画出下面这两个函数的图形,并填充两个函数之间的区域。(提示:用fill_between函数填充颜色)

\[\begin{split} \begin{align} f(x)=&\sqrt{2|x| - x^2}\\ g(x)=&-2.14\sqrt{\sqrt{2}-\sqrt{|x|}} \end{align} \end{split}\]

Exercise 7.2

画出下面这个函数的图形,并尝试从0 到 20 变化 \(\alpha\) 的值实现动态心形的效果。(提示:用循环,结合参数 pause,clf 实现图形刷新)

\[ f(x)=x^{2/3}+0.9(3.3-x^2)^{1/2}\sin(\alpha\pi x) \]