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

摘要:
今天打算通过绘制正弦和余弦函数,从默认的设置开始,一步一步地调整改进,让它变得好看,变成我们初高中学习过的图象那样。简单绘图matplotlib有一套允许定制各种属性的默认设置。t=2*np.pi/3郑州专业妇科医院http://www.hnzzkd.com/#利用plt.plot绘制向下的一条垂直的线,利用plt.scatter绘制一个点。

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

简单绘图

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

安装

pip install matplotlib

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

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

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是啥意思?我查了下官网。解释如下

在这里插入图片描述

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

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

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

show image

04. 添加注释

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

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

t = 2*np.pi/3郑州专业妇科医院 http://www.hnzzkd.com/

# 利用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{2pi}{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{2pi}{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 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{2pi}{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{2pi}{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绘制正余弦函数图像的方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php 内存管理使用Roslyn脚本化C#代码,C#动态脚本实现方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

通过案例理解position:relative和position:absolute

w3school过了HTML的知识之后,觉得要自己单纯地去啃知识点有点枯燥,然后自己也很容易忘记,所以便找具体的网站练手便补上不懂的知识点。position:relative和postion:absolute困扰了我快一个星期之久,网上找到的资料鱼龙混杂,刚确定“这样”的理解之后,看另一份资料,发现“这样”理解是错了,就这样不断更正,并记录下来,最终整理出...

js 实现向下滑动页面时遇顶固定

达到的页面效果: html: <link href="http://t.zoukankan.com/Scripts/weui/reset.css" rel="stylesheet" /> <link href="http://t.zoukankan.com/Scripts/weui/calendar.css" rel="stylesh...

使用Unity实现VR中在黑板上写字(升级篇)(一)-----解决画笔穿透画板的问题

一、概述: 在使用Unity实现VR中在黑板上写字(初级篇)中的最后留下了一些有待完善的地方,首先完善画笔穿透画板的问题; 在之前使用画笔会出现这种情况: 可以看到画笔是穿透了画板,这样在VR中会给用户很差的体验,而且因为代码的原因会造成画的过程中中断,所以这个问题必须解决; 解决后的使用情况: 可以看到现在不会穿透了,而且画起来不会有中断,其实我的手...

移动端1px解决方案

移动端1px解决方案 作者:empty@毛豆前端 前言 移动端web项目越来越多,设计师对于UI的要求也越来越高,比如1px 的边框。在高清屏下,移动端的1px 会很粗。 比如,这个是假的1像素 这个是真的1像素 一、产生原因 那么为什么会产生这个问题呢?主要是跟一个东西有关,DPR(devicePixelRatio) 设备像素比,它是默认缩放为100...

Elasticsearch 建立ik中文分词器和自定义分词

一、建立ik中文分词器 1、下载ik中文分词器 进入https://github.com/medcl/elasticsearch-analysis-ik 使用第一种方式安装,进入https://github.com/medcl/elasticsearch-analysis-ik/releases 选择版本7.4.2 。和ES7.4.2的版本保持一致。...

使用jsPlumb插件实现动态连线功能

这周去看了两天的羽毛球亚锦赛,工作有提前晚上加班做一些,但是技术文章却拉下了。这段时间一直在寻找可以实现前端元素动态连线的功能,找了好几个库,考虑过用d3或者原生svg和canvas来实现,最后和同项目的同事商量后决定使用jsPlumb插件库来做。jsPlumb是一个强大的JavaScript连线库,它可以将html中的元素用箭头、曲线、直线等连接起...