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


Posted in Python onAugust 28, 2018

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

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

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

02. 设置基本元素

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

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

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

import numpy as np
from matplotlib import pyplot as plt

plt.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

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

03. 移动轴线

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

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

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

# plt.gca(),全称是get current axis
ax = 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是啥意思?我查了下官网。解释如下

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

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

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

show image

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

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

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

05. 完整代码

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

import numpy as np
from matplotlib import pyplot as plt

plt.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 axis
ax = 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中的greenlet包实现并发编程的入门教程
Apr 16 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python中单、双下划线的区别总结
Dec 01 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
python实现支付宝转账接口
May 07 Python
Python从函数参数类型引出元组实例分析
May 28 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
python破解同事的压缩包密码
Oct 14 Python
Python logging模块用法示例
Aug 28 #Python
Python异常处理操作实例详解
Aug 28 #Python
Python封装原理与实现方法详解
Aug 28 #Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 #Python
python中cPickle类使用方法详解
Aug 27 #Python
python散点图实例之随机漫步
Aug 27 #Python
python3.5绘制随机漫步图
Aug 27 #Python
You might like
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
React 组件间的通信示例
2018/06/14 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
Python 获取项目根路径的代码
2019/09/27 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
python判断变量是否为列表的方法
2020/09/17 Python
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
数据库方面面试题
2012/04/22 面试题
毕业生个人求职信范文分享
2014/01/05 职场文书
班组长安全工作职责
2014/07/15 职场文书
2014年卫生工作总结
2014/11/27 职场文书
2015年化验员工作总结
2015/04/10 职场文书
小学生手册家长意见
2015/06/03 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
Django与数据库交互的实现
2021/06/03 Python
SpringBoot快速入门详解
2021/07/21 Java/Android