
正文
Python函数图像交点 python画数学函数图像
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
不能直接写出函数的表达式 怎么在python里画函数图象呢?
不写出y=f(x)这样的表达式,由隐函数的等式直接绘制图像,以x²+y²+xy=1的图像为例,使用sympy间接调用matplotlib工具的代码和该二次曲线图像如下(注意python里的乘幂符号是**而不是^,还有,python的sympy工具箱的等式不是a==b,而是a-b或者Eq(a,b),这几点和matlab的区别很大)
直接在命令提示行的里面运行代码的效果
from sympy import *;
x,y=symbols('x y');
plotting.plot_implicit(x**2+y**2+x*y-1);
相关问答
Q1: 关于Python命令行的NBA文字直播小工具
找了一圈NBA文字直播网站,发现手机版直播吧有现成的接口,直接返回json格式数据。那就是它了,听我慢慢道来。
首先在电脑浏览器打开手机版直播吧,我用的是chrome浏览器,在Network中可以看到,它不停地用GET方式请求,这个地址会返回当前正在进行的所有类型比赛的基本情况,根据其中的type字段过滤掉非NBA比赛就OK了。其中最重要的是ID字段,之后的所有操作都需要用到。返回的数据如下所示:
{
"code": "2760624",
"second": "10",
"list": [
{
"id": "96233",
"sdate": "2017-04-20",
"time": "10:30",
"url": "/zhibo/nba/2017/042096233.htm",
"type": "basketball",
"start": "2017-04-20 10:30",
"home_team": "勇士",
"visit_team": "开拓者",
"home_score": "106",
"visit_score": "81",
"period_cn": "第4节\n01:30",
"from": "dc.live",
"code": "373",
"update": "13:13:37",
"big_score_1": "",
"big_score_2": ""
},
... # 省略了其它比赛的信息
]}12345678910111213141516171819202122232425
获得所有正在进行的比赛ID后,点击某一场比赛,进入文字直播页面。首先请求页面,其中XXXX是上一步获取的id,它会返回一个数字,即max_sid。然后判断该max_sid是否大于上次获取的该值,如果大于,表示有新的直播文字,否则表示没有。
如果max_sid大于上一次的值,通过请求(其中XXXX是今天的日期,格式为2017-04-20,YYYY是第一步中获取的id),返回这场比赛的基本情况,比如比分,是第几节等,如下所示:
{ "id": "96233", "home_team": "勇士", "visit_team": "开拓者", "home_score": "110", "visit_score": "81", "period_cn": "第4节结束", ...}123456789
最后,就可以获取直播的文字了。请求(其中XXXX是比赛id,YYYY是max_sid),它会返回最新的直播文字,其中包括一条或多条直播文字,如下所示:
[
{ "live_id": "8769977", "live_text": "@仙女最库阿-:库里正负值最高32我去!!!!", "home_score": "110", "visit_score": "81", "pid_text": "比赛结束", ...
}, ... # 可能有多条直播文字]1234567891011
可以看到,该请求返回的信息中没有比赛剩余时间、主队和客队等信息,所以每次获取直播文字之前,需要多一次请求,获得比赛的基本信息。
基本流程就是这样,非常简单,一共就四个GET请求,返回四串json,用requests库请求,然后解析搞定。
先定义一个Match类,表示当前正在进行的每一场比赛。
# match.pyclass Match:
def __init__(self, **kwargs):
self.id = kwargs['id']
self.home_team = kwargs['home_team']
self.visit_team = kwargs['visit_team']
self.home_score = kwargs['home_score']
self.visit_score = kwargs['visit_score']
self.period_cn = kwargs['period_cn'].replace('\n', ' ') def __repr__(self):
return '{self.id} {self.home_team} {self.home_score} - {self.visit_score} {self.visit_team} {self.period_cn}'.format(self=self)12345678910111213
再定义一个TextLiving类,表示获取的每一条文字直播。
# text_living.pyclass TextLiving:
def __init__(self, match_info, **kwargs):
self.home_team = match_info['home_team']
self.visit_team = match_info['visit_team']
self.period_cn = match_info['period_cn']
self.live_text = kwargs['live_text']
self.home_score = kwargs['home_score']
self.visit_score = kwargs['visit_score'] def __repr__(self):
return '{self.home_team} {self.home_score} - {self.visit_score} {self.visit_team} {self.period_cn}\n{self.live_text}\n{sep}'.format(self=self, sep='*'*60)12345678910111213
接着创建zhibo8_api.py模块,用于获取相关数据。
# 当前正在进行的比赛Living_Matches_Url = ''# 某一场比赛当前的max_sidMatch_Max_Sid_Url = ''# 某一场比赛最新文字直播Match_Living_Text_Url = ''# 某一场比赛当前的基本情况Match_Info_Url = ''def get_living_matches():
response = requests.get(Living_Matches_Url)
result = json.loads(response.text)
matches = [Match(**match) for match in result['list'] if match['type'] == 'basketball' and match['period_cn'] != '完赛'] return matchesdef get_match_max_sid(match_id):
response = requests.get(Match_Max_Sid_Url % match_id) if response.status_code == requests.codes.ok: return int(response.text)def get_match_living(match_id, max_sid):
# 先获取比赛的当前情况,再获取最新文字直播
match_info = get_match_info(match_id)
response = requests.get(Match_Living_Text_Url % (match_id, max_sid))
texts = [] if response.status_code == requests.codes.ok:
result = json.loads(response.text)
texts = [TextLiving(match_info, **living) for living in result] return textsdef get_match_info(match_id):
today = datetime.now().strftime('%Y-%m-%d')
response = requests.get(Match_Info_Url % (today, match_id))
match_info = json.loads(response.text) return match_info123456789101112131415161718192021222324252627282930313233343536373839404142
最后,在main.py模块中启动程序,开始直播!
def get_living_matches():
matches = zhibo8_api.get_living_matches() for match in matches:
print(match) return matchesdef get_watch_match(matches):
match_id = input('请输入比赛ID:') for match in matches: if match.id == match_id: return match else:
print('输入的ID不正确') return Nonedef main_loop():
matches = get_living_matches() if len(matches) == 0:
print('当前没有比赛!!!') return
match = get_watch_match(matches) if not match:
print('没去找到该比赛') return
current_match_max_sid = -1
while True:
match_max_sid = zhibo8_api.get_match_max_sid(match.id) if not match_max_sid:
print('没有直播数据') return
if current_match_max_sid == match_max_sid: continue
current_match_max_sid = match_max_sid
text_livings = zhibo8_api.get_match_living(match.id, current_match_max_sid) for text in text_livings:
print(text)if __name__ == '__main__':
main_loop()
Q2: Python OpenCV 霍夫(Hough Transform)直线变换检测原理,图像处理第 33 篇博客
霍夫变换(Hough Transform)是图像处理领域中,从图像中识别几何形状Python函数图像交点的基本方法之一。主要识别具有某些相同特征Python函数图像交点的几何形状,例如直线,圆形,本篇博客的目标就是从黑白图像中识别出直线。
翻阅霍夫直线变换的原理时候,橡皮擦觉得原理部分需要先略过,否则很容易在这个地方陷进去,但是问题来Python函数图像交点了,这个原理略过了,直接应用函数,里面有些参数竟然看不懂。例如极坐标,角度扫描范围,这种函数就属于绕不过去的知识点了,所以本文转移方向,死磕原理,下面的博文将语无伦次的为你展示如何学习原理知识。
因为数学知识的贫乏,所以在学习阶段会涉及到很多基础概念的学习,一起来吧。
首先找到相对官方的资料,打开该 地址
下面是一个数学小白对原理的学习经验。
教材说:众所周知,一条直线在图像二维空间可由两个变量表示。
抱歉,小白还真不知道……即使学习过,这些年也早已经还给老师了。
一开始难道要学习笛卡尔坐标系,不,你低估小白的能力了,Python函数图像交点我第一个查询的是 θ 读作 西塔 ,是一个希腊字母。
什么是笛卡尔坐标系Python函数图像交点?
这个比较简单,直角坐标系。
斜率和截距
斜率,亦称“角系数”,表示一条直线相对于横坐标轴的倾斜程度。
一条直线与某平面直角坐标系横坐标轴正半轴方向的夹角的正切值即该直线相对于该坐标系的斜率。
如果直线与 x 轴互相垂直,直角的正切直无穷大,故此直线不存在斜率。
对于一次函数 y=kx+b , k 就是该函数图像的斜率。
在学习的时候,也学到如下内容:
截距:对 x 的截距就是 y=0 时, x 的值,对 y 的截距就是 x=0 时, y 的值,
截距就是直线与坐标轴的交点的横(纵)坐标。 x 截距为 a , y 截距 b ,截距式就是: x/a+y/b=1(a≠0且b≠0) 。
斜率:对于任意函数上任意一点,其斜率等于其切线与 x 轴正方向所成的角,即 k=tanα 。 ax+by+c=0中,k=-a/b 。
什么是极坐标系?
关于极坐标系,打开 百度百科 学习一下即可。
重点学到下面这个结论就行:
找资料的时候,发现一个解释的比较清楚的 博客 ,后续可以继续学习使用。
继续阅读资料,看到如下所示的图,这个图也出现在了很多解释原理的博客里面,但是图下面写了一句话
在这里直接蒙掉了,怎么就表示成极坐标系了?上面这个公式依旧是笛卡尔坐标系表示直线的方式呀,只是把 k 和 b 的值给替换掉了。
为何是这样的,具体原因可以参照下图。
centerchou 图/center
继续寻找关于霍夫变换的资料,找到一个新的概念 霍夫空间 。
在笛卡尔坐标系中,一条直线可以用公式 表示,其中 k 和 b 是参数,表示的是斜率和截距。
接下来将方程改写为 ,这时就建立了一个基于 k - b 的笛卡尔坐标系。
此时这个新的方程在 k - b 坐标系也有一个新的直线。
你可以在纸上画出这两个方程对应的线和点,如下图所示即可。
centerchou 图/center
新的 k - b 坐标系就叫做霍夫空间,这时得到一个结论,图像空间 x - y 中的点 对应了 霍夫空间 k - b 中的一条直线 ,即图像空间的点与霍夫空间的直线发生了对应关系。
如果在图像空间 x - y 中在增加一个点 ,那相应的该点在霍夫空间也会产生相同的点与线的对应关系,并且 A 点与 B 点产生的直线会在霍夫空间相交于一个点。而这个点的坐标值 就是直线 AB 的参数。
如果到这里你掌握了,这个性质就为我们解决直线检测提供了方法,只需要把图像空间的直线对应到霍夫空间的点,然后统计交点就可以达到目的,例如图像空间中有 3 条直线,那对应到霍夫空间就会有 3 个峰值点。
遍历图像空间中的所有点,将点转换到霍夫空间,形成大量直线,然后统计出直线交会的点,每个点的坐标都是图像空间直线方程参数,这时就能得到图像空间的直线了。
上述的内容没有问题,但是存在一种情况是,当直线趋近于垂直时,斜率 k 会趋近于无穷大,这时就没有办法转换了,解决办法是使用法线来表示直线。
上文提及的斜截式如下:
通过第二个公式,可以得到下述公式:
此时,我们可以带入一些数值进行转换。
图像空间有如下的几个点:
转换后的函数,都可以在霍夫空间 θ - ρ (横坐标是 θ ,纵坐标是 ρ )进行表示。
原理这时就比较清晰了:
除了一些数学知识以外,经典的博客我们也有必要记录一下,方便后面学习的时候,进行复盘。
本部分用于记录本文中提及的相关数学原理,后续还要逐步埋坑。
今天涉及了一点点数学知识,能力限制,大家一起学习,有错误的地方,可以在评论区指出,不胜感激。
希望今天的 1 个小时(今天内容有点多,不一定可以看完),你有所收获,我们下篇博客见~
相关阅读
技术专栏
逗趣程序员
Q3: python绘制函数图像
raw_input获取的输入是字符串,不能直接用np.array,需要用split进行切分,然后强制转化成数值类型,才能用plot函数
我把你的代码稍微修改了一下,可能不太漂亮,不过能运行了
x=[1,2,3]
a = raw_input('function')
a = a.split(' ')#依空格对字符串a进行切分,如果是用逗号分隔,则改成a.split(',')
b = []
for i in range(len(a)):#把切分好的字符强制转化成int类型,如果是小数,将int改为float
b.append(int(a[i]))
plt.plot(x, b, label='x', color="green", linewidth=1)
Q4: python绘图篇
1Python函数图像交点,xlable,ylable设置x,y轴Python函数图像交点的标题文字。
2,title设置标题。
3,xlim,ylim设置x,y轴显示范围。
plt.show()显示绘图窗口,通常情况下,show()会阻碍程序运行,带-wthread等参数的环境下,窗口不会关闭。
plt.saveFig()保存图像。
面向对象绘图
1,当前图表和子图可以用gcf(),gca()获得。
subplot()绘制包含多个图表的子图。
configure subplots,可调节子图与图表边框距离。
可以通过修改配置文件更改对象属性。
图标显示中文
1,在程序中直接指定字体。
2, 在程序开始修改配置字典reParams.
3,修改配置文件。
Artist对象
1,图标的绘制领域。
2,如何在FigureCanvas对象上绘图。
3,如何使用Renderer在FigureCanvas对象上绘图。
FigureCanvas和Render处理底层图像操作,Artist处理高层结构。
分为简单对象和容器对象,简单的Aritist是标准的绘图元件,例如Line 2D,Rectangle,Text,AxesImage等,而容器类型包含许多简单的的 Aritist对象,使他们构成一个整体,例如Axis,Axes,Figure等。
直接创建Artist对象进项绘图操作步奏:
1,创建Figure对象(通过figure()函数,会进行许多初始化操作,不建议直接创建。)
2,为Figure对象创建一个或多个Axes对象。
3,调用Axes对象的方法创建各类简单的Artist对象。
Figure容器
如何找到指定的Artist对象。
1,可调用add_subplot()和add_axes()方法向图表添加子图。
2,可使用for循环添加栅格。
3,可通过transform修改坐标原点。
Axes容器
1,patch修改背景。
2,包含坐标轴,坐标网格,刻度标签,坐标轴标题等内容。
3,get_ticklabels(),,get-ticklines获得刻度标签和刻度线。
1,可对曲线进行插值。
2,fill_between()绘制交点。
3,坐标变换。
4,绘制阴影。
5,添加注释。
1,绘制直方图的函数是
2,箱线图(Boxplot)也称箱须图(Box-whisker Plot),是利用数据中的五个统计量:最小值、第一四分位
数、中位数、第三四分位数与最大值来描述数据的一种方法,它可以粗略地看出数据是否具有对称性以及分
布的分散程度等信息,特别可以用于对几个样本的比较。
3,饼图就是把一个圆盘按所需表达变量的观察数划分为若干份,每一份的角度(即面积)等价于每个观察
值的大小。
4,散点图
5,QQ图
低层绘图函数
类似于barplot(),dotchart()和plot()这样的函数采用低层的绘图函数来画线和点,来表达它们在页面上放置的位置以及其他各种特征。
在这一节中,我们会描述一些低层的绘图函数,用户也可以调用这些函数用于绘图。首先我们先讲一下R怎么描述一个页面Python函数图像交点;然后我们讲怎么在页面上添加点,线和文字Python函数图像交点;最后讲一下怎么修改一些基本的图形。
绘图区域与边界
R在绘图时,将显示区域划分为几个部分。绘制区域显示了根据数据描绘出来的图像,在此区域内R根据数据选择一个坐标系,通过显示出来的坐标轴可以看到R使用的坐标系。在绘制区域之外是边沿区,从底部开始按顺时针方向分别用数字1到4表示。文字和标签通常显示在边沿区域内,按照从内到外的行数先后显示。
添加对象
在绘制的图像上还可以继续添加若干对象,下面是几个有用的函数,以及对其功能的说明。
•points(x, y, ...),添加点
•lines(x, y, ...),添加线段
•text(x, y, labels, ...),添加文字
•abline(a, b, ...),添加直线y=a+bx
•abline(h=y, ...),添加水平线
•abline(v=x, ...),添加垂直线
•polygon(x, y, ...),添加一个闭合的多边形
•segments(x0, y0, x1, y1, ...),画线段
•arrows(x0, y0, x1, y1, ...),画箭头
•symbols(x, y, ...),添加各种符号
•legend(x, y, legend, ...),添加图列说明
Q5: Python matplotlib之函数图像绘制、线条rc参数设置
为避免中文显示出错,需导入matplotlib.pylab库
1.2.1 确定数据
1.2.2 创建画布
1.2.3 添加标题
1.2.4 添加x,y轴名称
1.2.5 添加x,y轴范围
1.2.6 添加x,y轴刻度
1.2.7 绘制曲线、图例, 并保存图片
保存图片时,dpi为清晰度,数值越高越清晰。请注意,函数结尾处,必须加plt.show(),不然图像不显示。
绘制流程与绘制不含子图的图像一致,只需注意一点:创建画布。
合理调整figsize、dpi,可避免出现第一幅图横轴名称与第二幅图标题相互遮盖的现象.
2.2.1 rc参数类型
2.2.2 方法1:使用rcParams设置
2.2.3 方法2:plot内设置
2.2.4 方法3:plot内简化设置
方法2中,线条形状,linestyle可简写为ls;线条宽度,linewidth可简写为lw;线条颜色,color可简写为c,等等。
Python函数图像交点的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python画数学函数图像、Python函数图像交点的信息别忘了在本站进行查找喔。







