1. 从一个“翻车”的标题说起:Excel函数到底能玩出什么花样
“笛卡尔心形函数表达式”和“这该死的,无处安放的,Excel函数”这两个词凑在一起,第一次看到的人大概率会愣一下——一个是数学课本里那个著名的浪漫传说,一个是打工人每天都要面对的表格工具,它们之间能有什么关系?我最初也是带着这个疑问去动手试的,结果一头扎进去就是好几个晚上。这篇文章想聊的,就是怎么用Excel把那个传说中的心形曲线画出来,以及在这个过程中,Excel函数那些让人又爱又恨的脾气秉性。
先把话说清楚:这篇内容适合谁看?如果你是会写几个基础函数、但总觉得Excel“就那样”的办公族,或者你是对数学可视化有点兴趣、想找个轻量工具练手的学生党,再或者你只是单纯好奇“心形到底能不能用表格画出来”,那这篇东西应该能让你有所收获。它不需要你会编程,不需要你装任何插件,一台装了Excel的电脑就够。核心关键词就三个:笛卡尔心形函数、Excel函数、散点图可视化。整篇内容围绕这三个词展开,从原理到实操,从踩坑到优化,尽量把每一步都讲透。
为什么偏偏选Excel来做这件事?市面上能画函数图像的工具太多了,专业的数学软件、在线的绘图网站、甚至几行代码就能搞定。但Excel有个别的东西比不了的优势:它就在你手边。你每天打开它处理报表,对它足够熟悉,用它来做一件“不务正业”的事,反而能逼着你去理解那些平时只会复制粘贴的函数到底在干什么。而且Excel的图表系统足够灵活,散点图配合公式计算,画出来的曲线精度完全够看。说白了,这是一个用最熟悉的工具做最不熟悉的事的过程,收获往往比想象中大。
2. 心形函数的数学底子:先搞懂再动手
2.1 笛卡尔心形曲线的几种常见表达式
动手之前得先把数学这关过了。心形曲线在数学上不止一种表达方式,常见的有极坐标形式和参数方程形式,另外还有一种隐函数形式。不同的形式对应到Excel里的实现难度完全不一样,选错了形式,后面会多走很多弯路。
先看最广为人知的那个极坐标方程:
r = a(1 - sinθ)
这个式子里,r是极径,θ是极角,a是一个控制大小的常数。θ从0走到2π,r就跟着变化,描出来的点连起来就是一个心形。这个形式的好处是直观,一个式子搞定,坏处是Excel原生不支持极坐标绘图,你得自己把极坐标转成直角坐标才能画。
再看参数方程形式:
x = 16sin³ty = 13cos t - 5cos 2t - 2cos 3t - cos 4t
这个形式在网络上流传很广,因为它画出来的心形比较“饱满”,形状讨喜。t的取值范围是0到2π。参数方程的好处是直接给出x和y,不需要做坐标转换,Excel里两列数据就能直接上散点图,实现起来最省事。
还有一种隐函数形式,比如(x² + y² - 1)³ - x²y³ = 0,这种形式在Excel里实现起来最麻烦,因为它是隐式的,没法直接用一个公式算出y,需要解方程或者用等高线的方式去逼近,对普通用户不友好,我建议直接放弃这条路。
提示:如果你只是想快速看到效果,优先选参数方程形式;如果你想顺便理解极坐标和直角坐标的转换关系,可以挑战极坐标形式。隐函数形式除非你有特殊需求,否则不建议在Excel里折腾。
2.2 为什么选参数方程作为Excel实现方案
选参数方程不是随便拍的脑袋,背后有几个实打实的考量。
第一是数据结构的匹配度。Excel的散点图需要两列数据,一列X一列Y,参数方程天然就是给你x(t)和y(t)两个表达式,你只需要生成一列t值,然后分别算出对应的x和y,三列数据往表格里一放,图表直接出来。极坐标形式则需要额外一步转换,x = r·cosθ,y = r·sinθ,多了一层计算,虽然也不难,但多一步就多一个出错的地方。
第二是精度控制的便利性。参数方程里t的采样密度直接决定了曲线的平滑程度。t从0到2π,你取100个点还是1000个点,画出来的效果差别很明显。在Excel里控制这个很简单,生成一列等差数列就行,步长想调多细调多细。极坐标形式虽然也能这么干,但θ和r的对应关系在转换过程中容易因为角度单位(弧度还是度)搞混,新手很容易在这里翻车。
第三是公式的可读性。参数方程的x和y表达式虽然看起来长,但每一项都是独立的三角函数,拆开来看很清晰。你在Excel里写公式的时候,可以一项一项地拼,写错了也容易定位是哪一项出的问题。极坐标那个r = a(1 - sinθ)虽然短,但转换到直角坐标后,公式里会嵌套sin和cos,排查起来反而更费劲。
基于这三点,我最终选的是参数方程这条路。下面所有的实操步骤都围绕这个方案展开。如果你对极坐标形式有执念,后面我也会提一嘴怎么改,但主线走参数方程。
2.3 参数t的采样策略:点少了像多边形,点多了卡电脑
t的采样是整个过程里最容易被忽视、但对最终效果影响最大的一个环节。说直白点,t的采样就是决定你用多少个点去“描”这条曲线。点太少,曲线看起来像用直线段拼出来的多边形,棱角分明;点太多,Excel计算量上去了,图表渲染也会变慢,低配电脑上甚至能卡到你想砸键盘。
我的经验是:t取0到2π,步长用0.05到0.1之间比较合适。算一下,2π约等于6.283,步长0.1的话大概63个点,步长0.05的话大概126个点。实测下来,126个点画出来的心形已经相当平滑了,肉眼基本看不出棱角。如果你追求极致平滑,步长降到0.02,大概314个点,效果更好,但文件体积和计算时间会明显增加。
这里有个细节要注意:t的最后一个值要正好落在2π上,或者稍微超过一点,保证曲线闭合。如果你用步长0.1,从0开始生成,最后一个点可能是6.2,离2π还差一点,心形的底部会有一个小缺口。解决办法很简单,生成序列的时候把终点设成2π,让Excel自动算步长,或者手动在最后补一个2π的行。
注意:不要一上来就设几千个点,先拿100个点左右跑通流程,看到图形没问题了,再根据需要对采样密度做微调。上来就堆点数是新手常见的误区,除了让电脑变慢之外没有任何好处。
3. Excel实操全流程:从空白表格到心形曲线
3.1 第一步:搭好数据骨架
打开Excel,新建一个空白工作簿。在A1单元格输入“t”,B1输入“x”,C1输入“y”,这三列就是整个项目的数据骨架。
A列放t的值。在A2单元格输入0,然后选中A2,用填充序列的方式生成等差数列。具体操作:菜单栏找“填充”里的“序列”,序列产生在“列”,类型选“等差序列”,步长值填0.1,终止值填6.2832(也就是2π的近似值)。点确定,A列就会自动填满从0到6.2832、步长0.1的一串数字。
这里有个小坑要提醒:Excel的填充序列对终止值的处理是“不超过终止值”,所以最后一个数可能不是精确的6.2832,而是6.2。如果你介意这个,可以手动把最后一个单元格改成6.2832,或者干脆把终止值设成6.29,让它多生成一个点,然后把超出的那行删掉。我个人的习惯是手动补最后一行,保证曲线闭合。
B列和C列放公式。B2单元格输入x的参数方程表达式,C2输入y的表达式。注意Excel里的三角函数默认用弧度,t本身就是弧度值,所以直接写就行,不需要额外转换。公式里所有的t都引用A2单元格。
写公式的时候有个技巧:先把公式在记事本里拼好,检查一遍括号和运算符,再粘贴到Excel里。参数方程的x表达式里有三次方和多个三角函数相乘,括号嵌套比较多,直接在Excel编辑栏里写容易漏括号。我头几次就是在这里翻车的,公式报错查了半天,最后发现是少了一个右括号。
3.2 第二步:把公式写对,别让括号坑了你
x的公式,按参数方程 x = 16sin³t 来写,在Excel里是:
=16*SIN(A2)^3这个还算简单。y的公式就长了,y = 13cos t - 5cos 2t - 2cos 3t - cos 4t,在Excel里写成:
=13*COS(A2)-5*COS(2*A2)-2*COS(3*A2)-COS(4*A2)写的时候注意乘号不能省,COS和括号之间也不能省。Excel对公式的语法要求比较严格,少一个星号就报错。另外,2*A2这种写法不能写成2A2,Excel不认。
公式写好后,选中B2和C2,双击右下角的填充柄,让公式自动填充到A列有数据的最后一行。填充完之后,B列和C列就是对应每个t值的x和y坐标了。
提示:填充完之后随便挑一行验算一下。比如t=0的时候,sin0=0,x应该等于0;cos0=1,y = 13-5-2-1 = 5。去表格里找t=0那一行,看x是不是0、y是不是5,对上了说明公式没问题。这个验算步骤花不了半分钟,但能帮你提前发现大部分公式错误。
3.3 第三步:插入散点图,让曲线现形
数据准备好了,接下来就是画图。选中B列和C列的数据区域(从B2到C列最后一行),菜单栏“插入”里找到散点图,选“带平滑线的散点图”或者“仅带数据标记的散点图”都行。前者画出来是连续的曲线,后者是一堆点,看个人喜好。我一般先用“仅带数据标记的散点图”看点的分布对不对,确认没问题再换成平滑线。
图出来之后,你大概率会发现它长得不太像心形,可能是个歪的,或者比例不对。别慌,这很正常,原因通常有两个:一是坐标轴的纵横比不对,二是数据范围没调好。
先说纵横比。Excel的图表默认会自动缩放坐标轴,x和y的刻度范围可能不一样,导致图形被拉伸或压扁。解决办法是手动设置坐标轴范围,让x轴和y轴的单位长度在视觉上一致。双击坐标轴,在“坐标轴选项”里把最小值、最大值设成对称的范围,比如x轴设-20到20,y轴也设-20到20。这样图形就不会变形了。
再说数据范围。参数方程画出来的心形,x的范围大概在-16到16之间,y的范围大概在-17到12之间。如果你发现心形被切掉了一部分,检查一下坐标轴的最大最小值是不是没覆盖到数据的实际范围。把范围放宽一点,图形就完整了。
3.4 第四步:调参美化,让心形更像“心”
图形基本成型之后,剩下的就是调参和美化。这一步没有标准答案,全看个人审美,但有几个地方值得调一调。
颜色和线条:散点图的点可以调小一点,线条可以调粗一点,颜色选个顺眼的。我一般把线条设成红色或者粉色,点设成不显示或者很小,这样看起来更像一个完整的心形轮廓,而不是一串珠子。
坐标轴和网格线:把坐标轴的数字和网格线隐藏掉,画面会干净很多。双击坐标轴,在“标签”里选“无”,网格线在“图表元素”里取消勾选。这样图里就只剩一个心形,视觉焦点很集中。
图表标题和背景:标题可以删掉或者改成自己想要的话,背景设成白色或者透明。如果是要发给别人看,加个标题也无妨;如果是自己看着玩,越简洁越好。
调参的过程中你会发现,参数方程里那些系数(16、13、5、2、1)稍微改一改,心形的胖瘦和比例就会变。比如把x表达式里的16改小一点,心形会变窄;把y表达式里的13改大一点,心形会变高。这个可以自己试着玩,没有对错之分,纯粹是形状偏好问题。
4. 那些年我踩过的坑:问题排查与避坑指南
4.1 公式报错和图形异常速查表
实操过程中遇到的问题五花八门,我把最常见的几类整理成了一张表,方便对照排查。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 公式输入后显示#NAME? | 函数名拼写错误,或用了Excel不认识的函数 | 检查SIN、COS拼写,确认没有多余空格 |
| 公式显示#VALUE! | 引用的单元格不是数值,或括号不匹配 | 检查A列是否为数值,逐层核对括号 |
| 图形是一条直线或一个点 | 公式引用错误,所有行算出来是同一个值 | 检查公式里的A2是否随行号变化,填充时是否用了绝对引用 |
| 心形只有一半 | t的采样范围不够,没覆盖完整周期 | 确认t从0到2π,最后一行补上2π |
| 心形底部有缺口 | 最后一个t值没到2π | 手动把最后一行t改成6.2832 |
| 图形被拉伸变形 | 坐标轴纵横比不一致 | 手动设置x轴和y轴的范围,保持单位长度一致 |
| 曲线棱角明显 | t的采样点太少 | 减小步长,增加采样点数量 |
| Excel卡顿严重 | 采样点过多,或图表类型选了平滑线且点数巨大 | 减少采样点,或改用仅数据标记的散点图 |
这张表里的每一条都是我或者身边人实际遇到过的。其中“公式引用错误导致图形是一条直线”这个坑最隐蔽,因为公式看起来没报错,但结果就是不对。原因通常是填充公式的时候用了绝对引用(比如$A$2),导致每一行都引用同一个t值,算出来的x和y全都一样,所有点叠在一起,看起来就是一个点或者一条线。解决办法是确保公式里用的是相对引用A2,填充时它会自动变成A3、A4。
4.2 关于Excel函数的那点“脾气”
标题里说“这该死的,无处安放的,Excel函数”,这话不是白说的。用Excel写数学公式,有几个脾气你得顺着它来。
第一,Excel的三角函数只认弧度。你要是习惯用角度,得先乘以π/180转成弧度。参数方程里的t本身就是弧度,所以这个问题在这个项目里不明显,但如果你改用心形函数的其他变体,涉及到角度的地方一定要注意。
第二,Excel的运算符优先级和数学课本一致,但括号必须写全。数学里写个分式,分子分母一目了然,Excel里不行,除法必须用斜杠,分子分母有运算的必须加括号。比如(a+b)/(c+d),括号少一个结果就全错。
第三,Excel对空单元格和文本的处理比较“宽容”,有时候公式引用了空单元格不报错,而是当0处理,这会导致一些隐蔽的错误。所以数据区域里不要留空行,填充公式的时候确保每一行都有对应的t值。
第四,大数量级的计算要注意浮点误差。参数方程里的三次方和三角函数叠加,在极端值附近可能会有微小的精度偏差,但对我们画图来说完全不影响,肉眼看不出来。如果你发现某个点的位置明显偏离,先检查公式,再检查t值,一般不会是浮点误差的问题。
注意:Excel的公式是“活”的,你改了A列的t值,B列和C列会自动重算,图表也会跟着变。这个特性既是优点也是坑——优点是调参方便,改一个数就能看到效果;坑是如果你不小心动了某个单元格,可能整个图形就变了,而且不容易发现是哪里改的。建议在调参阶段多存几个版本,或者把关键参数单独放在一个单元格里,公式引用那个单元格,这样改起来可控。
4.3 性能优化:别让心形把电脑拖垮
采样点数量上去之后,Excel的计算和渲染压力会明显增加。我试过用步长0.01生成六百多个点,在一台老笔记本上,每次改公式都要等好几秒才能重算完,拖动图表也有明显的卡顿感。如果你也遇到这种情况,有几个优化方向。
减少不必要的计算。B列和C列的公式只依赖A列,确保没有引用其他无关单元格。图表的数据源只选B列和C列的有效区域,不要把整列都选进去,否则Excel会去处理大量空单元格。
图表类型选轻量的。平滑线散点图比仅数据标记的散点图渲染开销大,如果点数很多,优先用仅数据标记,或者把标记调小。等最终效果确认了,再换成平滑线出图。
关掉自动重算。Excel默认是自动重算,改一个单元格全部公式重算。在“公式”选项卡里把计算方式改成“手动”,调参的时候手动按F9重算,能省不少等待时间。当然,调完之后记得改回自动,不然以后用Excel会不习惯。
分文件操作。如果数据量实在大,可以把数据计算和图表展示分到两个文件里,计算文件负责生成数据,展示文件只放图表和引用过来的数据。这样改公式的时候不会触发图表重绘,流畅度会好很多。
5. 从心形到任意曲线:这套方法的延展玩法
5.1 换一个函数,就是另一条曲线
心形画出来之后,这套方法的延展性其实很强。本质上你做的事情是:用一列参数t,通过两个函数x(t)和y(t)生成坐标点,再用散点图连起来。只要你能写出x(t)和y(t)的表达式,任何参数曲线都能用同样的流程画出来。
比如画一个圆:x = cos t,y = sin t,t从0到2π。比如画一个椭圆:x = a·cos t,y = b·sin t,改a和b就能调长短轴。再比如画李萨如图形:x = sin(at),y = sin(bt),改a和b的比值能得到各种交织的图案。这些在Excel里都是同样的操作:改B列和C列的公式,图表自动更新。
我拿这套方法画过螺旋线、摆线、甚至一些简单的分形近似图形。每次都是改公式、调采样、看效果,流程完全一样。心形只是入口,真正有价值的是这套“参数方程加散点图”的通用方法。
5.2 把心形做成动态图表
如果你对Excel的动态图表有点了解,可以把这个心形做成可交互的。思路是把参数方程里的系数(比如控制大小的a)单独放在一个单元格里,公式引用那个单元格。然后加一个滚动条控件,拖动滚动条就能改变a的值,心形跟着放大缩小。
具体操作:在“开发工具”选项卡里插入一个滚动条控件,设置最小值和最大值,链接到一个空白单元格(比如E1)。然后把公式里的常数换成对E1的引用。这样拖动滚动条,E1的值变化,公式重算,心形大小跟着变。这个玩法适合做演示或者给小孩子看,直观展示参数对图形的影响。
不过要提醒一句:滚动条控件在不同版本的Excel里位置和设置方式略有差异,如果找不到“开发工具”选项卡,需要在选项里把它调出来。另外,控件和公式的联动有时候会有延迟,拖动太快可能图表跟不上,这是正常现象,松手之后会更新到位。
5.3 导出和分享的几种方式
画好的心形想分享出去,有几种方式。最简单的是截图,选中图表区域复制,粘贴到聊天窗口或者文档里。如果对方也要Excel文件,直接发文件,但注意公式和图表在低版本Excel里可能有兼容性问题,最好确认一下对方的版本。
想要更高清的图,可以把图表复制到PowerPoint里,再另存为图片,分辨率会比直接截图高一些。或者用Excel的“另存为”功能,把图表单独存成图片格式。不过Excel导出的图片质量一般,如果对清晰度要求高,还是得用专业的截图工具或者虚拟打印机。
还有一种玩法是把数据导出来,用其他工具做进一步处理。B列和C列的数据复制到文本文件里,就是标准的坐标点数据,导入到任何绘图工具里都能用。这个适合想把心形用到其他项目里的场景。
6. 一些实操之后的个人体会
这套东西折腾下来,最大的感受是:Excel的函数没有想象中那么“死板”,它只是被大多数人用在了报表和统计上,实际上它的计算能力足够支撑很多有意思的玩法。参数方程画心形这件事本身没什么实用价值,但过程中对公式引用、填充逻辑、图表配置的理解,是能迁移到正经工作里的。
比如那个“绝对引用和相对引用”的坑,我在做心形的时候踩过一次,后来做数据透视表和多表关联的时候又遇到类似的问题,因为有了前面的教训,第二次就很快反应过来了。再比如坐标轴范围的手动设置,这个技巧在做任何图表的时候都用得上,默认的自动缩放经常把图形搞得比例失调。
还有一个体会是关于“采样密度”的。这个思路在数据分析里其实很常见——你用多少数据点去描述一个趋势,点太少信息丢失,点太多噪音和计算成本都上来了。心形曲线是个直观的例子,看多了就能对“多少点够用”有个手感。
最后分享一个小技巧:如果你在写长公式的时候老是漏括号,可以先把公式拆成几段,分别写在不同的单元格里,确认每一段都对,再把它们拼起来。比如y的公式可以拆成四项,分别算13cos t、5cos 2t、2cos 3t、cos 4t,最后再相减。这样排查错误的时候一眼就能看出是哪一项的问题。拼好之后把中间单元格删掉,公式合并成一条,不影响最终结果。这个笨办法在公式复杂的时候特别管用,比对着编辑栏数括号靠谱多了。