Python的拿手好戏是解决数据分析和可视化问题,本篇文章给大家分享的是python代码画出爱心曲线的操作详解,内容挺不错的,希望可以帮助到有需要的朋友。
先不急着画爱心线,来看如何画函数曲线。
例如,画出指定区间的一个多项式函数:
Python 代码如下:
import numpy as np import matplotlib.pyplot as plt X = np.linspace(-4, 4, 1024) Y = .25 * (X + 4.) * (X + 1.) * (X - 2.) plt.title('$f(x)=\\frac{1}{4}(x+4)(x+1)(x-2)$') plt.plot(X, Y, c = 'g') plt.show()
通过numpy的linspace方法来确定横坐标x的取值范围,列出方程,然后调用matplotlib的pyplot画出函数曲线即可。numpy 是一个用python实现的科学计算包,包括一个强大的N维数组对象Array和成熟的函数库,有用于整合C/C++和Fortran代码的工具包,提供了实用的线性代数、傅里叶变换和随机数生成函数等工具,可以理解成Matlab。
记得中学的时候,我问老师三角函数到底有啥用?(无知者无畏)老师反问我,“如果给了你一块洋铁,怎样才能剪出煤炉烟囱的拐弯呢?”,现在仍然记得老师的这个例子,哪些看似抽象的数学公式,实际上是自己不知道她们的应用场景而已。
Python代码如下:
import numpy as np import matplotlib.pyplot as plt X = np.linspace(0, 2 * np.pi, 100) YSinValues = np.sin(X) YCosValues = np.cos(X) plt.plot(X, YSinValues) plt.plot(X, YCosValues) plt.show()
Matplotlib 是一个 Python 的 2D绘图库,甚至可以生成出版质量级别的图形。
对于那些正态分布而言,Python 画起来也就相当简单了:
import numpy as np import matplotlib.pyplot as plt def pdf(X, mu, sigma): a = 1. / (sigma * np.sqrt(2. * np.pi)) b = -1. / (2. * sigma ** 2) return a * np.exp(b * (X - mu) ** 2) X = np.linspace(-6, 6, 1000) for i in range(3): samples = np.random.standard_normal(10) mu, sigma = np.mean(samples), np.std(samples) plt.plot(X, pdf(X, mu, sigma), color = '.66') plt.plot(X, pdf(X, 0., 1.), color = 'b') plt.show()
为了不显得单调,这里多画了几条曲线。只要算出方差和均值,从excel中读出哪些数值就可以拟合正态分布了。
回归到主题,关于爱心线,有这样一个凄美的爱情故事。
迩来流浪于吴越,一片闲云空皎洁。
300多年前,斯德哥爾摩的街頭,落魄的笛卡兒過著乞討的生活,全部的財產破破爛爛的衣服和隨身所帶的幾本數學書籍。清高的笛卡兒沒有開口請求路人施捨,只是默默地低頭在紙上寫寫畫畫,潛心於他的數學世界。 一個寧靜的午後,笛卡兒照例坐在街頭的陽光中研究數學問題,身邊過往的人群,喧鬧的車馬隊伍,都無法對他造成乾擾。
有美一人,婉如清揚。邂逅相遇,與子偕臧。
「你在幹嘛呢?」扭過頭,笛卡兒看到一張年輕秀麗的瞼龐,一雙清澈的眼睛如湛藍的湖水,楚楚動人,她就是瑞典的小公主,國王最寵愛的女兒克莉絲汀。 她蹲下身,拿過笛卡兒的數學書和草稿紙,和他交談起來。言談中,他發現,這個小女孩思維敏捷,對數學有著濃厚的興趣。
幾天后,笛卡兒意外地接到通知,國王聘請他當小公主的數學老師。滿心疑惑的笛卡兒跟著侍衛一起來到皇宮,他聽到了從遠處傳來的銀鈴般的笑聲。他看到了那天在街頭偶遇的女孩子,從此,他當上了公主的數學老師。
情不知所起,一往而深
# 公主的數學在笛卡爾的悉心指導下突飛猛進,他們之間也開始變得親密起來。笛卡兒向她介紹了直角座標系,代數與幾何可以結合起來,也就是日後笛卡兒創立的解析幾何學雛形。 在笛卡兒的帶領下,克莉絲汀走進了奇妙的座標世界,她對著曲線著了迷。每天的形影不離也使他們彼此產生了愛慕之心。
在瑞典這個浪漫的國度裡,純粹美好的愛情悄悄萌發。
念去,千里煙波,暮靄沉沉楚天闊。
他們的戀情傳到了國王的耳中,國王大怒,下令將笛卡爾處死。在克莉絲汀的苦苦哀求下,國王將他放逐回國,公主被軟禁在宮中。
當時,歐洲大陸正流行黑死病。笛卡兒回到法國後不久,便染上重病。在生命進入倒數計時的日子,他日夜思念的還是街頭偶遇的那張溫暖笑臉。他每天堅持要給她寫信,盼望她的回音。然而,這些信都被國王攔截下來,公主一直沒有收到他的任何消息。
欲知心裡事,看取腹中書.
#
在笛卡尔给克里斯汀寄出第十三封信后,他永远地离开了这个世界。此时,被软禁在宫中的小公主依然徘徊在皇宫的走廊里,思念着远方的情人。
这最后一封信上没有写一句话,只有一个方程:r=a(1-sinθ)。
国王以为这个方程里隐藏着两个人的秘密,便把全城的数学家召集到皇宫,但是没有人能解开这个函数式。他不忍看着心爱的女儿每天闷闷不乐,便把这封信给了她。拿到信的克里斯汀欣喜若狂,她立即明白了恋人的意图,找来纸和笔,把图形画了出来,一颗心形图案出现在眼前,克里斯汀泪流满面,这条曲线就是著名的“心形线”。
国王去世后,克里斯汀继承王位,便立刻派人去法国寻找心上人的下落,收到的却是笛卡尔去世的消息,留下了一个永远的遗憾…… 这封享誉世界的另类情书,据说至今还保存在欧洲笛卡尔的纪念馆里。
这个故事的出处无从知道,网络上流传着各种各样的版本,甚至在百度百科也有着这个故事。后来,有人考证了真实性,认为这是一个美丽的谎言,但并不妨碍人们对爱心线喜爱。
在直角坐标系中,爱心线的方程的python 表达为:x** 2+ y** 2 + a * x= a * sqrt(x** 2+y** 2) 和 x** 2+ y** 2 - a * x= a * sqrt(x** 2+y** 2)
通过x 来求对应的y值很麻烦,就像软件设计中的“万能层”那样,可以采用参数方程来表示:
x=a*(2*cos(t)-cos(2*t)) y=a*(2*sin(t)-sin(2*t))
具体的python代码如下:
import numpy as np import matplotlib.pyplot as plt a = 1 t = np.linspace(0 , 2 * np.pi, 1024) X = a*(2*np.cos(t)-np.cos(2*t)) Y = a*(2*np.sin(t)-np.sin(2*t)) plt.plot(Y, X,color='r') plt.show()
代表爱心的心形线来了:
但这不是六行代码呀?也不是r=a(1-sinθ)呀? 的确如此,那是极坐标系,python 的matplotlib同样支持极坐标系的,爱心线的六行pyton代码如下:
import numpy as np import matplotlib.pyplot as plt T = np.linspace(0 , 2 * np.pi, 1024) plt.axes(polar = True) plt.plot(T, 1. - np.sin(T),color="r") plt.show()
这样,得到的就是封面中的图像了:
心形线确实是爱心满满,如果融入了忧伤会是怎样呢?
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-8 , 8, 1024) y1 = 0.618*np.abs(x) - 0.8* np.sqrt(64-x**2) y2 = 0.618*np.abs(x) + 0.8* np.sqrt(64-x**2) plt.plot(x, y1, color = 'r') plt.plot(x, y2, color = 'r') plt.show()
这样就得到了另一个爱心线:
網路上還有關於愛心線的各種漂亮實現,也充滿了各種各樣的情緒,但對於每一種,基本上都可以用python 相對簡潔的實現。
實際上,繪圖很簡單,難的是那些曲線方程式的表達以及實際的應用場景需求,例如螺旋線。
##進一步,也可以畫出各種3個維度的視圖,例如:
####### ##############總結:#########作為資料分析乃至大資料處理的最後一個環節,就是所謂洞見的視覺化,python 可以說是其中的一個簡單實用的工具。 ###
以上是python程式碼畫出愛心曲線的詳細內容。更多資訊請關注PHP中文網其他相關文章!