侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python绘制正余弦函数图像的方法

Python  /  管理员 发布于 7年前   407

今天打算通过绘制正弦和余弦函数,从默认的设置开始,一步一步地调整改进,让它变得好看,变成我们初高中学习过的图象那样。通过这个过程来学习如何进行对图表的一些元素的进行调整。

01. 简单绘图

matplotlib有一套允许定制各种属性的默认设置。你可以几乎控制matplotlib中的每一个默认属性:图像大小,每英寸点数,线宽,色彩和样式,子图(axes),坐标轴和网格属性,文字和字体属性,等等。

安装

pip install matplotlib 

虽然matplotlib的默认设置在大多数情况下相当好,你却可能想要在一些特别的情形下更改一些属性。

from pylab import *x = np.linspace(-np.pi, np.pi, 256,endpoint=True)C,S = np.cos(x), np.sin(x)plot(x,C)plot(x,S)show()

show image

02. 设置基本元素

这边的基本元素主要有几下几点:

线的颜色,粗细,和线型 刻度和标签 还有图例

代码比较简单,基本上在我的第一讲内容里都讲过了。

import numpy as npfrom matplotlib import pyplot as pltplt.figure(figsize=(10,6), dpi=80)x = np.linspace(-np.pi, np.pi, 256,endpoint=True)C,S = np.cos(x), np.sin(x)# 设置线的颜色,粗细,和线型plt.plot(x, C, color="blue", linewidth=2.5, linestyle="-", label=r'$sin(x)$')plt.plot(x, S, color="red", linewidth=2.5, linestyle="-", label=r'$cos(x)$')# 如果觉得线条离边界太近了,可以加大距离plt.xlim(x.min()*1.2, x.max()*1.2)plt.ylim(C.min()*1.2, C.max()*1.2)# 当前的刻度并不清晰,需要重新设定,并加上更直观的标签plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],   [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])plt.yticks([-1,0,1],   [r'$-1$', r'$0$', r'$1$'])# 添加图例plt.legend()plt.show()

show image

03. 移动轴线

还记得我们在初高中学习的三角函数图象,可不是这样,它应该是有四个象限的。而这里却是一个四四方方的图表。

所以接下来,我们要做的就是移动轴线,让它变成我们熟悉的样子。

我们只需要两轴线(x和y轴),所以我们需要将顶部和右边的轴线给隐藏起来(颜色设置为None即可)。

# plt.gca(),全称是get current axisax = plt.gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')# 由于我们移动的是左边和底部的轴,所以不用设置这两个也可以ax.xaxis.set_ticks_position('bottom')ax.yaxis.set_ticks_position('left')# 指定data类型,就是移动到指定数值ax.spines['bottom'].set_position(('data',0))ax.spines['left'].set_position(('data',0))

关于 set_position() 这个函数中的data是啥意思?我查了下官网。解释如下

然后最后发现,上面的写法可以用一定更简洁的方式设置,是等价的。

ax.spines['bottom'].set_position('zero')ax.spines['left'].set_position('zero')

show image

04. 添加注释

现在的图形部分已经成型,接下让我们现在使用annotate命令注解一些我们感兴趣的点。

我们选择 2π/3 作为我们想要注解的正弦和余弦值。我们将在曲线上做一个标记和一个垂直的虚线。然后,使用annotate命令来显示一个箭头和一些文本。

t = 2*np.pi/3# 利用plt.plot绘制向下的一条垂直的线,利用plt.scatter绘制一个点。plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")plt.scatter([t,],[np.cos(t),], 50, color ='blue')plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',   xy=(t, np.sin(t)), xycoords='data',   xytext=(+10, +30), textcoords='offset points', fontsize=16,   arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))# 利用plt.plot绘制向上的一条垂直的线,利用plt.scatter绘制一个点。plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")plt.scatter([t,],[np.sin(t),], 50, color ='red')plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',   xy=(t, np.cos(t)), xycoords='data',   xytext=(-90, -50), textcoords='offset points', fontsize=16,   arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

在这里,你可能会对 plt.annotate 这个函数的用法,有所陌生。这里也解释一下。

第一个参数,就是注释内容; 第二个参数, xy ,就是对哪一点进行注释; 第三个参数, xycoords ,指定类型,data 是说基于数值来定位; 第四个参数, xytext ,是注释的位置,结合第五个参数,就是根据偏移量来决定注释位置; 第五个参数, textcoords ,值为offset points,就是说是相对位置; 第六个参数, fontsize ,注释大小; 第七个参数, arrowprops ,对箭头的类型的一些设置。

show image

05. 完整代码

以上都是对片段代码进行解释,这里放出完整的代码

import numpy as npfrom matplotlib import pyplot as pltplt.figure(figsize=(10,6), dpi=80)x = np.linspace(-np.pi, np.pi, 256,endpoint=True)C,S = np.cos(x), np.sin(x)# 设置线的颜色,粗细,和线型plt.plot(x, C, color="blue", linewidth=2.5, linestyle="-", label=r'$sin(x)$')plt.plot(x, S, color="red", linewidth=2.5, linestyle="-", label=r'$cos(x)$')# 如果觉得线条离边界太近了,可以加大距离plt.xlim(x.min()*1.2, x.max()*1.2)plt.ylim(C.min()*1.2, C.max()*1.2)# 当前的刻度并不清晰,需要重新设定,并加上更直观的标签plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],   [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])plt.yticks([-1,1],   [r'$-1$', r'$1$'])# 添加图例plt.legend(loc='upper left')# plt.gca(),全称是get current axisax = plt.gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')# 由于我们移动的是左边和底部的轴,所以不用设置这两个也可以ax.xaxis.set_ticks_position('bottom')ax.yaxis.set_ticks_position('left')# 指定data类型,就是移动到指定数值# ax.spines['bottom'].set_position('zero')ax.spines['bottom'].set_position(('data',0))ax.spines['left'].set_position(('data',0))t = 2*np.pi/3# 利用plt.plot绘制向下的一条垂直的线,利用plt.scatter绘制一个点。plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")plt.scatter([t,],[np.cos(t),], 50, color ='blue')plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',   xy=(t, np.sin(t)), xycoords='data',   xytext=(+10, +30), textcoords='offset points', fontsize=16,   arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))# 利用plt.plot绘制向上的一条垂直的线,利用plt.scatter绘制一个点。plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")plt.scatter([t,],[np.sin(t),], 50, color ='red')plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',   xy=(t, np.cos(t)), xycoords='data',   xytext=(-90, -50), textcoords='offset points', fontsize=16,   arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))plt.show()

绘制抛物线:

X1=np.linspace(-4,4,100,endpoint=True)plt.plot(X1,(X1**2)/9)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python实现遍历文件夹修改文件后缀
    下一条:
    Python logging模块用法示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客